diff options
Diffstat (limited to 'kernel/events/core.c')
| -rw-r--r-- | kernel/events/core.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c index 5aeb4c74fb99..932babd9e86c 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -4968,6 +4968,11 @@ static void __perf_event_period(struct perf_event *event, | |||
| 4968 | } | 4968 | } |
| 4969 | } | 4969 | } |
| 4970 | 4970 | ||
| 4971 | static int perf_event_check_period(struct perf_event *event, u64 value) | ||
| 4972 | { | ||
| 4973 | return event->pmu->check_period(event, value); | ||
| 4974 | } | ||
| 4975 | |||
| 4971 | static int perf_event_period(struct perf_event *event, u64 __user *arg) | 4976 | static int perf_event_period(struct perf_event *event, u64 __user *arg) |
| 4972 | { | 4977 | { |
| 4973 | u64 value; | 4978 | u64 value; |
| @@ -4984,6 +4989,9 @@ static int perf_event_period(struct perf_event *event, u64 __user *arg) | |||
| 4984 | if (event->attr.freq && value > sysctl_perf_event_sample_rate) | 4989 | if (event->attr.freq && value > sysctl_perf_event_sample_rate) |
| 4985 | return -EINVAL; | 4990 | return -EINVAL; |
| 4986 | 4991 | ||
| 4992 | if (perf_event_check_period(event, value)) | ||
| 4993 | return -EINVAL; | ||
| 4994 | |||
| 4987 | event_function_call(event, __perf_event_period, &value); | 4995 | event_function_call(event, __perf_event_period, &value); |
| 4988 | 4996 | ||
| 4989 | return 0; | 4997 | return 0; |
| @@ -9600,6 +9608,11 @@ static int perf_pmu_nop_int(struct pmu *pmu) | |||
| 9600 | return 0; | 9608 | return 0; |
| 9601 | } | 9609 | } |
| 9602 | 9610 | ||
| 9611 | static int perf_event_nop_int(struct perf_event *event, u64 value) | ||
| 9612 | { | ||
| 9613 | return 0; | ||
| 9614 | } | ||
| 9615 | |||
| 9603 | static DEFINE_PER_CPU(unsigned int, nop_txn_flags); | 9616 | static DEFINE_PER_CPU(unsigned int, nop_txn_flags); |
| 9604 | 9617 | ||
| 9605 | static void perf_pmu_start_txn(struct pmu *pmu, unsigned int flags) | 9618 | static void perf_pmu_start_txn(struct pmu *pmu, unsigned int flags) |
| @@ -9900,6 +9913,9 @@ got_cpu_context: | |||
| 9900 | pmu->pmu_disable = perf_pmu_nop_void; | 9913 | pmu->pmu_disable = perf_pmu_nop_void; |
| 9901 | } | 9914 | } |
| 9902 | 9915 | ||
| 9916 | if (!pmu->check_period) | ||
| 9917 | pmu->check_period = perf_event_nop_int; | ||
| 9918 | |||
| 9903 | if (!pmu->event_idx) | 9919 | if (!pmu->event_idx) |
| 9904 | pmu->event_idx = perf_event_idx_default; | 9920 | pmu->event_idx = perf_event_idx_default; |
| 9905 | 9921 | ||
