On Mon, May 24, 2021 at 05:55:18PM +0200, Paolo Bonzini wrote: > On 10/05/21 19:26, Marcelo Tosatti wrote: > > +void vmx_pi_start_assignment(struct kvm *kvm) > > +{ > > + struct kvm_vcpu *vcpu; > > + int i; > > + > > + if (!irq_remapping_cap(IRQ_POSTING_CAP)) > > + return; > > + > > + /* > > + * Wakeup will cause the vCPU to bail out of kvm_vcpu_block() and > > + * go back through vcpu_block(). > > + */ > > + kvm_for_each_vcpu(i, vcpu, kvm) { > > + if (!kvm_vcpu_apicv_active(vcpu)) > > + continue; > > + > > + kvm_vcpu_wake_up(vcpu); > > Would you still need the check_block callback, if you also added a > kvm_make_request(KVM_REQ_EVENT)? > > In fact, since this is entirely not a hot path, can you just do > kvm_make_all_cpus_request(kvm, KVM_REQ_EVENT) instead of this loop? > > Thanks, > > Paolo Hi Paolo, Don't think so: int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) { return kvm_vcpu_running(vcpu) || kvm_vcpu_has_events(vcpu); } static int kvm_vcpu_check_block(struct kvm_vcpu *vcpu) { int ret = -EINTR; int idx = srcu_read_lock(&vcpu->kvm->srcu); if (kvm_arch_vcpu_runnable(vcpu)) { kvm_make_request(KVM_REQ_UNHALT, vcpu); <---- don't want KVM_REQ_UNHALT goto out; } if (kvm_cpu_has_pending_timer(vcpu)) goto out; if (signal_pending(current)) goto out; ret = 0; out: srcu_read_unlock(&vcpu->kvm->srcu, idx); return ret; } See previous discussion: Date: Wed, 12 May 2021 14:41:56 +0000 From: Sean Christopherson <seanjc@xxxxxxxxxx> To: Marcelo Tosatti <mtosatti@xxxxxxxxxx> Cc: Peter Xu <peterx@xxxxxxxxxx>, Paolo Bonzini <pbonzini@xxxxxxxxxx>, kvm@xxxxxxxxxxxxxxx, Alex Williamson <alex.williamson@xxxxxxxxxx>, Pei Zhang <pezhang@xxxxxxxxxx> Subject: Re: [patch 4/4] KVM: VMX: update vcpu posted-interrupt descriptor when assigning device On Tue, May 11, 2021, Marcelo Tosatti wrote: > > The KVM_REQ_UNBLOCK patch will resume execution even any such event > > even without any such event > > > occuring. So the behaviour would be different from baremetal. I agree with Marcelo, we don't want to spuriously unhalt the vCPU. It's legal, albeit risky, to do something like hlt /* #UD to triple fault if this CPU is awakened. */ ud2 when offlining a CPU, in which case the spurious wake event will crash the guest.