aboutsummaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2013-09-10 06:58:35 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2013-09-30 03:21:46 -0400
commit4a937f96f3a29c58b7edd349d2e4dfac371efdf2 (patch)
tree67471522814264ea197e724a1ca09a424bdbba6c /virt
parent4fa92fb25ae5a2d79d872ab54df511c831b1f363 (diff)
KVM: protect kvm_usage_count with its own spinlock
The VM list need not be protected by a raw spinlock. Separate the two so that kvm_lock can be made non-raw. Cc: kvm@vger.kernel.org Cc: gleb@redhat.com Cc: jan.kiszka@siemens.com Reviewed-by: Gleb Natapov <gleb@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'virt')
-rw-r--r--virt/kvm/kvm_main.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 426051d66173..eb94343c2ed2 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -71,6 +71,7 @@ MODULE_LICENSE("GPL");
71 */ 71 */
72 72
73DEFINE_RAW_SPINLOCK(kvm_lock); 73DEFINE_RAW_SPINLOCK(kvm_lock);
74static DEFINE_RAW_SPINLOCK(kvm_count_lock);
74LIST_HEAD(vm_list); 75LIST_HEAD(vm_list);
75 76
76static cpumask_var_t cpus_hardware_enabled; 77static cpumask_var_t cpus_hardware_enabled;
@@ -2683,10 +2684,10 @@ static void hardware_enable_nolock(void *junk)
2683 2684
2684static void hardware_enable(void) 2685static void hardware_enable(void)
2685{ 2686{
2686 raw_spin_lock(&kvm_lock); 2687 raw_spin_lock(&kvm_count_lock);
2687 if (kvm_usage_count) 2688 if (kvm_usage_count)
2688 hardware_enable_nolock(NULL); 2689 hardware_enable_nolock(NULL);
2689 raw_spin_unlock(&kvm_lock); 2690 raw_spin_unlock(&kvm_count_lock);
2690} 2691}
2691 2692
2692static void hardware_disable_nolock(void *junk) 2693static void hardware_disable_nolock(void *junk)
@@ -2701,10 +2702,10 @@ static void hardware_disable_nolock(void *junk)
2701 2702
2702static void hardware_disable(void) 2703static void hardware_disable(void)
2703{ 2704{
2704 raw_spin_lock(&kvm_lock); 2705 raw_spin_lock(&kvm_count_lock);
2705 if (kvm_usage_count) 2706 if (kvm_usage_count)
2706 hardware_disable_nolock(NULL); 2707 hardware_disable_nolock(NULL);
2707 raw_spin_unlock(&kvm_lock); 2708 raw_spin_unlock(&kvm_count_lock);
2708} 2709}
2709 2710
2710static void hardware_disable_all_nolock(void) 2711static void hardware_disable_all_nolock(void)
@@ -2718,16 +2719,16 @@ static void hardware_disable_all_nolock(void)
2718 2719
2719static void hardware_disable_all(void) 2720static void hardware_disable_all(void)
2720{ 2721{
2721 raw_spin_lock(&kvm_lock); 2722 raw_spin_lock(&kvm_count_lock);
2722 hardware_disable_all_nolock(); 2723 hardware_disable_all_nolock();
2723 raw_spin_unlock(&kvm_lock); 2724 raw_spin_unlock(&kvm_count_lock);
2724} 2725}
2725 2726
2726static int hardware_enable_all(void) 2727static int hardware_enable_all(void)
2727{ 2728{
2728 int r = 0; 2729 int r = 0;
2729 2730
2730 raw_spin_lock(&kvm_lock); 2731 raw_spin_lock(&kvm_count_lock);
2731 2732
2732 kvm_usage_count++; 2733 kvm_usage_count++;
2733 if (kvm_usage_count == 1) { 2734 if (kvm_usage_count == 1) {
@@ -2740,7 +2741,7 @@ static int hardware_enable_all(void)
2740 } 2741 }
2741 } 2742 }
2742 2743
2743 raw_spin_unlock(&kvm_lock); 2744 raw_spin_unlock(&kvm_count_lock);
2744 2745
2745 return r; 2746 return r;
2746} 2747}
@@ -3130,7 +3131,7 @@ static int kvm_suspend(void)
3130static void kvm_resume(void) 3131static void kvm_resume(void)
3131{ 3132{
3132 if (kvm_usage_count) { 3133 if (kvm_usage_count) {
3133 WARN_ON(raw_spin_is_locked(&kvm_lock)); 3134 WARN_ON(raw_spin_is_locked(&kvm_count_lock));
3134 hardware_enable_nolock(NULL); 3135 hardware_enable_nolock(NULL);
3135 } 3136 }
3136} 3137}