Skip to content

Commit

Permalink
timer stats: speedups
Browse files Browse the repository at this point in the history
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 <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Ingo Molnar authored and Linus Torvalds committed Jun 1, 2007
1 parent 9fcc15e commit c1a834d
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 5 deletions.
7 changes: 4 additions & 3 deletions Documentation/hrtimer/timer_stats.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ timer_stats - timer usage statistics
------------------------------------

timer_stats is a debugging facility to make the timer (ab)usage in a Linux
system visible to kernel and userspace developers. It is not intended for
production usage as it adds significant overhead to the (hr)timer code and the
(hr)timer data structures.
system visible to kernel and userspace developers. If enabled in the config
but not used it has almost zero runtime overhead, and a relatively small
data structure overhead. Even if collection is enabled runtime all the
locking is per-CPU and lookup is hashed.

timer_stats should be used by kernel and userspace developers to verify that
their code does not make unduly use of timers. This helps to avoid unnecessary
Expand Down
7 changes: 6 additions & 1 deletion kernel/time/timer_stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,10 +236,15 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
/*
* It doesnt matter which lock we take:
*/
spinlock_t *lock = &per_cpu(lookup_lock, raw_smp_processor_id());
spinlock_t *lock;
struct entry *entry, input;
unsigned long flags;

if (likely(!active))
return;

lock = &per_cpu(lookup_lock, raw_smp_processor_id());

input.timer = timer;
input.start_func = startf;
input.expire_func = timerf;
Expand Down
5 changes: 4 additions & 1 deletion lib/Kconfig.debug
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,10 @@ config TIMER_STATS
reprogrammed. The statistics can be read from /proc/timer_stats.
The statistics collection is started by writing 1 to /proc/timer_stats,
writing 0 stops it. This feature is useful to collect information
about timer usage patterns in kernel and userspace.
about timer usage patterns in kernel and userspace. This feature
is lightweight if enabled in the kernel config but not activated
(it defaults to deactivated on bootup and will only be activated
if some application like powertop activates it explicitly).

config DEBUG_SLAB
bool "Debug slab memory allocations"
Expand Down

0 comments on commit c1a834d

Please sign in to comment.