timer stats: speedups

Make timer-stats have almost zero overhead when enabled in the config but
not used. (this way distros can enable it more easily)

Also update the documentation about overhead of timer_stats - it was
written for the first version which had a global lock and a linear list
walk based lookup ;-)

Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Ingo Molnar and committed by Linus Torvalds c1a834dc 9fcc15ec

+14 -5
+4 -3
Documentation/hrtimer/timer_stats.txt
··· 2 2 ------------------------------------ 3 3 4 4 timer_stats is a debugging facility to make the timer (ab)usage in a Linux 5 - system visible to kernel and userspace developers. It is not intended for 6 - production usage as it adds significant overhead to the (hr)timer code and the 7 - (hr)timer data structures. 5 + system visible to kernel and userspace developers. If enabled in the config 6 + but not used it has almost zero runtime overhead, and a relatively small 7 + data structure overhead. Even if collection is enabled runtime all the 8 + locking is per-CPU and lookup is hashed. 8 9 9 10 timer_stats should be used by kernel and userspace developers to verify that 10 11 their code does not make unduly use of timers. This helps to avoid unnecessary
+6 -1
kernel/time/timer_stats.c
··· 236 236 /* 237 237 * It doesnt matter which lock we take: 238 238 */ 239 - spinlock_t *lock = &per_cpu(lookup_lock, raw_smp_processor_id()); 239 + spinlock_t *lock; 240 240 struct entry *entry, input; 241 241 unsigned long flags; 242 + 243 + if (likely(!active)) 244 + return; 245 + 246 + lock = &per_cpu(lookup_lock, raw_smp_processor_id()); 242 247 243 248 input.timer = timer; 244 249 input.start_func = startf;
+4 -1
lib/Kconfig.debug
··· 126 126 reprogrammed. The statistics can be read from /proc/timer_stats. 127 127 The statistics collection is started by writing 1 to /proc/timer_stats, 128 128 writing 0 stops it. This feature is useful to collect information 129 - about timer usage patterns in kernel and userspace. 129 + about timer usage patterns in kernel and userspace. This feature 130 + is lightweight if enabled in the kernel config but not activated 131 + (it defaults to deactivated on bootup and will only be activated 132 + if some application like powertop activates it explicitly). 130 133 131 134 config DEBUG_SLAB 132 135 bool "Debug slab memory allocations"