On 06/12/2017 19:52, Radim Krčmář wrote: >> smp_mb__after_atomic(); >> max_irr = kvm_apic_update_irr(vcpu, vmx->pi_desc.pir); > I think the optimization (partly livelock protection) is not worth the > overhead of two IRR scans for non-nested guests. Please make > kvm_apic_update_irr() return both prev_max_irr and max_irr in one pass. You could also return max_irr in an int*, and give the function a "bool" return type for max_irr > prev_max_irr. That is more efficient because you can do the check in the "if (pir_val)" conditional of __kvm_apic_update_irr. Paolo >> + >> + /* >> + * If we are running L2 and L1 has a new pending interrupt >> + * which can be injected, we should re-evaluate >> + * what should be done with this new L1 interrupt. >> + */ >> + if (is_guest_mode(vcpu) && (max_irr > prev_max_irr)) >> + kvm_make_request(KVM_REQ_EVENT, vcpu); > We don't need anything from KVM_REQ_EVENT and only use it to abort the > VM entry, kvm_vcpu_exiting_guest_mode() is better for that. > >> } else { >> - max_irr = kvm_lapic_find_highest_irr(vcpu); >> + max_irr = prev_max_irr; >> } >> + >> vmx_hwapic_irr_update(vcpu, max_irr); > We also should just inject the interrupt if L2 is run without > nested_exit_on_intr(), maybe reusing the check in vmx_hwapic_irr_update?