On 04.10.10 16:44:20, Matt Fleming wrote: > Introduce perf_pmu_name() helper function that returns the name of the > pmu. This gives us a generic way to get the name of a pmu regardless of > how an architecture identifies it internally, e.g. ARM uses an id > whereas SH currently uses a string. > > Signed-off-by: Matt Fleming <matt@xxxxxxxxxxxxxxxxx> > --- > arch/arm/kernel/perf_event.c | 23 +++++++++++++++++++++++ > arch/arm/oprofile/common.c | 22 +--------------------- > arch/sh/kernel/perf_event.c | 14 ++++++++++++++ > include/linux/perf_event.h | 1 + > kernel/perf_event.c | 5 +++++ > 5 files changed, 44 insertions(+), 21 deletions(-) > Matt, as an outcome of the discussion we have had in this thread I think we agree on the following: We extend the generic perf interface with perf_pmu_name() implenting a default with the __weak attribute. On sh we override this function and will use it for perf/oprofile string translation. This will be implemented in the oprofile function op_name_from_perf_name(). Later we implement a generic oprofile function that derives the cpu_type from perf_pmu_name() in a generic way and add other architectures. Thus, we will drop the ARM changes with this patch set. Paul, please correct me if I am wrong with the above. Peter, please ack the perf_pmu_name() interface introduced below. See also my comments below. If there are any other objections, please let me know. Thanks, -Robert > diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c > index ef3bc33..3bff24d 100644 > --- a/arch/arm/kernel/perf_event.c > +++ b/arch/arm/kernel/perf_event.c > @@ -123,6 +123,29 @@ armpmu_get_max_events(void) > } > EXPORT_SYMBOL_GPL(armpmu_get_max_events); > > +const char *perf_pmu_name(void) > +{ > + enum arm_perf_pmu_ids id = armpmu_get_pmu_id(); > + > + switch (id) { > + case ARM_PERF_PMU_ID_XSCALE1: > + return "arm/xscale1"; > + case ARM_PERF_PMU_ID_XSCALE2: > + return "arm/xscale2"; > + case ARM_PERF_PMU_ID_V6: > + return "arm/armv6"; > + case ARM_PERF_PMU_ID_V6MP: > + return "arm/mpcore"; > + case ARM_PERF_PMU_ID_CA8: > + return "arm/armv7"; > + case ARM_PERF_PMU_ID_CA9: > + return "arm/armv7-ca9"; > + default: > + return NULL; > + } > +} > +EXPORT_SYMBOL_GPL(perf_pmu_name); > + > int perf_num_counters(void) > { > return armpmu_get_max_events(); > diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c > index 23f18a0..cb224ee 100644 > --- a/arch/arm/oprofile/common.c > +++ b/arch/arm/oprofile/common.c > @@ -155,26 +155,6 @@ static void op_perf_stop(void) > } > > > -static char *op_name_from_perf_id(enum arm_perf_pmu_ids id) > -{ > - switch (id) { > - case ARM_PERF_PMU_ID_XSCALE1: > - return "arm/xscale1"; > - case ARM_PERF_PMU_ID_XSCALE2: > - return "arm/xscale2"; > - case ARM_PERF_PMU_ID_V6: > - return "arm/armv6"; > - case ARM_PERF_PMU_ID_V6MP: > - return "arm/mpcore"; > - case ARM_PERF_PMU_ID_CA8: > - return "arm/armv7"; > - case ARM_PERF_PMU_ID_CA9: > - return "arm/armv7-ca9"; > - default: > - return NULL; > - } > -} > - > static int op_arm_create_files(struct super_block *sb, struct dentry *root) > { > unsigned int i; > @@ -391,7 +371,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) > ops->start = op_arm_start; > ops->stop = op_arm_stop; > ops->shutdown = op_arm_stop; > - ops->cpu_type = op_name_from_perf_id(armpmu_get_pmu_id()); > + ops->cpu_type = perf_pmu_name(); Please drop all arm changes in this patch. We will do the change after a generic patch for perf/oprofile string translation is available. > > if (!ops->cpu_type) > ret = -ENODEV; > diff --git a/arch/sh/kernel/perf_event.c b/arch/sh/kernel/perf_event.c > index 2cb9ad5..e065a1d 100644 > --- a/arch/sh/kernel/perf_event.c > +++ b/arch/sh/kernel/perf_event.c > @@ -59,6 +59,20 @@ static inline int sh_pmu_initialized(void) > return !!sh_pmu; > } > > +const char *perf_pmu_name(void) > +{ > + if (!sh_pmu) > + return NULL; > + > + if (!strcmp(sh_pmu->name, "SH7750")) > + return "sh/sh7750"; > + if (!strcmp(sh_pmu->name, "SH-4A")) > + return "sh/sh4a"; > + > + return NULL; > +} > +EXPORT_SYMBOL_GPL(perf_pmu_name); The implementation should be moved to function op_name_from_perf_name() in sh oprofile code. perf_pmu_name() should simply return sh_pmu->name. > + > int perf_num_counters(void) > { > if (!sh_pmu) > diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h > index 1a02192..33f08da 100644 > --- a/include/linux/perf_event.h > +++ b/include/linux/perf_event.h > @@ -850,6 +850,7 @@ extern int perf_max_events; > extern const struct pmu *hw_perf_event_init(struct perf_event *event); > > extern int perf_num_counters(void); > +extern const char *perf_pmu_name(void); > extern void perf_event_task_sched_in(struct task_struct *task); > extern void perf_event_task_sched_out(struct task_struct *task, struct task_struct *next); > extern void perf_event_task_tick(struct task_struct *task); > diff --git a/kernel/perf_event.c b/kernel/perf_event.c > index db5b560..fc51268 100644 > --- a/kernel/perf_event.c > +++ b/kernel/perf_event.c > @@ -85,6 +85,11 @@ void __weak hw_perf_enable(void) { barrier(); } > > void __weak perf_event_print_debug(void) { } > > +extern __weak const char *perf_pmu_name(void) > +{ > + return "pmu"; > +} > + > static DEFINE_PER_CPU(int, perf_disable_count); > > void perf_disable(void) > -- > 1.7.1 > > -- Advanced Micro Devices, Inc. Operating System Research Center -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html