diff options
author | Linux Build Service Account <lnxbuild@quicinc.com> | 2017-08-03 20:51:14 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-08-03 20:51:14 -0700 |
commit | 11623fddcd6352baa1be17e9da653e47d20de698 (patch) | |
tree | f1cfb222eb40fc7757947457c8c2eca0f104e306 /kernel | |
parent | 607bbf6f9bf827414a62aeb2a25f6c8bf960280b (diff) | |
parent | 2e54dcd5ed1784bc30fb6b956ed77b7f668acb1f (diff) |
Merge "perf/core: Fix crash in perf_event_read()"
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/core.c | 13 |
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; } |