Merge "perf/core: Fix crash in perf_event_read()"

This commit is contained in:
Linux Build Service Account 2017-08-03 20:51:14 -07:00 committed by Gerrit - the friendly Code Review server
commit 11623fddcd

View file

@ -3437,22 +3437,27 @@ u64 perf_event_read_local(struct perf_event *event)
static int perf_event_read(struct perf_event *event, bool group) 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 * If event is enabled and currently active on a CPU, update the
* value in the event structure: * value in the event structure:
*/ */
event_cpu = READ_ONCE(event->oncpu);
if (event->state == PERF_EVENT_STATE_ACTIVE && if (event->state == PERF_EVENT_STATE_ACTIVE &&
!cpu_isolated(event->oncpu)) { !cpu_isolated(event_cpu)) {
struct perf_read_data data = { struct perf_read_data data = {
.event = event, .event = event,
.group = group, .group = group,
.ret = 0, .ret = 0,
}; };
if ((unsigned int)event_cpu >= nr_cpu_ids)
return 0;
if (!event->attr.exclude_idle || if (!event->attr.exclude_idle ||
!per_cpu(is_idle, event->oncpu)) { !per_cpu(is_idle, event_cpu)) {
smp_call_function_single(event->oncpu, smp_call_function_single(event_cpu,
__perf_event_read, &data, 1); __perf_event_read, &data, 1);
ret = data.ret; ret = data.ret;
} }