From 264231c508a66185ac0e3807b51e2d33aabd0291 Mon Sep 17 00:00:00 2001 From: Yabin Cui <yabinc@google.com> Date: Thu, 2 Jun 2016 13:32:11 -0700 Subject: [PATCH] perf: disable events across cpu hotplug. Enabling events across cpu hotplug can cause kernel panic, one situation is like below: -> enable perf event on one cpu -> the cpu is offlined -> the perf event is released, but failed to bring up the cpu. so the event is freed, but still registered in the pmu. -> the cpu is online, and try to access the freed event. Bug: 28964480 Change-Id: I395091af177b3307d7b4c3236c2e4b249b06c053 --- arch/arm/kernel/perf_event.c | 2 +- arch/arm/kernel/perf_event_cpu.c | 2 +- kernel/events/core.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 1da80ec37fea..f962cef2e923 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -574,7 +574,7 @@ static void armpmu_init(struct arm_pmu *armpmu) armpmu->pmu.start = armpmu_start; armpmu->pmu.stop = armpmu_stop; armpmu->pmu.read = armpmu_read; - armpmu->pmu.events_across_hotplug = 1; + armpmu->pmu.events_across_hotplug = 0; } int armpmu_register(struct arm_pmu *armpmu, int type) diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index 88ffb8007e66..bf6be9eca71e 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c @@ -313,7 +313,7 @@ static int perf_cpu_pm_notifier(struct notifier_block *self, unsigned long cmd, * to re-enable active counters. */ __get_cpu_var(from_idle) = 1; - cpu_pmu->reset(NULL); + cpu_pmu->reset(cpu_pmu); pmu = &cpu_pmu->pmu; pmu->pmu_enable(pmu); } diff --git a/kernel/events/core.c b/kernel/events/core.c index 9f9a123247fd..8794516d199c 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -5519,7 +5519,7 @@ static struct pmu perf_swevent = { .read = perf_swevent_read, .event_idx = perf_swevent_event_idx, - .events_across_hotplug = 1, + .events_across_hotplug = 0, }; #ifdef CONFIG_EVENT_TRACING @@ -5639,7 +5639,7 @@ static struct pmu perf_tracepoint = { .read = perf_swevent_read, .event_idx = perf_swevent_event_idx, - .events_across_hotplug = 1, + .events_across_hotplug = 0, }; static inline void perf_tp_register(void) @@ -5867,7 +5867,7 @@ static struct pmu perf_cpu_clock = { .read = cpu_clock_event_read, .event_idx = perf_swevent_event_idx, - .events_across_hotplug = 1, + .events_across_hotplug = 0, }; /* @@ -5948,7 +5948,7 @@ static struct pmu perf_task_clock = { .read = task_clock_event_read, .event_idx = perf_swevent_event_idx, - .events_across_hotplug = 1, + .events_across_hotplug = 0, }; static void perf_pmu_nop_void(struct pmu *pmu) -- GitLab