KVM: selftests: test KVM_GET_SUPPORTED_HV_CPUID as a system ioctl
[linux-2.6-microblaze.git] / kernel / cpu.c
index 2371292..6ff2578 100644 (file)
@@ -3,6 +3,7 @@
  *
  * This code is licenced under the GPL.
  */
+#include <linux/sched/mm.h>
 #include <linux/proc_fs.h>
 #include <linux/smp.h>
 #include <linux/init.h>
@@ -432,7 +433,7 @@ static inline bool cpu_smt_allowed(unsigned int cpu)
        /*
         * On x86 it's required to boot all logical CPUs at least once so
         * that the init code can get a chance to set CR4.MCE on each
-        * CPU. Otherwise, a broadacasted MCE observing CR4.MCE=0b on any
+        * CPU. Otherwise, a broadcasted MCE observing CR4.MCE=0b on any
         * core will shutdown the machine.
         */
        return !cpumask_test_cpu(cpu, &cpus_booted_once_mask);
@@ -564,6 +565,21 @@ static int bringup_cpu(unsigned int cpu)
        return bringup_wait_for_ap(cpu);
 }
 
+static int finish_cpu(unsigned int cpu)
+{
+       struct task_struct *idle = idle_thread_get(cpu);
+       struct mm_struct *mm = idle->active_mm;
+
+       /*
+        * idle_task_exit() will have switched to &init_mm, now
+        * clean up any remaining active_mm state.
+        */
+       if (mm != &init_mm)
+               idle->active_mm = &init_mm;
+       mmdrop(mm);
+       return 0;
+}
+
 /*
  * Hotplug state machine related functions
  */
@@ -1327,7 +1343,7 @@ void bringup_nonboot_cpus(unsigned int setup_max_cpus)
 #ifdef CONFIG_PM_SLEEP_SMP
 static cpumask_var_t frozen_cpus;
 
-int __freeze_secondary_cpus(int primary, bool suspend)
+int freeze_secondary_cpus(int primary)
 {
        int cpu, error = 0;
 
@@ -1352,7 +1368,7 @@ int __freeze_secondary_cpus(int primary, bool suspend)
                if (cpu == primary)
                        continue;
 
-               if (suspend && pm_wakeup_pending()) {
+               if (pm_wakeup_pending()) {
                        pr_info("Wakeup pending. Abort CPU freeze\n");
                        error = -EBUSY;
                        break;
@@ -1376,8 +1392,8 @@ int __freeze_secondary_cpus(int primary, bool suspend)
 
        /*
         * Make sure the CPUs won't be enabled by someone else. We need to do
-        * this even in case of failure as all disable_nonboot_cpus() users are
-        * supposed to do enable_nonboot_cpus() on the failure path.
+        * this even in case of failure as all freeze_secondary_cpus() users are
+        * supposed to do thaw_secondary_cpus() on the failure path.
         */
        cpu_hotplug_disabled++;
 
@@ -1385,15 +1401,15 @@ int __freeze_secondary_cpus(int primary, bool suspend)
        return error;
 }
 
-void __weak arch_enable_nonboot_cpus_begin(void)
+void __weak arch_thaw_secondary_cpus_begin(void)
 {
 }
 
-void __weak arch_enable_nonboot_cpus_end(void)
+void __weak arch_thaw_secondary_cpus_end(void)
 {
 }
 
-void enable_nonboot_cpus(void)
+void thaw_secondary_cpus(void)
 {
        int cpu, error;
 
@@ -1405,7 +1421,7 @@ void enable_nonboot_cpus(void)
 
        pr_info("Enabling non-boot CPUs ...\n");
 
-       arch_enable_nonboot_cpus_begin();
+       arch_thaw_secondary_cpus_begin();
 
        for_each_cpu(cpu, frozen_cpus) {
                trace_suspend_resume(TPS("CPU_ON"), cpu, true);
@@ -1418,7 +1434,7 @@ void enable_nonboot_cpus(void)
                pr_warn("Error taking CPU%d up: %d\n", cpu, error);
        }
 
-       arch_enable_nonboot_cpus_end();
+       arch_thaw_secondary_cpus_end();
 
        cpumask_clear(frozen_cpus);
 out:
@@ -1549,7 +1565,7 @@ static struct cpuhp_step cpuhp_hp_states[] = {
        [CPUHP_BRINGUP_CPU] = {
                .name                   = "cpu:bringup",
                .startup.single         = bringup_cpu,
-               .teardown.single        = NULL,
+               .teardown.single        = finish_cpu,
                .cant_stop              = true,
        },
        /* Final state before CPU kills itself */