From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932947Ab2GBUTV (ORCPT ); Mon, 2 Jul 2012 16:19:21 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54941 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932878Ab2GBUTS (ORCPT ); Mon, 2 Jul 2012 16:19:18 -0400 Message-ID: <4FF2023A.7040008@redhat.com> Date: Mon, 02 Jul 2012 16:19:06 -0400 From: William Cohen User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.5) Gecko/20120601 Thunderbird/10.0.5 MIME-Version: 1.0 To: Robert Richter CC: Will Deacon , "linux-kernel@vger.kernel.org" , Matt Fleming Subject: Re: [PATCH] oprofile, perf: Use per-cpu framework References: <1339168564-30008-1-git-send-email-will.deacon@arm.com> <20120615154359.GE12031@mudshark.cambridge.arm.com> <20120615161635.GV1478@erda.amd.com> <20120615161954.GF12031@mudshark.cambridge.arm.com> <20120622144231.GJ24632@erda.amd.com> In-Reply-To: <20120622144231.GJ24632@erda.amd.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 06/22/2012 10:42 AM, Robert Richter wrote: > Will, > > On 15.06.12 17:19:54, Will Deacon wrote: >> On Fri, Jun 15, 2012 at 05:16:35PM +0100, Robert Richter wrote: >>> On 15.06.12 16:43:59, Will Deacon wrote: >>>> Given both the lack of feedback and the trivial nature of this patch would >>>> you be able to pick this up please? I'd rather not push it via the ARM tree >>>> as the change is under drivers/. >>> >>> Will, I will apply it. Sorry for not responding earlier. > > I just realized I wrote a patch some time ago that introduces per_cpu > variables, see below. Please give it a try to, I will then queue it > for v3.6. > > Your patch should go upstream anyway to make it into stable trees. > > Thanks, > > -Robert Hi Robert, I was able to build a linux-3.5.0-rc5+ kernel with this patch and the following troublesome config entry enabled: CONFIG_DEBUG_PER_CPU_MAPS=y The resulting kernel ran and oprofile functioned fine on a compulab trimslice machine. -Will > > > From f8bbfd7d28303967ca4e8597de9bdc9bf8b197e7 Mon Sep 17 00:00:00 2001 > From: Robert Richter > Date: Thu, 23 Feb 2012 17:07:06 +0100 > Subject: [PATCH] oprofile, perf: Use per-cpu framework > > This changes oprofile_perf.c to use the per-cpu framework. > > Using the per-cpu framework should avoid error like the following: > > arch/arm/oprofile/../../../drivers/oprofile/oprofile_perf.c:28:28: error: variably modified 'perf_events' at file scope > > Reported-by: William Cohen > Cc: Will Deacon > Signed-off-by: Robert Richter > --- > drivers/oprofile/oprofile_perf.c | 23 +++++++++++------------ > 1 files changed, 11 insertions(+), 12 deletions(-) > > diff --git a/drivers/oprofile/oprofile_perf.c b/drivers/oprofile/oprofile_perf.c > index efc4b7f..f3cfa0b 100644 > --- a/drivers/oprofile/oprofile_perf.c > +++ b/drivers/oprofile/oprofile_perf.c > @@ -1,5 +1,6 @@ > /* > * Copyright 2010 ARM Ltd. > + * Copyright 2012 Advanced Micro Devices, Inc., Robert Richter > * > * Perf-events backend for OProfile. > */ > @@ -25,7 +26,7 @@ static int oprofile_perf_enabled; > static DEFINE_MUTEX(oprofile_perf_mutex); > > static struct op_counter_config *counter_config; > -static struct perf_event **perf_events[NR_CPUS]; > +static DEFINE_PER_CPU(struct perf_event **, perf_events); > static int num_counters; > > /* > @@ -38,7 +39,7 @@ static void op_overflow_handler(struct perf_event *event, > u32 cpu = smp_processor_id(); > > for (id = 0; id < num_counters; ++id) > - if (perf_events[cpu][id] == event) > + if (per_cpu(perf_events, cpu)[id] == event) > break; > > if (id != num_counters) > @@ -74,7 +75,7 @@ static int op_create_counter(int cpu, int event) > { > struct perf_event *pevent; > > - if (!counter_config[event].enabled || perf_events[cpu][event]) > + if (!counter_config[event].enabled || per_cpu(perf_events, cpu)[event]) > return 0; > > pevent = perf_event_create_kernel_counter(&counter_config[event].attr, > @@ -91,18 +92,18 @@ static int op_create_counter(int cpu, int event) > return -EBUSY; > } > > - perf_events[cpu][event] = pevent; > + per_cpu(perf_events, cpu)[event] = pevent; > > return 0; > } > > static void op_destroy_counter(int cpu, int event) > { > - struct perf_event *pevent = perf_events[cpu][event]; > + struct perf_event *pevent = per_cpu(perf_events, cpu)[event]; > > if (pevent) { > perf_event_release_kernel(pevent); > - perf_events[cpu][event] = NULL; > + per_cpu(perf_events, cpu)[event] = NULL; > } > } > > @@ -257,12 +258,12 @@ void oprofile_perf_exit(void) > > for_each_possible_cpu(cpu) { > for (id = 0; id < num_counters; ++id) { > - event = perf_events[cpu][id]; > + event = per_cpu(perf_events, cpu)[id]; > if (event) > perf_event_release_kernel(event); > } > > - kfree(perf_events[cpu]); > + kfree(per_cpu(perf_events, cpu)); > } > > kfree(counter_config); > @@ -277,8 +278,6 @@ int __init oprofile_perf_init(struct oprofile_operations *ops) > if (ret) > return ret; > > - memset(&perf_events, 0, sizeof(perf_events)); > - > num_counters = perf_num_counters(); > if (num_counters <= 0) { > pr_info("oprofile: no performance counters\n"); > @@ -298,9 +297,9 @@ int __init oprofile_perf_init(struct oprofile_operations *ops) > } > > for_each_possible_cpu(cpu) { > - perf_events[cpu] = kcalloc(num_counters, > + per_cpu(perf_events, cpu) = kcalloc(num_counters, > sizeof(struct perf_event *), GFP_KERNEL); > - if (!perf_events[cpu]) { > + if (!per_cpu(perf_events, cpu)) { > pr_info("oprofile: failed to allocate %d perf events " > "for cpu %d\n", num_counters, cpu); > ret = -ENOMEM;