diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2009-06-24 15:11:59 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-06-25 15:39:07 -0400 |
commit | bfbd3381e63aa2a14c6706afb50ce4630aa0d9a2 (patch) | |
tree | 9b165a3068b8a7976ea34e633013165855bb5f51 /include | |
parent | 38b200d67636a30cb8dc1508137908e7a649b5c9 (diff) |
perf_counter: Implement more accurate per task statistics
With the introduction of PERF_EVENT_READ we have the
possibility to provide accurate counter values for
individual tasks in a task hierarchy.
However, due to the lazy context switching used for similar
counter contexts our current per task counts are way off.
In order to maintain some of the lazy switch benefits we
don't disable it out-right, but simply iterate the active
counters and flip the values between the contexts.
This only reads the counters but does not need to reprogram
the full PMU.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/perf_counter.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h index 6a384f04755a..de70a10b5ec8 100644 --- a/include/linux/perf_counter.h +++ b/include/linux/perf_counter.h | |||
@@ -178,8 +178,9 @@ struct perf_counter_attr { | |||
178 | mmap : 1, /* include mmap data */ | 178 | mmap : 1, /* include mmap data */ |
179 | comm : 1, /* include comm data */ | 179 | comm : 1, /* include comm data */ |
180 | freq : 1, /* use freq, not period */ | 180 | freq : 1, /* use freq, not period */ |
181 | inherit_stat : 1, /* per task counts */ | ||
181 | 182 | ||
182 | __reserved_1 : 53; | 183 | __reserved_1 : 52; |
183 | 184 | ||
184 | __u32 wakeup_events; /* wakeup every n events */ | 185 | __u32 wakeup_events; /* wakeup every n events */ |
185 | __u32 __reserved_2; | 186 | __u32 __reserved_2; |
@@ -602,6 +603,7 @@ struct perf_counter_context { | |||
602 | int nr_counters; | 603 | int nr_counters; |
603 | int nr_active; | 604 | int nr_active; |
604 | int is_active; | 605 | int is_active; |
606 | int nr_stat; | ||
605 | atomic_t refcount; | 607 | atomic_t refcount; |
606 | struct task_struct *task; | 608 | struct task_struct *task; |
607 | 609 | ||