Re: [PATCH] KVM: Deal with nested sleeps in kvm_vcpu_block()

From: Paolo Bonzini
Date: Wed Nov 30 2022 - 12:04:29 EST


On 11/30/22 17:19, Space Meyer wrote:
bool kvm_vcpu_block(struct kvm_vcpu *vcpu)
{
+ DEFINE_WAIT_FUNC(vcpu_block_wait, woken_wake_function);
struct rcuwait *wait = kvm_arch_vcpu_get_wait(vcpu);
bool waited = false;
@@ -3437,13 +3439,11 @@ bool kvm_vcpu_block(struct kvm_vcpu *vcpu)
preempt_enable();
for (;;) {
- set_current_state(TASK_INTERRUPTIBLE);
-
if (kvm_vcpu_check_block(vcpu) < 0)
break;
waited = true;
- schedule();
+ wait_woken(&vcpu_block_wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
}

Also, this does not work I think, because there is add_wait_queue()/remove_wait_queue() pair. Adding it is not easy because KVM is using a struct rcuwait here instead of a wait_queue_t.

Paolo