Message ID | 61dcd6722743bf221f6c612e120a9e2350d5a72f.1663869838.git.isaku.yamahata@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: hardware enable/disable reorganize | expand |
On Thu, Sep 22, 2022, isaku.yamahata@intel.com wrote: > From: Isaku Yamahata <isaku.yamahata@intel.com> > > Factor out the logic on reboot event as arch hook. Later kvm/x86 overrides > it. > > Suggested-by: Sean Christopherson <seanjc@google.com> > Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com> > --- ... > @@ -5135,6 +5141,8 @@ static void kvm_del_vm(void) > static int kvm_reboot(struct notifier_block *notifier, unsigned long val, > void *v) > { > + int r; > + > /* > * Some (well, at least mine) BIOSes hang on reboot if > * in vmx root mode. > @@ -5143,8 +5151,14 @@ static int kvm_reboot(struct notifier_block *notifier, unsigned long val, > */ > pr_info("kvm: exiting hardware virtualization\n"); > kvm_rebooting = true; > - on_each_cpu(hardware_disable_nolock, NULL, 1); > - return NOTIFY_OK; > + > + /* This hook is called without cpuhotplug disabled. */ > + cpus_read_lock(); > + mutex_lock(&kvm_lock); > + r = kvm_arch_reboot(val); Unless there's a valid use case for rejecting/stopping reboot, which I'm pretty sure there isn't, don't allow arch code to return a value. I.e. return NOTIFY_OK unconditionally from kvm_reboot() and drop the return from kvm_arch_reboot(). > + mutex_unlock(&kvm_lock); > + cpus_read_unlock(); > + return r; > } > > static struct notifier_block kvm_reboot_notifier = { > -- > 2.25.1 >
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 3fbb01bbac98..084ee8a13e9f 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1434,6 +1434,8 @@ void kvm_arch_create_vcpu_debugfs(struct kvm_vcpu *vcpu, struct dentry *debugfs_ static inline void kvm_create_vcpu_debugfs(struct kvm_vcpu *vcpu) {} #endif +int kvm_arch_reboot(int val); + int kvm_arch_hardware_enable(void); void kvm_arch_hardware_disable(void); int kvm_arch_hardware_setup(void *opaque); diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index e2c8823786ff..58385000b73f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -1142,6 +1142,12 @@ int __weak kvm_arch_del_vm(int usage_count) return 0; } +int __weak kvm_arch_reboot(int val) +{ + on_each_cpu(hardware_disable_nolock, NULL, 1); + return NOTIFY_OK; +} + /* * Called just after removing the VM from the vm_list, but before doing any * other destruction. @@ -5135,6 +5141,8 @@ static void kvm_del_vm(void) static int kvm_reboot(struct notifier_block *notifier, unsigned long val, void *v) { + int r; + /* * Some (well, at least mine) BIOSes hang on reboot if * in vmx root mode. @@ -5143,8 +5151,14 @@ static int kvm_reboot(struct notifier_block *notifier, unsigned long val, */ pr_info("kvm: exiting hardware virtualization\n"); kvm_rebooting = true; - on_each_cpu(hardware_disable_nolock, NULL, 1); - return NOTIFY_OK; + + /* This hook is called without cpuhotplug disabled. */ + cpus_read_lock(); + mutex_lock(&kvm_lock); + r = kvm_arch_reboot(val); + mutex_unlock(&kvm_lock); + cpus_read_unlock(); + return r; } static struct notifier_block kvm_reboot_notifier = {