perf: Add perf_event::child_count
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Fri, 21 May 2010 12:27:58 +0000 (14:27 +0200)
committerIngo Molnar <mingo@elte.hu>
Wed, 9 Jun 2010 09:12:37 +0000 (11:12 +0200)
Only child counters adding back their values into the parent counter
are responsible for cross-cpu updates to event->count.

So if we pull that out into a new child_count variable, we get an
event->count that is only modified locally.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
include/linux/perf_event.h
kernel/perf_event.c

index 441992a..f34dab9 100644 (file)
@@ -671,6 +671,7 @@ struct perf_event {
        enum perf_event_active_state    state;
        unsigned int                    attach_state;
        atomic64_t                      count;
+       atomic64_t                      child_count;
 
        /*
         * These are the total time in nanoseconds that the event
index ab4c0ff..a395fda 100644 (file)
@@ -1738,7 +1738,7 @@ static void __perf_event_read(void *info)
 
 static inline u64 perf_event_count(struct perf_event *event)
 {
-       return atomic64_read(&event->count);
+       return atomic64_read(&event->count) + atomic64_read(&event->child_count);
 }
 
 static u64 perf_event_read(struct perf_event *event)
@@ -5379,7 +5379,7 @@ static void sync_child_event(struct perf_event *child_event,
        /*
         * Add back the child's count to the parent's count:
         */
-       atomic64_add(child_val, &parent_event->count);
+       atomic64_add(child_val, &parent_event->child_count);
        atomic64_add(child_event->total_time_enabled,
                     &parent_event->child_total_time_enabled);
        atomic64_add(child_event->total_time_running,