aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Cochran <rcochran@linutronix.de>2016-07-13 13:16:53 -0400
committerIngo Molnar <mingo@kernel.org>2016-07-15 04:40:29 -0400
commit65264e3bc3d479a87a3a9dbc6f3daee6439ce5c0 (patch)
tree1f6af303f4ffdd3bada76f64c68c2e7dcaf4ceb2
parent4761adb6f49048cddd65553a71ea2354b2a838be (diff)
MIPS/Loongson-3: Convert oprofile to hotplug state machine
Install the callbacks via the state machine and let the core invoke the callbacks on the already online CPUs. Signed-off-by: Richard Cochran <rcochran@linutronix.de> Signed-off-by: Anna-Maria Gleixner <anna-maria@linutronix.de> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Acked-by: Ralf Baechle <ralf@linux-mips.org> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Robert Richter <rric@kernel.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-mips@linux-mips.org Cc: oprofile-list@lists.sf.net Cc: rt@linutronix.de Link: http://lkml.kernel.org/r/20160713153337.054827168@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/mips/oprofile/op_model_loongson3.c35
-rw-r--r--include/linux/cpuhotplug.h1
2 files changed, 15 insertions, 21 deletions
diff --git a/arch/mips/oprofile/op_model_loongson3.c b/arch/mips/oprofile/op_model_loongson3.c
index 8bcf7fc40f0d..85f3ee4ab456 100644
--- a/arch/mips/oprofile/op_model_loongson3.c
+++ b/arch/mips/oprofile/op_model_loongson3.c
@@ -168,33 +168,26 @@ static int loongson3_perfcount_handler(void)
168 return handled; 168 return handled;
169} 169}
170 170
171static int loongson3_cpu_callback(struct notifier_block *nfb, 171static int loongson3_starting_cpu(unsigned int cpu)
172 unsigned long action, void *hcpu)
173{ 172{
174 switch (action) { 173 write_c0_perflo1(reg.control1);
175 case CPU_STARTING: 174 write_c0_perflo2(reg.control2);
176 case CPU_STARTING_FROZEN: 175 return 0;
177 write_c0_perflo1(reg.control1);
178 write_c0_perflo2(reg.control2);
179 break;
180 case CPU_DYING:
181 case CPU_DYING_FROZEN:
182 write_c0_perflo1(0xc0000000);
183 write_c0_perflo2(0x40000000);
184 break;
185 }
186
187 return NOTIFY_OK;
188} 176}
189 177
190static struct notifier_block loongson3_notifier_block = { 178static int loongson3_dying_cpu(unsigned int cpu)
191 .notifier_call = loongson3_cpu_callback 179{
192}; 180 write_c0_perflo1(0xc0000000);
181 write_c0_perflo2(0x40000000);
182 return 0;
183}
193 184
194static int __init loongson3_init(void) 185static int __init loongson3_init(void)
195{ 186{
196 on_each_cpu(reset_counters, NULL, 1); 187 on_each_cpu(reset_counters, NULL, 1);
197 register_hotcpu_notifier(&loongson3_notifier_block); 188 cpuhp_setup_state_nocalls(CPUHP_AP_MIPS_OP_LOONGSON3_STARTING,
189 "AP_MIPS_OP_LOONGSON3_STARTING",
190 loongson3_starting_cpu, loongson3_dying_cpu);
198 save_perf_irq = perf_irq; 191 save_perf_irq = perf_irq;
199 perf_irq = loongson3_perfcount_handler; 192 perf_irq = loongson3_perfcount_handler;
200 193
@@ -204,7 +197,7 @@ static int __init loongson3_init(void)
204static void loongson3_exit(void) 197static void loongson3_exit(void)
205{ 198{
206 on_each_cpu(reset_counters, NULL, 1); 199 on_each_cpu(reset_counters, NULL, 1);
207 unregister_hotcpu_notifier(&loongson3_notifier_block); 200 cpuhp_remove_state_nocalls(CPUHP_AP_MIPS_OP_LOONGSON3_STARTING);
208 perf_irq = save_perf_irq; 201 perf_irq = save_perf_irq;
209} 202}
210 203
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index 4c02b52dc77f..ad26e353a5c0 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -35,6 +35,7 @@ enum cpuhp_state {
35 CPUHP_AP_PERF_X86_CSTATE_STARTING, 35 CPUHP_AP_PERF_X86_CSTATE_STARTING,
36 CPUHP_AP_PERF_XTENSA_STARTING, 36 CPUHP_AP_PERF_XTENSA_STARTING,
37 CPUHP_AP_PERF_METAG_STARTING, 37 CPUHP_AP_PERF_METAG_STARTING,
38 CPUHP_AP_MIPS_OP_LOONGSON3_STARTING,
38 CPUHP_AP_ARM_VFP_STARTING, 39 CPUHP_AP_ARM_VFP_STARTING,
39 CPUHP_AP_PERF_ARM_STARTING, 40 CPUHP_AP_PERF_ARM_STARTING,
40 CPUHP_AP_ARM_L2X0_STARTING, 41 CPUHP_AP_ARM_L2X0_STARTING,