diff options
-rw-r--r-- | arch/x86/kernel/cpu/perf_event.c | 3 | ||||
-rw-r--r-- | include/linux/perf_event.h | 15 | ||||
-rw-r--r-- | kernel/perf_event.c | 15 |
3 files changed, 18 insertions, 15 deletions
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index 6531b4bdb22d..aab2e1ce9dee 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
@@ -503,6 +503,9 @@ static int __hw_perf_event_init(struct perf_event *event) | |||
503 | */ | 503 | */ |
504 | if (attr->type == PERF_TYPE_RAW) { | 504 | if (attr->type == PERF_TYPE_RAW) { |
505 | hwc->config |= x86_pmu.raw_event(attr->config); | 505 | hwc->config |= x86_pmu.raw_event(attr->config); |
506 | if ((hwc->config & ARCH_PERFMON_EVENTSEL_ANY) && | ||
507 | perf_paranoid_cpu() && !capable(CAP_SYS_ADMIN)) | ||
508 | return -EACCES; | ||
506 | return 0; | 509 | return 0; |
507 | } | 510 | } |
508 | 511 | ||
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 04f06b4be297..90e0521b1690 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
@@ -857,6 +857,21 @@ extern int sysctl_perf_event_paranoid; | |||
857 | extern int sysctl_perf_event_mlock; | 857 | extern int sysctl_perf_event_mlock; |
858 | extern int sysctl_perf_event_sample_rate; | 858 | extern int sysctl_perf_event_sample_rate; |
859 | 859 | ||
860 | static inline bool perf_paranoid_tracepoint_raw(void) | ||
861 | { | ||
862 | return sysctl_perf_event_paranoid > -1; | ||
863 | } | ||
864 | |||
865 | static inline bool perf_paranoid_cpu(void) | ||
866 | { | ||
867 | return sysctl_perf_event_paranoid > 0; | ||
868 | } | ||
869 | |||
870 | static inline bool perf_paranoid_kernel(void) | ||
871 | { | ||
872 | return sysctl_perf_event_paranoid > 1; | ||
873 | } | ||
874 | |||
860 | extern void perf_event_init(void); | 875 | extern void perf_event_init(void); |
861 | extern void perf_tp_event(int event_id, u64 addr, u64 count, void *record, int entry_size); | 876 | extern void perf_tp_event(int event_id, u64 addr, u64 count, void *record, int entry_size); |
862 | extern void perf_bp_event(struct perf_event *event, void *data); | 877 | extern void perf_bp_event(struct perf_event *event, void *data); |
diff --git a/kernel/perf_event.c b/kernel/perf_event.c index a661e7991865..482d5e1d3764 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c | |||
@@ -56,21 +56,6 @@ static atomic_t nr_task_events __read_mostly; | |||
56 | */ | 56 | */ |
57 | int sysctl_perf_event_paranoid __read_mostly = 1; | 57 | int sysctl_perf_event_paranoid __read_mostly = 1; |
58 | 58 | ||
59 | static inline bool perf_paranoid_tracepoint_raw(void) | ||
60 | { | ||
61 | return sysctl_perf_event_paranoid > -1; | ||
62 | } | ||
63 | |||
64 | static inline bool perf_paranoid_cpu(void) | ||
65 | { | ||
66 | return sysctl_perf_event_paranoid > 0; | ||
67 | } | ||
68 | |||
69 | static inline bool perf_paranoid_kernel(void) | ||
70 | { | ||
71 | return sysctl_perf_event_paranoid > 1; | ||
72 | } | ||
73 | |||
74 | int sysctl_perf_event_mlock __read_mostly = 512; /* 'free' kb per user */ | 59 | int sysctl_perf_event_mlock __read_mostly = 512; /* 'free' kb per user */ |
75 | 60 | ||
76 | /* | 61 | /* |