aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYogesh Tillu <yogesh.tillu@linaro.org>2015-08-10 14:56:57 +0530
committerGary S. Robertson <gary.robertson@linaro.org>2015-09-09 13:37:05 -0500
commit73ce60fe6d7ccf65379c4d121e76a3ad825100b1 (patch)
tree6509ab26a96bfcd30a5a4af5223d91ab753d2191
parent2e1b4f1186785dd153f7d75921b922c882f4832c (diff)
ARM64: perf: enable/disable access to "perf hw counter" from userspace for mmap
__weak implementation of arch_perf_userspace_access() to enable or disable access to "perf hw counter" from userspace at runtime for mmap. Signed-off-by: Yogesh Tillu <yogesh.tillu@linaro.org> Signed-off-by: Gary S. Robertson <gary.robertson@linaro.org>
-rw-r--r--kernel/events/core.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 8c681d1f480f..c8e0b78a154f 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3929,12 +3929,18 @@ static void calc_timer_values(struct perf_event *event,
*running = ctx_time - event->tstamp_running;
}
+void __weak arch_perf_uspace_access(void *enable)
+{
+}
+
static void perf_event_init_userpage(struct perf_event *event)
{
struct perf_event_mmap_page *userpg;
struct ring_buffer *rb;
+ int enable = 1;
rcu_read_lock();
+ on_each_cpu(arch_perf_uspace_access, (void *)&enable, true);
rb = rcu_dereference(event->rb);
if (!rb)
goto unlock;
@@ -4154,6 +4160,7 @@ static void perf_mmap_open(struct vm_area_struct *vma)
static void perf_mmap_close(struct vm_area_struct *vma)
{
struct perf_event *event = vma->vm_file->private_data;
+ int disable = 0;
struct ring_buffer *rb = ring_buffer_get(event);
struct user_struct *mmap_user = rb->mmap_user;
@@ -4229,6 +4236,8 @@ again:
out_put:
ring_buffer_put(rb); /* could be last */
+ if (!atomic_read(&rb->mmap_count))
+ on_each_cpu(arch_perf_uspace_access, (void *)&disable, true);
}
static const struct vm_operations_struct perf_mmap_vmops = {