On 09/02/15 09:28, Will Deacon wrote:
On Sun, Feb 08, 2015 at 12:02:37PM +0000, Daniel Thompson wrote:
Currently sched_clock(), a very hot code path, is not optimized to minimise its cache profile. In particular:
cd is not ____cacheline_aligned,
struct clock_data does not distinguish between hotpath and coldpath data, reducing locality of reference in the hotpath,
Some hotpath data is missing from struct clock_data and is marked __read_mostly (which more or less guarantees it will not share a cache line with cd).
This patch corrects these problems by extracting all hotpath data into a separate structure and using ____cacheline_aligned to ensure the hotpath uses a single (64 byte) cache line.
Have you got any performance figures for this change, or is this just a theoretical optimisation? It would be interesting to see what effect this has on systems with 32-byte cachelines and also scenarios where there's contention on the sequence counter.
Most of my testing has focused on proving the NMI safety parts of the patch work as advertised so its mostly theoretical.
However there are some numbers from simple tight loop calls to sched_clock (Stephen Boyd's results are more interesting than mine because I observe pretty wild quantization effects that render the results hard to trust): http://thread.gmane.org/gmane.linux.kernel/1871157/focus=1879265
Not sure what useful figures would be useful for a contended sequence counter. Firstly the counter is taken for write at 7/8 wrap time of the times so even for the fastest timers the interval is likely to be >3s and is very short duration. Additionally, the NMI safety changes make it possible to read the timer whilst it is being updated so it is only during the very short struct-copy/write/struct-copy/write update sequence that we will observe the extra cache line used for a read. Benchmarks that show the effect of update are therefore non-trivial to construct.