Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753333AbZGTKl2 (ORCPT ); Mon, 20 Jul 2009 06:41:28 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751846AbZGTKl0 (ORCPT ); Mon, 20 Jul 2009 06:41:26 -0400 Received: from bilbo.ozlabs.org ([203.10.76.25]:40072 "EHLO bilbo.ozlabs.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751822AbZGTKl0 (ORCPT ); Mon, 20 Jul 2009 06:41:26 -0400 Date: Mon, 20 Jul 2009 20:38:25 +1000 From: Anton Blanchard To: a.p.zijlstra@chello.nl, mingo@elte.hu, paulus@samba.org Cc: linux-kernel@vger.kernel.org Subject: [PATCH] perf_counter: Always return the parent counter id to userspace Message-ID: <20090720103825.GA9029@kryten> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3061 Lines: 109 When inheriting counters new tasks get new counter ids. Since userspace only knows about the parent ids we need to return them and not the actual ids. Signed-off-by: Anton Blanchard --- Index: linux.trees.git/kernel/perf_counter.c =================================================================== --- linux.trees.git.orig/kernel/perf_counter.c 2009-07-20 20:17:44.000000000 +1000 +++ linux.trees.git/kernel/perf_counter.c 2009-07-20 20:36:13.000000000 +1000 @@ -154,6 +154,20 @@ } } +/* + * If we inherit counters we want to return the parent counter id + * to userspace. + */ +static u64 primary_counter_id(struct perf_counter *counter) +{ + u64 id = counter->id; + + if (counter->parent) + id = counter->parent->id; + + return id; +} + /* * Get the perf_counter_context for a task and lock it. * This has to cope with with the fact that until it is locked, @@ -1705,7 +1719,7 @@ values[n++] = counter->total_time_running + atomic64_read(&counter->child_total_time_running); if (counter->attr.read_format & PERF_FORMAT_ID) - values[n++] = counter->id; + values[n++] = primary_counter_id(counter); mutex_unlock(&counter->child_mutex); if (count < n * sizeof(u64)) @@ -2548,7 +2562,7 @@ lost_event.header.type = PERF_EVENT_LOST; lost_event.header.misc = 0; lost_event.header.size = sizeof(lost_event); - lost_event.id = counter->id; + lost_event.id = primary_counter_id(counter); lost_event.lost = atomic_xchg(&data->lost, 0); perf_output_put(handle, lost_event); @@ -2704,8 +2718,10 @@ if (sample_type & PERF_SAMPLE_ADDR) perf_output_put(&handle, data->addr); - if (sample_type & PERF_SAMPLE_ID) - perf_output_put(&handle, counter->id); + if (sample_type & PERF_SAMPLE_ID) { + u64 id = primary_counter_id(counter); + perf_output_put(&handle, id); + } if (sample_type & PERF_SAMPLE_CPU) perf_output_put(&handle, cpu_entry); @@ -2727,7 +2743,7 @@ if (sub != counter) sub->pmu->read(sub); - group_entry.id = sub->id; + group_entry.id = primary_counter_id(sub); group_entry.counter = atomic64_read(&sub->count); perf_output_put(&handle, group_entry); @@ -2790,11 +2806,7 @@ u64 id; event.header.size += sizeof(u64); - if (counter->parent) - id = counter->parent->id; - else - id = counter->id; - + id = primary_counter_id(counter); event.format[i++] = id; } @@ -3209,7 +3221,7 @@ .size = sizeof(event), }, .time = sched_clock(), - .id = counter->id, + .id = primary_counter_id(counter), .period = period, }; @@ -3241,7 +3253,7 @@ .size = sizeof(throttle_event), }, .time = sched_clock(), - .id = counter->id, + .id = primary_counter_id(counter), }; ret = perf_output_begin(&handle, counter, sizeof(throttle_event), 1, 0); -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/