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>
This commit is contained in:
Родитель
4fa92fb25a
Коммит
4a937f96f3
|
@ -135,7 +135,11 @@ Name: kvm_lock
|
|||
Type: raw_spinlock
|
||||
Arch: any
|
||||
Protects: - vm_list
|
||||
- hardware virtualization enable/disable
|
||||
|
||||
Name: kvm_count_lock
|
||||
Type: raw_spinlock_t
|
||||
Arch: any
|
||||
Protects: - hardware virtualization enable/disable
|
||||
Comment: 'raw' because hardware enabling/disabling must be atomic /wrt
|
||||
migration.
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@ MODULE_LICENSE("GPL");
|
|||
*/
|
||||
|
||||
DEFINE_RAW_SPINLOCK(kvm_lock);
|
||||
static DEFINE_RAW_SPINLOCK(kvm_count_lock);
|
||||
LIST_HEAD(vm_list);
|
||||
|
||||
static cpumask_var_t cpus_hardware_enabled;
|
||||
|
@ -2683,10 +2684,10 @@ static void hardware_enable_nolock(void *junk)
|
|||
|
||||
static void hardware_enable(void)
|
||||
{
|
||||
raw_spin_lock(&kvm_lock);
|
||||
raw_spin_lock(&kvm_count_lock);
|
||||
if (kvm_usage_count)
|
||||
hardware_enable_nolock(NULL);
|
||||
raw_spin_unlock(&kvm_lock);
|
||||
raw_spin_unlock(&kvm_count_lock);
|
||||
}
|
||||
|
||||
static void hardware_disable_nolock(void *junk)
|
||||
|
@ -2701,10 +2702,10 @@ static void hardware_disable_nolock(void *junk)
|
|||
|
||||
static void hardware_disable(void)
|
||||
{
|
||||
raw_spin_lock(&kvm_lock);
|
||||
raw_spin_lock(&kvm_count_lock);
|
||||
if (kvm_usage_count)
|
||||
hardware_disable_nolock(NULL);
|
||||
raw_spin_unlock(&kvm_lock);
|
||||
raw_spin_unlock(&kvm_count_lock);
|
||||
}
|
||||
|
||||
static void hardware_disable_all_nolock(void)
|
||||
|
@ -2718,16 +2719,16 @@ static void hardware_disable_all_nolock(void)
|
|||
|
||||
static void hardware_disable_all(void)
|
||||
{
|
||||
raw_spin_lock(&kvm_lock);
|
||||
raw_spin_lock(&kvm_count_lock);
|
||||
hardware_disable_all_nolock();
|
||||
raw_spin_unlock(&kvm_lock);
|
||||
raw_spin_unlock(&kvm_count_lock);
|
||||
}
|
||||
|
||||
static int hardware_enable_all(void)
|
||||
{
|
||||
int r = 0;
|
||||
|
||||
raw_spin_lock(&kvm_lock);
|
||||
raw_spin_lock(&kvm_count_lock);
|
||||
|
||||
kvm_usage_count++;
|
||||
if (kvm_usage_count == 1) {
|
||||
|
@ -2740,7 +2741,7 @@ static int hardware_enable_all(void)
|
|||
}
|
||||
}
|
||||
|
||||
raw_spin_unlock(&kvm_lock);
|
||||
raw_spin_unlock(&kvm_count_lock);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
@ -3130,7 +3131,7 @@ static int kvm_suspend(void)
|
|||
static void kvm_resume(void)
|
||||
{
|
||||
if (kvm_usage_count) {
|
||||
WARN_ON(raw_spin_is_locked(&kvm_lock));
|
||||
WARN_ON(raw_spin_is_locked(&kvm_count_lock));
|
||||
hardware_enable_nolock(NULL);
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче