Skip to content

Commit 6c90e27

Browse files
Maxim Levitskybonzini
authored andcommitted
KVM: arm64: use kvm_trylock_all_vcpus when locking all vCPUs
JIRA: https://issues.redhat.com/browse/RHEL-95318 commit b586c5d Author: Maxim Levitsky <[email protected]> Date: Mon May 12 14:04:06 2025 -0400 KVM: arm64: use kvm_trylock_all_vcpus when locking all vCPUs Use kvm_trylock_all_vcpus instead of a custom implementation when locking all vCPUs of a VM, to avoid triggering a lockdep warning, in the case in which the VM is configured to have more than MAX_LOCK_DEPTH vCPUs. This fixes the following false lockdep warning: [ 328.171264] BUG: MAX_LOCK_DEPTH too low! [ 328.175227] turning off the locking correctness validator. [ 328.180726] Please attach the output of /proc/lock_stat to the bug report [ 328.187531] depth: 48 max: 48! [ 328.190678] 48 locks held by qemu-kvm/11664: [ 328.194957] #0: ffff800086de5ba0 (&kvm->lock){+.+.}-{3:3}, at: kvm_ioctl_create_device+0x174/0x5b0 [ 328.204048] #1: ffff0800e78800b8 (&vcpu->mutex){+.+.}-{3:3}, at: lock_all_vcpus+0x16c/0x2a0 [ 328.212521] #2: ffff07ffeee51e98 (&vcpu->mutex){+.+.}-{3:3}, at: lock_all_vcpus+0x16c/0x2a0 [ 328.220991] #3: ffff0800dc7d80b8 (&vcpu->mutex){+.+.}-{3:3}, at: lock_all_vcpus+0x16c/0x2a0 [ 328.229463] #4: ffff07ffe0c980b8 (&vcpu->mutex){+.+.}-{3:3}, at: lock_all_vcpus+0x16c/0x2a0 [ 328.237934] #5: ffff0800a3883c78 (&vcpu->mutex){+.+.}-{3:3}, at: lock_all_vcpus+0x16c/0x2a0 [ 328.246405] #6: ffff07fffbe480b8 (&vcpu->mutex){+.+.}-{3:3}, at: lock_all_vcpus+0x16c/0x2a0 Suggested-by: Paolo Bonzini <[email protected]> Signed-off-by: Maxim Levitsky <[email protected]> Acked-by: Marc Zyngier <[email protected]> Acked-by: Peter Zijlstra (Intel) <[email protected]> Message-ID: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]> Signed-off-by: Maxim Levitsky <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 3272518 commit 6c90e27

File tree

6 files changed

+14
-60
lines changed

6 files changed

+14
-60
lines changed

arch/arm64/include/asm/kvm_host.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1196,9 +1196,6 @@ int __init populate_sysreg_config(const struct sys_reg_desc *sr,
11961196
unsigned int idx);
11971197
int __init populate_nv_trap_config(void);
11981198

1199-
bool lock_all_vcpus(struct kvm *kvm);
1200-
void unlock_all_vcpus(struct kvm *kvm);
1201-
12021199
void kvm_calculate_traps(struct kvm_vcpu *vcpu);
12031200

12041201
/* MMIO helpers */

arch/arm64/kvm/arch_timer.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1654,7 +1654,7 @@ int kvm_vm_ioctl_set_counter_offset(struct kvm *kvm,
16541654

16551655
mutex_lock(&kvm->lock);
16561656

1657-
if (lock_all_vcpus(kvm)) {
1657+
if (!kvm_trylock_all_vcpus(kvm)) {
16581658
set_bit(KVM_ARCH_FLAG_VM_COUNTER_OFFSET, &kvm->arch.flags);
16591659

16601660
/*
@@ -1666,7 +1666,7 @@ int kvm_vm_ioctl_set_counter_offset(struct kvm *kvm,
16661666
kvm->arch.timer_data.voffset = offset->counter_offset;
16671667
kvm->arch.timer_data.poffset = offset->counter_offset;
16681668

1669-
unlock_all_vcpus(kvm);
1669+
kvm_unlock_all_vcpus(kvm);
16701670
} else {
16711671
ret = -EBUSY;
16721672
}

arch/arm64/kvm/arm.c

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,49 +1897,6 @@ int kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
18971897
}
18981898
}
18991899

1900-
/* unlocks vcpus from @vcpu_lock_idx and smaller */
1901-
static void unlock_vcpus(struct kvm *kvm, int vcpu_lock_idx)
1902-
{
1903-
struct kvm_vcpu *tmp_vcpu;
1904-
1905-
for (; vcpu_lock_idx >= 0; vcpu_lock_idx--) {
1906-
tmp_vcpu = kvm_get_vcpu(kvm, vcpu_lock_idx);
1907-
mutex_unlock(&tmp_vcpu->mutex);
1908-
}
1909-
}
1910-
1911-
void unlock_all_vcpus(struct kvm *kvm)
1912-
{
1913-
lockdep_assert_held(&kvm->lock);
1914-
1915-
unlock_vcpus(kvm, atomic_read(&kvm->online_vcpus) - 1);
1916-
}
1917-
1918-
/* Returns true if all vcpus were locked, false otherwise */
1919-
bool lock_all_vcpus(struct kvm *kvm)
1920-
{
1921-
struct kvm_vcpu *tmp_vcpu;
1922-
unsigned long c;
1923-
1924-
lockdep_assert_held(&kvm->lock);
1925-
1926-
/*
1927-
* Any time a vcpu is in an ioctl (including running), the
1928-
* core KVM code tries to grab the vcpu->mutex.
1929-
*
1930-
* By grabbing the vcpu->mutex of all VCPUs we ensure that no
1931-
* other VCPUs can fiddle with the state while we access it.
1932-
*/
1933-
kvm_for_each_vcpu(c, tmp_vcpu, kvm) {
1934-
if (!mutex_trylock(&tmp_vcpu->mutex)) {
1935-
unlock_vcpus(kvm, c - 1);
1936-
return false;
1937-
}
1938-
}
1939-
1940-
return true;
1941-
}
1942-
19431900
static unsigned long nvhe_percpu_size(void)
19441901
{
19451902
return (unsigned long)CHOOSE_NVHE_SYM(__per_cpu_end) -

arch/arm64/kvm/vgic/vgic-init.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
9999
* concurrent vCPU ioctls for vCPUs already visible to userspace.
100100
*/
101101
ret = -EBUSY;
102-
if (!lock_all_vcpus(kvm))
102+
if (kvm_trylock_all_vcpus(kvm))
103103
return ret;
104104

105105
/*
@@ -167,7 +167,7 @@ int kvm_vgic_create(struct kvm *kvm, u32 type)
167167

168168
out_unlock:
169169
mutex_unlock(&kvm->arch.config_lock);
170-
unlock_all_vcpus(kvm);
170+
kvm_unlock_all_vcpus(kvm);
171171
return ret;
172172
}
173173

arch/arm64/kvm/vgic/vgic-its.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,7 +1999,7 @@ static int vgic_its_attr_regs_access(struct kvm_device *dev,
19991999

20002000
mutex_lock(&dev->kvm->lock);
20012001

2002-
if (!lock_all_vcpus(dev->kvm)) {
2002+
if (kvm_trylock_all_vcpus(dev->kvm)) {
20032003
mutex_unlock(&dev->kvm->lock);
20042004
return -EBUSY;
20052005
}
@@ -2034,7 +2034,7 @@ static int vgic_its_attr_regs_access(struct kvm_device *dev,
20342034
}
20352035
out:
20362036
mutex_unlock(&dev->kvm->arch.config_lock);
2037-
unlock_all_vcpus(dev->kvm);
2037+
kvm_unlock_all_vcpus(dev->kvm);
20382038
mutex_unlock(&dev->kvm->lock);
20392039
return ret;
20402040
}
@@ -2704,7 +2704,7 @@ static int vgic_its_ctrl(struct kvm *kvm, struct vgic_its *its, u64 attr)
27042704

27052705
mutex_lock(&kvm->lock);
27062706

2707-
if (!lock_all_vcpus(kvm)) {
2707+
if (kvm_trylock_all_vcpus(kvm)) {
27082708
mutex_unlock(&kvm->lock);
27092709
return -EBUSY;
27102710
}
@@ -2726,7 +2726,7 @@ static int vgic_its_ctrl(struct kvm *kvm, struct vgic_its *its, u64 attr)
27262726

27272727
mutex_unlock(&its->its_lock);
27282728
mutex_unlock(&kvm->arch.config_lock);
2729-
unlock_all_vcpus(kvm);
2729+
kvm_unlock_all_vcpus(kvm);
27302730
mutex_unlock(&kvm->lock);
27312731
return ret;
27322732
}

arch/arm64/kvm/vgic/vgic-kvm-device.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -268,15 +268,15 @@ static int vgic_set_common_attr(struct kvm_device *dev,
268268
return -ENXIO;
269269
mutex_lock(&dev->kvm->lock);
270270

271-
if (!lock_all_vcpus(dev->kvm)) {
271+
if (kvm_trylock_all_vcpus(dev->kvm)) {
272272
mutex_unlock(&dev->kvm->lock);
273273
return -EBUSY;
274274
}
275275

276276
mutex_lock(&dev->kvm->arch.config_lock);
277277
r = vgic_v3_save_pending_tables(dev->kvm);
278278
mutex_unlock(&dev->kvm->arch.config_lock);
279-
unlock_all_vcpus(dev->kvm);
279+
kvm_unlock_all_vcpus(dev->kvm);
280280
mutex_unlock(&dev->kvm->lock);
281281
return r;
282282
}
@@ -384,7 +384,7 @@ static int vgic_v2_attr_regs_access(struct kvm_device *dev,
384384

385385
mutex_lock(&dev->kvm->lock);
386386

387-
if (!lock_all_vcpus(dev->kvm)) {
387+
if (kvm_trylock_all_vcpus(dev->kvm)) {
388388
mutex_unlock(&dev->kvm->lock);
389389
return -EBUSY;
390390
}
@@ -409,7 +409,7 @@ static int vgic_v2_attr_regs_access(struct kvm_device *dev,
409409

410410
out:
411411
mutex_unlock(&dev->kvm->arch.config_lock);
412-
unlock_all_vcpus(dev->kvm);
412+
kvm_unlock_all_vcpus(dev->kvm);
413413
mutex_unlock(&dev->kvm->lock);
414414

415415
if (!ret && !is_write)
@@ -545,7 +545,7 @@ static int vgic_v3_attr_regs_access(struct kvm_device *dev,
545545

546546
mutex_lock(&dev->kvm->lock);
547547

548-
if (!lock_all_vcpus(dev->kvm)) {
548+
if (kvm_trylock_all_vcpus(dev->kvm)) {
549549
mutex_unlock(&dev->kvm->lock);
550550
return -EBUSY;
551551
}
@@ -589,7 +589,7 @@ static int vgic_v3_attr_regs_access(struct kvm_device *dev,
589589

590590
out:
591591
mutex_unlock(&dev->kvm->arch.config_lock);
592-
unlock_all_vcpus(dev->kvm);
592+
kvm_unlock_all_vcpus(dev->kvm);
593593
mutex_unlock(&dev->kvm->lock);
594594

595595
if (!ret && uaccess && !is_write) {

0 commit comments

Comments
 (0)