lkml.org 
[lkml]   [2012]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH 27/32] perf, x86: Support CPU specific sysfs events
    From
    On Wed, Oct 31, 2012 at 1:34 AM, Andi Kleen <andi@firstfloor.org> wrote:
    > From: Andi Kleen <ak@linux.intel.com>
    >
    > Add a way for the CPU initialization code to register additional events,
    > and merge them into the events attribute directory. Used in the next
    > patch.
    >
    > Signed-off-by: Andi Kleen <ak@linux.intel.com>

    Acked-by: Stephane Eranian <eranian@google.com>

    > ---
    > arch/x86/kernel/cpu/perf_event.c | 29 +++++++++++++++++++++++++++++
    > arch/x86/kernel/cpu/perf_event.h | 1 +
    > 2 files changed, 30 insertions(+), 0 deletions(-)
    >
    > diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
    > index af38635..e247423 100644
    > --- a/arch/x86/kernel/cpu/perf_event.c
    > +++ b/arch/x86/kernel/cpu/perf_event.c
    > @@ -1344,6 +1344,30 @@ static void __init filter_events(struct attribute **attrs)
    > }
    > }
    >
    > +/* Merge two pointer arrays */
    > +static __init struct attribute **merge_attr(struct attribute **a,
    > + struct attribute **b)
    > +{
    > + struct attribute **new;
    > + int j, i;
    > +
    > + for (j = 0; a[j]; j++)
    > + ;
    > + for (i = 0; b[i]; i++)
    > + j++;
    > + j++;
    > + new = kmalloc(sizeof(struct attribute *) * j, GFP_KERNEL);
    > + if (!new)
    > + return a;
    > + j = 0;
    > + for (i = 0; a[i]; i++)
    > + new[j++] = a[i];
    > + for (i = 0; b[i]; i++)
    > + new[j++] = b[i];
    > + new[j] = NULL;
    > + return new;
    > +}
    > +
    > ssize_t events_sysfs_show(struct device *dev, struct device_attribute *attr,
    > char *page)
    > {
    > @@ -1481,6 +1505,11 @@ static int __init init_hw_perf_events(void)
    > else
    > filter_events(x86_pmu_events_group.attrs);
    >
    > + if (x86_pmu.cpu_events)
    > + x86_pmu_events_group.attrs =
    > + merge_attr(x86_pmu_events_group.attrs,
    > + x86_pmu.cpu_events);
    > +
    > pr_info("... version: %d\n", x86_pmu.version);
    > pr_info("... bit width: %d\n", x86_pmu.cntval_bits);
    > pr_info("... generic registers: %d\n", x86_pmu.num_counters);
    > diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h
    > index 12ae625..22f8003 100644
    > --- a/arch/x86/kernel/cpu/perf_event.h
    > +++ b/arch/x86/kernel/cpu/perf_event.h
    > @@ -360,6 +360,7 @@ struct x86_pmu {
    > struct attribute **format_attrs;
    >
    > ssize_t (*events_sysfs_show)(char *page, u64 config);
    > + struct attribute **cpu_events;
    >
    > /*
    > * CPU Hotplug hooks
    > --
    > 1.7.7.6
    >


    \
     
     \ /
      Last update: 2012-11-07 16:21    [W:4.182 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site