aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2009-06-24 15:11:59 -0400
committerIngo Molnar <mingo@elte.hu>2009-06-25 15:39:07 -0400
commitbfbd3381e63aa2a14c6706afb50ce4630aa0d9a2 (patch)
tree9b165a3068b8a7976ea34e633013165855bb5f51 /include/linux
parent38b200d67636a30cb8dc1508137908e7a649b5c9 (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/linux')
-rw-r--r--include/linux/perf_counter.h4
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