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

From: Space Meyer
Date: Fri Dec 02 2022 - 10:53:03 EST


On Wed, Nov 30, 2022 at 5:59 PM Paolo Bonzini <pbonzini@xxxxxxxxxx> wrote:
>
> 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.

Ah, sorry. I really was a bit quick on this one. I agree nothing would ever call
woken_wake_function, hence my patch doesn't make sense. Looking at the rcuwait
code I don't see something similar to wait_woken.

Do you see some other way we could avoid the pattern susceptible to the nested
sleeping problem?