Index: kvm_main.c =================================================================== --- kvm_main.c (revision 4328) +++ kvm_main.c (working copy) @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -2052,6 +2053,29 @@ .priority = 0, }; +static int kvm_suspend(struct sys_device *dev, pm_message_t state) +{ + on_each_cpu(kvm_arch_ops->hardware_disable, 0, 0, 1); + return 0; +} + +static int kvm_resume(struct sys_device *dev) +{ + on_each_cpu(kvm_arch_ops->hardware_enable, 0, 0, 1); + return 0; +} + +static struct sysdev_class kvm_sysclass = { + .resume = kvm_resume, + .suspend = kvm_suspend, + set_kset_name("kvm"), +}; + +static struct sys_device kvm_sysdevice = { + .id = 0, + .cls = &kvm_sysclass, +}; + static __init void kvm_init_debug(void) { struct kvm_stats_debugfs_item *p; @@ -2100,6 +2124,13 @@ on_each_cpu(kvm_arch_ops->hardware_enable, 0, 0, 1); register_reboot_notifier(&kvm_reboot_notifier); + r = sysdev_class_register(&kvm_sysclass); + if (r) + return r; + r = sysdev_register(&kvm_sysdevice); + if (r) + return r; + kvm_chardev_ops.owner = module; r = misc_register(&kvm_dev); @@ -2121,6 +2152,9 @@ { misc_deregister(&kvm_dev); + sysdev_unregister(&kvm_sysdevice); + sysdev_class_unregister(&kvm_sysclass); + unregister_reboot_notifier(&kvm_reboot_notifier); on_each_cpu(kvm_arch_ops->hardware_disable, 0, 0, 1); kvm_arch_ops->hardware_unsetup();