|
@@ -423,12 +423,7 @@ static void __init kvm_smp_prepare_boot_cpu(void)
|
|
|
kvm_spinlock_init();
|
|
|
}
|
|
|
|
|
|
-static void kvm_guest_cpu_online(void *dummy)
|
|
|
-{
|
|
|
- kvm_guest_cpu_init();
|
|
|
-}
|
|
|
-
|
|
|
-static void kvm_guest_cpu_offline(void *dummy)
|
|
|
+static void kvm_guest_cpu_offline(void)
|
|
|
{
|
|
|
kvm_disable_steal_time();
|
|
|
if (kvm_para_has_feature(KVM_FEATURE_PV_EOI))
|
|
@@ -437,29 +432,21 @@ static void kvm_guest_cpu_offline(void *dummy)
|
|
|
apf_task_wake_all();
|
|
|
}
|
|
|
|
|
|
-static int kvm_cpu_notify(struct notifier_block *self, unsigned long action,
|
|
|
- void *hcpu)
|
|
|
+static int kvm_cpu_online(unsigned int cpu)
|
|
|
{
|
|
|
- int cpu = (unsigned long)hcpu;
|
|
|
- switch (action) {
|
|
|
- case CPU_ONLINE:
|
|
|
- case CPU_DOWN_FAILED:
|
|
|
- case CPU_ONLINE_FROZEN:
|
|
|
- smp_call_function_single(cpu, kvm_guest_cpu_online, NULL, 0);
|
|
|
- break;
|
|
|
- case CPU_DOWN_PREPARE:
|
|
|
- case CPU_DOWN_PREPARE_FROZEN:
|
|
|
- smp_call_function_single(cpu, kvm_guest_cpu_offline, NULL, 1);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- return NOTIFY_OK;
|
|
|
+ local_irq_disable();
|
|
|
+ kvm_guest_cpu_init();
|
|
|
+ local_irq_enable();
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
-static struct notifier_block kvm_cpu_notifier = {
|
|
|
- .notifier_call = kvm_cpu_notify,
|
|
|
-};
|
|
|
+static int kvm_cpu_down_prepare(unsigned int cpu)
|
|
|
+{
|
|
|
+ local_irq_disable();
|
|
|
+ kvm_guest_cpu_offline();
|
|
|
+ local_irq_enable();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
#endif
|
|
|
|
|
|
static void __init kvm_apf_trap_init(void)
|
|
@@ -494,7 +481,9 @@ void __init kvm_guest_init(void)
|
|
|
|
|
|
#ifdef CONFIG_SMP
|
|
|
smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
|
|
|
- register_cpu_notifier(&kvm_cpu_notifier);
|
|
|
+ if (cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "x86/kvm:online",
|
|
|
+ kvm_cpu_online, kvm_cpu_down_prepare) < 0)
|
|
|
+ pr_err("kvm_guest: Failed to install cpu hotplug callbacks\n");
|
|
|
#else
|
|
|
kvm_guest_cpu_init();
|
|
|
#endif
|