MIPS: Use common outgoing-CPU-notification code
authorMarcin Nowakowski <marcin.nowakowski@imgtec.com>
Fri, 7 Apr 2017 11:40:28 +0000 (13:40 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Wed, 12 Apr 2017 11:52:14 +0000 (13:52 +0200)
Replace the open-coded CPU-offline notification with common code.
In particular avoid calling scheduler code using RCU from an offline CPU
that RCU is ignoring.

Signed-off-by: Marcin Nowakowski <marcin.nowakowski@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/15921/
Patchwork: https://patchwork.linux-mips.org/patch/15953/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/kernel/smp-cps.c

index 6d45f05538c8b37db5fff707d50daa42ef8b097a..306b4a64cb8f1a57107e3006b2b834b5f0a38ca2 100644 (file)
@@ -8,6 +8,7 @@
  * option) any later version.
  */
 
+#include <linux/cpu.h>
 #include <linux/delay.h>
 #include <linux/io.h>
 #include <linux/irqchip/mips-gic.h>
@@ -408,7 +409,6 @@ static int cps_cpu_disable(void)
        return 0;
 }
 
-static DECLARE_COMPLETION(cpu_death_chosen);
 static unsigned cpu_death_sibling;
 static enum {
        CPU_DEATH_HALT,
@@ -444,7 +444,7 @@ void play_dead(void)
        }
 
        /* This CPU has chosen its way out */
-       complete(&cpu_death_chosen);
+       (void)cpu_report_death();
 
        if (cpu_death == CPU_DEATH_HALT) {
                vpe_id = cpu_vpe_id(&cpu_data[cpu]);
@@ -493,8 +493,7 @@ static void cps_cpu_die(unsigned int cpu)
        int err;
 
        /* Wait for the cpu to choose its way out */
-       if (!wait_for_completion_timeout(&cpu_death_chosen,
-                                        msecs_to_jiffies(5000))) {
+       if (!cpu_wait_death(cpu, 5)) {
                pr_err("CPU%u: didn't offline\n", cpu);
                return;
        }