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