diff options
-rw-r--r-- | Documentation/hrtimer/timer_stats.txt | 7 | ||||
-rw-r--r-- | kernel/time/timer_stats.c | 7 | ||||
-rw-r--r-- | lib/Kconfig.debug | 5 |
3 files changed, 14 insertions, 5 deletions
diff --git a/Documentation/hrtimer/timer_stats.txt b/Documentation/hrtimer/timer_stats.txt index 27f782e3593f..22b0814d0ad0 100644 --- a/Documentation/hrtimer/timer_stats.txt +++ b/Documentation/hrtimer/timer_stats.txt | |||
@@ -2,9 +2,10 @@ timer_stats - timer usage statistics | |||
2 | ------------------------------------ | 2 | ------------------------------------ |
3 | 3 | ||
4 | timer_stats is a debugging facility to make the timer (ab)usage in a Linux | 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 | 5 | system visible to kernel and userspace developers. If enabled in the config |
6 | production usage as it adds significant overhead to the (hr)timer code and the | 6 | but not used it has almost zero runtime overhead, and a relatively small |
7 | (hr)timer data structures. | 7 | data structure overhead. Even if collection is enabled runtime all the |
8 | locking is per-CPU and lookup is hashed. | ||
8 | 9 | ||
9 | timer_stats should be used by kernel and userspace developers to verify that | 10 | timer_stats should be used by kernel and userspace developers to verify that |
10 | their code does not make unduly use of timers. This helps to avoid unnecessary | 11 | their code does not make unduly use of timers. This helps to avoid unnecessary |
diff --git a/kernel/time/timer_stats.c b/kernel/time/timer_stats.c index fa3d380ca8c0..321693724ad7 100644 --- a/kernel/time/timer_stats.c +++ b/kernel/time/timer_stats.c | |||
@@ -236,10 +236,15 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf, | |||
236 | /* | 236 | /* |
237 | * It doesnt matter which lock we take: | 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 | struct entry *entry, input; | 240 | struct entry *entry, input; |
241 | unsigned long flags; | 241 | unsigned long flags; |
242 | 242 | ||
243 | if (likely(!active)) | ||
244 | return; | ||
245 | |||
246 | lock = &per_cpu(lookup_lock, raw_smp_processor_id()); | ||
247 | |||
243 | input.timer = timer; | 248 | input.timer = timer; |
244 | input.start_func = startf; | 249 | input.start_func = startf; |
245 | input.expire_func = timerf; | 250 | input.expire_func = timerf; |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 1ba77ca7d165..da95e10cfd70 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -126,7 +126,10 @@ config TIMER_STATS | |||
126 | reprogrammed. The statistics can be read from /proc/timer_stats. | 126 | reprogrammed. The statistics can be read from /proc/timer_stats. |
127 | The statistics collection is started by writing 1 to /proc/timer_stats, | 127 | The statistics collection is started by writing 1 to /proc/timer_stats, |
128 | writing 0 stops it. This feature is useful to collect information | 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 | config DEBUG_SLAB | 134 | config DEBUG_SLAB |
132 | bool "Debug slab memory allocations" | 135 | bool "Debug slab memory allocations" |