Commit fb3600cc authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

KVM: Use syscore_ops instead of sysdev class and sysdev

KVM uses a sysdev class and a sysdev for executing kvm_suspend()
after interrupts have been turned off on the boot CPU (during system
suspend) and for executing kvm_resume() before turning on interrupts
on the boot CPU (during system resume).  However, since both of these
functions ignore their arguments, the entire mechanism may be
replaced with a struct syscore_ops object which is simpler.
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Acked-by: default avatarAvi Kivity <avi@redhat.com>
parent 134fac3f
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/cpumask.h> #include <linux/cpumask.h>
...@@ -2447,33 +2447,26 @@ static void kvm_exit_debug(void) ...@@ -2447,33 +2447,26 @@ static void kvm_exit_debug(void)
debugfs_remove(kvm_debugfs_dir); debugfs_remove(kvm_debugfs_dir);
} }
static int kvm_suspend(struct sys_device *dev, pm_message_t state) static int kvm_suspend(void)
{ {
if (kvm_usage_count) if (kvm_usage_count)
hardware_disable_nolock(NULL); hardware_disable_nolock(NULL);
return 0; return 0;
} }
static int kvm_resume(struct sys_device *dev) static void kvm_resume(void)
{ {
if (kvm_usage_count) { if (kvm_usage_count) {
WARN_ON(raw_spin_is_locked(&kvm_lock)); WARN_ON(raw_spin_is_locked(&kvm_lock));
hardware_enable_nolock(NULL); hardware_enable_nolock(NULL);
} }
return 0;
} }
static struct sysdev_class kvm_sysdev_class = { static struct syscore_ops kvm_syscore_ops = {
.name = "kvm",
.suspend = kvm_suspend, .suspend = kvm_suspend,
.resume = kvm_resume, .resume = kvm_resume,
}; };
static struct sys_device kvm_sysdev = {
.id = 0,
.cls = &kvm_sysdev_class,
};
struct page *bad_page; struct page *bad_page;
pfn_t bad_pfn; pfn_t bad_pfn;
...@@ -2557,14 +2550,6 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, ...@@ -2557,14 +2550,6 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
goto out_free_2; goto out_free_2;
register_reboot_notifier(&kvm_reboot_notifier); register_reboot_notifier(&kvm_reboot_notifier);
r = sysdev_class_register(&kvm_sysdev_class);
if (r)
goto out_free_3;
r = sysdev_register(&kvm_sysdev);
if (r)
goto out_free_4;
/* A kmem cache lets us meet the alignment requirements of fx_save. */ /* A kmem cache lets us meet the alignment requirements of fx_save. */
if (!vcpu_align) if (!vcpu_align)
vcpu_align = __alignof__(struct kvm_vcpu); vcpu_align = __alignof__(struct kvm_vcpu);
...@@ -2572,7 +2557,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, ...@@ -2572,7 +2557,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
0, NULL); 0, NULL);
if (!kvm_vcpu_cache) { if (!kvm_vcpu_cache) {
r = -ENOMEM; r = -ENOMEM;
goto out_free_5; goto out_free_3;
} }
r = kvm_async_pf_init(); r = kvm_async_pf_init();
...@@ -2589,6 +2574,8 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, ...@@ -2589,6 +2574,8 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
goto out_unreg; goto out_unreg;
} }
register_syscore_ops(&kvm_syscore_ops);
kvm_preempt_ops.sched_in = kvm_sched_in; kvm_preempt_ops.sched_in = kvm_sched_in;
kvm_preempt_ops.sched_out = kvm_sched_out; kvm_preempt_ops.sched_out = kvm_sched_out;
...@@ -2600,10 +2587,6 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, ...@@ -2600,10 +2587,6 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
kvm_async_pf_deinit(); kvm_async_pf_deinit();
out_free: out_free:
kmem_cache_destroy(kvm_vcpu_cache); kmem_cache_destroy(kvm_vcpu_cache);
out_free_5:
sysdev_unregister(&kvm_sysdev);
out_free_4:
sysdev_class_unregister(&kvm_sysdev_class);
out_free_3: out_free_3:
unregister_reboot_notifier(&kvm_reboot_notifier); unregister_reboot_notifier(&kvm_reboot_notifier);
unregister_cpu_notifier(&kvm_cpu_notifier); unregister_cpu_notifier(&kvm_cpu_notifier);
...@@ -2631,8 +2614,7 @@ void kvm_exit(void) ...@@ -2631,8 +2614,7 @@ void kvm_exit(void)
misc_deregister(&kvm_dev); misc_deregister(&kvm_dev);
kmem_cache_destroy(kvm_vcpu_cache); kmem_cache_destroy(kvm_vcpu_cache);
kvm_async_pf_deinit(); kvm_async_pf_deinit();
sysdev_unregister(&kvm_sysdev); unregister_syscore_ops(&kvm_syscore_ops);
sysdev_class_unregister(&kvm_sysdev_class);
unregister_reboot_notifier(&kvm_reboot_notifier); unregister_reboot_notifier(&kvm_reboot_notifier);
unregister_cpu_notifier(&kvm_cpu_notifier); unregister_cpu_notifier(&kvm_cpu_notifier);
on_each_cpu(hardware_disable_nolock, NULL, 1); on_each_cpu(hardware_disable_nolock, NULL, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment