perf/x86: Filter out undefined events from sysfs events attribute
authorJiri Olsa <[email protected]>
Wed, 10 Oct 2012 12:53:12 +0000 (14:53 +0200)
committerIngo Molnar <[email protected]>
Wed, 24 Oct 2012 08:41:24 +0000 (10:41 +0200)
The sysfs events group attribute currently shows all hw events,
including also undefined ones.

This patch filters out all undefined events out of the sysfs events
group attribute, so they don't even show up.

Suggested-by: Peter Zijlstra <[email protected]>
Signed-off-by: Jiri Olsa <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: Paul Mackerras <[email protected]>
Cc: Corey Ashford <[email protected]>
Cc: Frederic Weisbecker <[email protected]>
Cc: Stephane Eranian <[email protected]>
Signed-off-by: Peter Zijlstra <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>
arch/x86/kernel/cpu/perf_event.c

index 9fa4c45ecad97fd8d006ac6f9ee72cce6e7ceef6..39737a678a86fd7549ba12ce12d73585e0b47e27 100644 (file)
@@ -1321,6 +1321,26 @@ struct perf_pmu_events_attr {
        u64 id;
 };
 
+/*
+ * Remove all undefined events (x86_pmu.event_map(id) == 0)
+ * out of events_attr attributes.
+ */
+static void __init filter_events(struct attribute **attrs)
+{
+       int i, j;
+
+       for (i = 0; attrs[i]; i++) {
+               if (x86_pmu.event_map(i))
+                       continue;
+
+               for (j = i; attrs[j]; j++)
+                       attrs[j] = attrs[j + 1];
+
+               /* Check the shifted attr. */
+               i--;
+       }
+}
+
 ssize_t events_sysfs_show(struct device *dev, struct device_attribute *attr,
                          char *page)
 {
@@ -1420,6 +1440,8 @@ static int __init init_hw_perf_events(void)
 
        if (!x86_pmu.events_sysfs_show)
                x86_pmu_events_group.attrs = &empty_attrs;
+       else
+               filter_events(x86_pmu_events_group.attrs);
 
        pr_info("... version:                %d\n",     x86_pmu.version);
        pr_info("... bit width:              %d\n",     x86_pmu.cntval_bits);