On 05/05/20 09:55, Suravee Suthikulpanit wrote: >> WARN_ON((vmcb->control.int_ctl & (AVIC_ENABLE_MASK | V_IRQ_MASK)) >> == (AVIC_ENABLE_MASK | V_IRQ_MASK)); > > Based on my experiment, it seems that the hardware sets the V_IRQ_MASK bit > when #VMEXIT despite this bit being ignored when AVIC is enabled. > (I'll double check w/ HW team on this.) In this case, I don't think we can > use the WARN_ON() as suggested above. Indeed this is even documented: NOTE: This value is written back to the VMCB at #VMEXIT. This field is ignored on VMRUN when AVIC is enabled. > I think we should keep the warning in the svm_set_vintr() since we want > to know if the V_IRQ, V_INTR_PRIO, V_IGN_TPR, and V_INTR_VECTOR are ignored when > calling svm_set_vintr(). > > Instead, I would consider explicitly call kvm_vcpu_update_apicv() since > it would be benefit from not having to wait for the next vcpu_enter_guest for > this vcpu to process the request. This is less confusing to me. In this case, > we would need to kvm_clear_request(KVM_REQ_APICV_UPDATE) for this vcpu as well. > > On the other hand, would be it useful to implement > kvm_make_all_cpus_request_but_self(), > which sends request to all other vcpus excluding itself? Yes, that's also a possibility. It's not too much extra complication if we add a new argument to kvm_make_vcpus_request_mask, like this: diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 74bdb7bf3295..8f9dadb1ef42 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -258,7 +258,7 @@ static inline bool kvm_kick_many_cpus(const struct cpumask *cpus, bool wait) return true; } -bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req, +bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req, struct kvm_vcpu *except, unsigned long *vcpu_bitmap, cpumask_var_t tmp) { int i, cpu, me; @@ -270,6 +270,8 @@ bool kvm_make_vcpus_request_mask(struct kvm *kvm, unsigned int req, kvm_for_each_vcpu(i, vcpu, kvm) { if (vcpu_bitmap && !test_bit(i, vcpu_bitmap)) continue; + if (vcpu == except) + continue; kvm_make_request(req, vcpu); cpu = vcpu->cpu; Paolo