diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2011-03-23 17:16:23 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-03-23 17:16:23 -0400 |
commit | fb3600cc50302c9577b76838fcac1ee78828007d (patch) | |
tree | b5a2fe372bfe582525b165c55a3c0034bfe02665 | |
parent | 134fac3f457f3dd753ecdb25e6da3e5f6629f696 (diff) |
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: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Avi Kivity <avi@redhat.com>
-rw-r--r-- | virt/kvm/kvm_main.c | 34 |
1 files changed, 8 insertions, 26 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 1fa0d292119a..24444527f422 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/debugfs.h> | 30 | #include <linux/debugfs.h> |
31 | #include <linux/highmem.h> | 31 | #include <linux/highmem.h> |
32 | #include <linux/file.h> | 32 | #include <linux/file.h> |
33 | #include <linux/sysdev.h> | 33 | #include <linux/syscore_ops.h> |
34 | #include <linux/cpu.h> | 34 | #include <linux/cpu.h> |
35 | #include <linux/sched.h> | 35 | #include <linux/sched.h> |
36 | #include <linux/cpumask.h> | 36 | #include <linux/cpumask.h> |
@@ -2447,33 +2447,26 @@ static void kvm_exit_debug(void) | |||
2447 | debugfs_remove(kvm_debugfs_dir); | 2447 | debugfs_remove(kvm_debugfs_dir); |
2448 | } | 2448 | } |
2449 | 2449 | ||
2450 | static int kvm_suspend(struct sys_device *dev, pm_message_t state) | 2450 | static int kvm_suspend(void) |
2451 | { | 2451 | { |
2452 | if (kvm_usage_count) | 2452 | if (kvm_usage_count) |
2453 | hardware_disable_nolock(NULL); | 2453 | hardware_disable_nolock(NULL); |
2454 | return 0; | 2454 | return 0; |
2455 | } | 2455 | } |
2456 | 2456 | ||
2457 | static int kvm_resume(struct sys_device *dev) | 2457 | static void kvm_resume(void) |
2458 | { | 2458 | { |
2459 | if (kvm_usage_count) { | 2459 | if (kvm_usage_count) { |
2460 | WARN_ON(raw_spin_is_locked(&kvm_lock)); | 2460 | WARN_ON(raw_spin_is_locked(&kvm_lock)); |
2461 | hardware_enable_nolock(NULL); | 2461 | hardware_enable_nolock(NULL); |
2462 | } | 2462 | } |
2463 | return 0; | ||
2464 | } | 2463 | } |
2465 | 2464 | ||
2466 | static struct sysdev_class kvm_sysdev_class = { | 2465 | static struct syscore_ops kvm_syscore_ops = { |
2467 | .name = "kvm", | ||
2468 | .suspend = kvm_suspend, | 2466 | .suspend = kvm_suspend, |
2469 | .resume = kvm_resume, | 2467 | .resume = kvm_resume, |
2470 | }; | 2468 | }; |
2471 | 2469 | ||
2472 | static struct sys_device kvm_sysdev = { | ||
2473 | .id = 0, | ||
2474 | .cls = &kvm_sysdev_class, | ||
2475 | }; | ||
2476 | |||
2477 | struct page *bad_page; | 2470 | struct page *bad_page; |
2478 | pfn_t bad_pfn; | 2471 | pfn_t bad_pfn; |
2479 | 2472 | ||
@@ -2557,14 +2550,6 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, | |||
2557 | goto out_free_2; | 2550 | goto out_free_2; |
2558 | register_reboot_notifier(&kvm_reboot_notifier); | 2551 | register_reboot_notifier(&kvm_reboot_notifier); |
2559 | 2552 | ||
2560 | r = sysdev_class_register(&kvm_sysdev_class); | ||
2561 | if (r) | ||
2562 | goto out_free_3; | ||
2563 | |||
2564 | r = sysdev_register(&kvm_sysdev); | ||
2565 | if (r) | ||
2566 | goto out_free_4; | ||
2567 | |||
2568 | /* A kmem cache lets us meet the alignment requirements of fx_save. */ | 2553 | /* A kmem cache lets us meet the alignment requirements of fx_save. */ |
2569 | if (!vcpu_align) | 2554 | if (!vcpu_align) |
2570 | vcpu_align = __alignof__(struct kvm_vcpu); | 2555 | vcpu_align = __alignof__(struct kvm_vcpu); |
@@ -2572,7 +2557,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, | |||
2572 | 0, NULL); | 2557 | 0, NULL); |
2573 | if (!kvm_vcpu_cache) { | 2558 | if (!kvm_vcpu_cache) { |
2574 | r = -ENOMEM; | 2559 | r = -ENOMEM; |
2575 | goto out_free_5; | 2560 | goto out_free_3; |
2576 | } | 2561 | } |
2577 | 2562 | ||
2578 | r = kvm_async_pf_init(); | 2563 | r = kvm_async_pf_init(); |
@@ -2589,6 +2574,8 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align, | |||
2589 | goto out_unreg; | 2574 | goto out_unreg; |
2590 | } | 2575 | } |
2591 | 2576 | ||
2577 | register_syscore_ops(&kvm_syscore_ops); | ||
2578 | |||
2592 | kvm_preempt_ops.sched_in = kvm_sched_in; | 2579 | kvm_preempt_ops.sched_in = kvm_sched_in; |
2593 | kvm_preempt_ops.sched_out = kvm_sched_out; | 2580 | kvm_preempt_ops.sched_out = kvm_sched_out; |
2594 | 2581 | ||
@@ -2600,10 +2587,6 @@ out_unreg: | |||
2600 | kvm_async_pf_deinit(); | 2587 | kvm_async_pf_deinit(); |
2601 | out_free: | 2588 | out_free: |
2602 | kmem_cache_destroy(kvm_vcpu_cache); | 2589 | kmem_cache_destroy(kvm_vcpu_cache); |
2603 | out_free_5: | ||
2604 | sysdev_unregister(&kvm_sysdev); | ||
2605 | out_free_4: | ||
2606 | sysdev_class_unregister(&kvm_sysdev_class); | ||
2607 | out_free_3: | 2590 | out_free_3: |
2608 | unregister_reboot_notifier(&kvm_reboot_notifier); | 2591 | unregister_reboot_notifier(&kvm_reboot_notifier); |
2609 | unregister_cpu_notifier(&kvm_cpu_notifier); | 2592 | unregister_cpu_notifier(&kvm_cpu_notifier); |
@@ -2631,8 +2614,7 @@ void kvm_exit(void) | |||
2631 | misc_deregister(&kvm_dev); | 2614 | misc_deregister(&kvm_dev); |
2632 | kmem_cache_destroy(kvm_vcpu_cache); | 2615 | kmem_cache_destroy(kvm_vcpu_cache); |
2633 | kvm_async_pf_deinit(); | 2616 | kvm_async_pf_deinit(); |
2634 | sysdev_unregister(&kvm_sysdev); | 2617 | unregister_syscore_ops(&kvm_syscore_ops); |
2635 | sysdev_class_unregister(&kvm_sysdev_class); | ||
2636 | unregister_reboot_notifier(&kvm_reboot_notifier); | 2618 | unregister_reboot_notifier(&kvm_reboot_notifier); |
2637 | unregister_cpu_notifier(&kvm_cpu_notifier); | 2619 | unregister_cpu_notifier(&kvm_cpu_notifier); |
2638 | on_each_cpu(hardware_disable_nolock, NULL, 1); | 2620 | on_each_cpu(hardware_disable_nolock, NULL, 1); |