diff options
author | Alexander Shishkin <alexander.shishkin@linux.intel.com> | 2016-04-27 11:44:48 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-05-05 04:13:58 -0400 |
commit | 6e855cd4f4b5258016cf707f94f96bfa51c32f32 (patch) | |
tree | 93d48a83ce47cf89801a9257dfbf19847ba2af5d | |
parent | eadf48cab4b6b0ab8bcd53feb7d52a71e72debd0 (diff) |
perf/core: Let userspace know if the PMU supports address filters
Export an additional common attribute for PMUs that support address range
filtering to let the perf userspace identify such PMUs in a uniform way.
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Cc: vince@deater.net
Link: http://lkml.kernel.org/r/1461771888-10409-8-git-send-email-alexander.shishkin@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | kernel/events/core.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index ffdc096a4f4e..63be65437e9e 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
@@ -8273,6 +8273,20 @@ static void free_pmu_context(struct pmu *pmu) | |||
8273 | out: | 8273 | out: |
8274 | mutex_unlock(&pmus_lock); | 8274 | mutex_unlock(&pmus_lock); |
8275 | } | 8275 | } |
8276 | |||
8277 | /* | ||
8278 | * Let userspace know that this PMU supports address range filtering: | ||
8279 | */ | ||
8280 | static ssize_t nr_addr_filters_show(struct device *dev, | ||
8281 | struct device_attribute *attr, | ||
8282 | char *page) | ||
8283 | { | ||
8284 | struct pmu *pmu = dev_get_drvdata(dev); | ||
8285 | |||
8286 | return snprintf(page, PAGE_SIZE - 1, "%d\n", pmu->nr_addr_filters); | ||
8287 | } | ||
8288 | DEVICE_ATTR_RO(nr_addr_filters); | ||
8289 | |||
8276 | static struct idr pmu_idr; | 8290 | static struct idr pmu_idr; |
8277 | 8291 | ||
8278 | static ssize_t | 8292 | static ssize_t |
@@ -8374,9 +8388,19 @@ static int pmu_dev_alloc(struct pmu *pmu) | |||
8374 | if (ret) | 8388 | if (ret) |
8375 | goto free_dev; | 8389 | goto free_dev; |
8376 | 8390 | ||
8391 | /* For PMUs with address filters, throw in an extra attribute: */ | ||
8392 | if (pmu->nr_addr_filters) | ||
8393 | ret = device_create_file(pmu->dev, &dev_attr_nr_addr_filters); | ||
8394 | |||
8395 | if (ret) | ||
8396 | goto del_dev; | ||
8397 | |||
8377 | out: | 8398 | out: |
8378 | return ret; | 8399 | return ret; |
8379 | 8400 | ||
8401 | del_dev: | ||
8402 | device_del(pmu->dev); | ||
8403 | |||
8380 | free_dev: | 8404 | free_dev: |
8381 | put_device(pmu->dev); | 8405 | put_device(pmu->dev); |
8382 | goto out; | 8406 | goto out; |
@@ -8512,6 +8536,8 @@ void perf_pmu_unregister(struct pmu *pmu) | |||
8512 | free_percpu(pmu->pmu_disable_count); | 8536 | free_percpu(pmu->pmu_disable_count); |
8513 | if (pmu->type >= PERF_TYPE_MAX) | 8537 | if (pmu->type >= PERF_TYPE_MAX) |
8514 | idr_remove(&pmu_idr, pmu->type); | 8538 | idr_remove(&pmu_idr, pmu->type); |
8539 | if (pmu->nr_addr_filters) | ||
8540 | device_remove_file(pmu->dev, &dev_attr_nr_addr_filters); | ||
8515 | device_del(pmu->dev); | 8541 | device_del(pmu->dev); |
8516 | put_device(pmu->dev); | 8542 | put_device(pmu->dev); |
8517 | free_pmu_context(pmu); | 8543 | free_pmu_context(pmu); |