diff options
author | Yogesh Tillu <yogesh.tillu@linaro.org> | 2015-06-01 13:36:37 +0530 |
---|---|---|
committer | Yogesh Tillu <yogesh.tillu@linaro.org> | 2015-09-08 16:09:56 +0530 |
commit | 26e3b9eb22f33afe83a1a9c464634d24ca03894d (patch) | |
tree | 5e77fdbc14df9cbf88e3ea8cf3b40a98f424a22f | |
parent | dbe39f531b6eeec8108ccbb79b56edfc2d6cbaa6 (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>
-rw-r--r-- | kernel/events/core.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index e6feb5114134..3e43c21fa3b8 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -4217,12 +4217,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; @@ -4443,6 +4449,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; @@ -4535,6 +4542,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 = { |