Commit d9c5ed0a authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: x86: Don't take kvm->lock when iterating over vCPUs in suspend notifier



When queueing vCPU PVCLOCK updates in response to SUSPEND or HIBERNATE,
don't take kvm->lock as doing so can trigger a largely theoretical
deadlock, it is perfectly safe to iterate over the xarray of vCPUs without
holding kvm->lock, and kvm->lock doesn't protect kvm_set_guest_paused() in
any way (pv_time.active and pvclock_set_guest_stopped_request are
protected by vcpu->mutex, not kvm->lock).

Reported-by: default avatar <syzbot+352e553a86e0d75f5120@syzkaller.appspotmail.com>
Closes: https://lore.kernel.org/all/677c0f36.050a0220.3b3668.0014.GAE@google.com


Fixes: 7d62874f ("kvm: x86: implement KVM PM-notifier")
Reviewed-by: default avatarPaul Durrant <paul@xen.org>
Link: https://lore.kernel.org/r/20250201013827.680235-2-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent a64dcfb4
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -6907,7 +6907,6 @@ static int kvm_arch_suspend_notifier(struct kvm *kvm)
	unsigned long i;
	int ret = 0;

	mutex_lock(&kvm->lock);
	kvm_for_each_vcpu(i, vcpu, kvm) {
		if (!vcpu->arch.pv_time.active)
			continue;
@@ -6919,7 +6918,6 @@ static int kvm_arch_suspend_notifier(struct kvm *kvm)
			break;
		}
	}
	mutex_unlock(&kvm->lock);

	return ret ? NOTIFY_BAD : NOTIFY_DONE;
}