On Fri, May 07, 2021, Marcelo Tosatti wrote: > Index: kvm/arch/x86/kvm/vmx/posted_intr.c > =================================================================== > --- kvm.orig/arch/x86/kvm/vmx/posted_intr.c > +++ kvm/arch/x86/kvm/vmx/posted_intr.c > @@ -203,6 +203,25 @@ void pi_post_block(struct kvm_vcpu *vcpu > local_irq_enable(); > } > > +int vmx_vcpu_check_block(struct kvm_vcpu *vcpu) > +{ > + struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu); > + > + if (!irq_remapping_cap(IRQ_POSTING_CAP)) > + return 0; > + > + if (!kvm_vcpu_apicv_active(vcpu)) > + return 0; > + > + if (!kvm_arch_has_assigned_device(vcpu->kvm)) > + return 0; > + > + if (pi_desc->nv == POSTED_INTR_WAKEUP_VECTOR) > + return 0; > + > + return 1; IIUC, the logic is to bail out of the block loop if the VM has an assigned device, but the blocking vCPU didn't reconfigure the PI.NV to the wakeup vector, i.e. the assigned device came along after the initial check in vcpu_block(). That makes sense, but you can add a comment somewhere in/above this function? > +} > + > /* > * Handler for POSTED_INTERRUPT_WAKEUP_VECTOR. > */ > @@ -236,6 +255,26 @@ bool pi_has_pending_interrupt(struct kvm > (pi_test_sn(pi_desc) && !pi_is_pir_empty(pi_desc)); > } > > +void vmx_pi_start_assignment(struct kvm *kvm, int device_count) > +{ > + struct kvm_vcpu *vcpu; > + int i; > + > + if (!irq_remapping_cap(IRQ_POSTING_CAP)) > + return; > + > + /* only care about first device assignment */ > + if (device_count != 1) > + return; > + > + /* Update wakeup vector and add vcpu to blocked_vcpu_list */ Can you expand this comment, too? Specifically, I think what you're saying is that the wakeup will cause the vCPU to bail out of kvm_vcpu_block() and go back through vcpu_block() and thus pi_pre_block(). > + kvm_for_each_vcpu(i, vcpu, kvm) { > + if (!kvm_vcpu_apicv_active(vcpu)) > + continue; > + > + kvm_vcpu_kick(vcpu); Actually, can't we avoid the full kick and instead just do kvm_vcpu_wake_up()? If the vCPU is in guest mode, i.e. kvm_arch_vcpu_should_kick() returns true, then by definition it can't be blocking. And if it about to block, it's guaranteed to see the assigned device. > + } > +}