aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@redhat.com>2012-10-10 08:53:12 -0400
committerIngo Molnar <mingo@kernel.org>2012-10-24 04:41:24 -0400
commit8300daa26755c9a194776778bd822acf1fa2dbf6 (patch)
treecfb1ad6e239c852d71577b4aa40eec9850e1c986 /arch
parenta47473939db20e3961b200eb00acf5fcf084d755 (diff)
perf/x86: Filter out undefined events from sysfs events attribute
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 <a.p.zijlstra@chello.nl> Signed-off-by: Jiri Olsa <jolsa@redhat.com> Cc: Arnaldo Carvalho de Melo <acme@ghostprotocols.net> Cc: Paul Mackerras <paulus@samba.org> Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Stephane Eranian <eranian@google.com> Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Link: http://lkml.kernel.org/r/1349873598-12583-3-git-send-email-jolsa@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/cpu/perf_event.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c
index 9fa4c45ecad9..39737a678a86 100644
--- a/arch/x86/kernel/cpu/perf_event.c
+++ b/arch/x86/kernel/cpu/perf_event.c
@@ -1321,6 +1321,26 @@ struct perf_pmu_events_attr {
1321 u64 id; 1321 u64 id;
1322}; 1322};
1323 1323
1324/*
1325 * Remove all undefined events (x86_pmu.event_map(id) == 0)
1326 * out of events_attr attributes.
1327 */
1328static void __init filter_events(struct attribute **attrs)
1329{
1330 int i, j;
1331
1332 for (i = 0; attrs[i]; i++) {
1333 if (x86_pmu.event_map(i))
1334 continue;
1335
1336 for (j = i; attrs[j]; j++)
1337 attrs[j] = attrs[j + 1];
1338
1339 /* Check the shifted attr. */
1340 i--;
1341 }
1342}
1343
1324ssize_t events_sysfs_show(struct device *dev, struct device_attribute *attr, 1344ssize_t events_sysfs_show(struct device *dev, struct device_attribute *attr,
1325 char *page) 1345 char *page)
1326{ 1346{
@@ -1420,6 +1440,8 @@ static int __init init_hw_perf_events(void)
1420 1440
1421 if (!x86_pmu.events_sysfs_show) 1441 if (!x86_pmu.events_sysfs_show)
1422 x86_pmu_events_group.attrs = &empty_attrs; 1442 x86_pmu_events_group.attrs = &empty_attrs;
1443 else
1444 filter_events(x86_pmu_events_group.attrs);
1423 1445
1424 pr_info("... version: %d\n", x86_pmu.version); 1446 pr_info("... version: %d\n", x86_pmu.version);
1425 pr_info("... bit width: %d\n", x86_pmu.cntval_bits); 1447 pr_info("... bit width: %d\n", x86_pmu.cntval_bits);