From a259de03202e89fef707b7c30efd5852fef5a03c Mon Sep 17 00:00:00 2001 From: Eric B Munson Date: Fri, 24 Jun 2011 12:26:26 -0400 Subject: [PATCH] --- yaml --- r: 257062 b: refs/heads/master c: 0d6412085b7ff58612af52e51ffa864f0df4b8fd h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/events/core.c | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 85f11122d148..256cbb467186 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c4794295917ebeda8013b6cb9c8d71ab4f74a1fa +refs/heads/master: 0d6412085b7ff58612af52e51ffa864f0df4b8fd diff --git a/trunk/kernel/events/core.c b/trunk/kernel/events/core.c index c851d707821f..270e32f9fc06 100644 --- a/trunk/kernel/events/core.c +++ b/trunk/kernel/events/core.c @@ -3372,8 +3372,19 @@ void perf_event_update_userpage(struct perf_event *event) { struct perf_event_mmap_page *userpg; struct ring_buffer *rb; + u64 enabled, running; rcu_read_lock(); + /* + * compute total_time_enabled, total_time_running + * based on snapshot values taken when the event + * was last scheduled in. + * + * we cannot simply called update_context_time() + * because of locking issue as we can be called in + * NMI context + */ + calc_timer_values(event, &enabled, &running); rb = rcu_dereference(event->rb); if (!rb) goto unlock; @@ -3392,10 +3403,10 @@ void perf_event_update_userpage(struct perf_event *event) if (event->state == PERF_EVENT_STATE_ACTIVE) userpg->offset -= local64_read(&event->hw.prev_count); - userpg->time_enabled = event->total_time_enabled + + userpg->time_enabled = enabled + atomic64_read(&event->child_total_time_enabled); - userpg->time_running = event->total_time_running + + userpg->time_running = running + atomic64_read(&event->child_total_time_running); barrier();