summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@quicinc.com>2017-08-03 20:51:14 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2017-08-03 20:51:14 -0700
commit11623fddcd6352baa1be17e9da653e47d20de698 (patch)
treef1cfb222eb40fc7757947457c8c2eca0f104e306 /kernel
parent607bbf6f9bf827414a62aeb2a25f6c8bf960280b (diff)
parent2e54dcd5ed1784bc30fb6b956ed77b7f668acb1f (diff)
Merge "perf/core: Fix crash in perf_event_read()"
Diffstat (limited to 'kernel')
-rw-r--r--kernel/events/core.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 6cd152e99891..69f8f683138a 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -3437,22 +3437,27 @@ u64 perf_event_read_local(struct perf_event *event)
static int perf_event_read(struct perf_event *event, bool group)
{
- int ret = 0;
+ int event_cpu, ret = 0;
/*
* If event is enabled and currently active on a CPU, update the
* value in the event structure:
*/
+ event_cpu = READ_ONCE(event->oncpu);
+
if (event->state == PERF_EVENT_STATE_ACTIVE &&
- !cpu_isolated(event->oncpu)) {
+ !cpu_isolated(event_cpu)) {
struct perf_read_data data = {
.event = event,
.group = group,
.ret = 0,
};
+
+ if ((unsigned int)event_cpu >= nr_cpu_ids)
+ return 0;
if (!event->attr.exclude_idle ||
- !per_cpu(is_idle, event->oncpu)) {
- smp_call_function_single(event->oncpu,
+ !per_cpu(is_idle, event_cpu)) {
+ smp_call_function_single(event_cpu,
__perf_event_read, &data, 1);
ret = data.ret;
}