On 2014-03-09 08:33, Paolo Bonzini wrote: > Il 08/03/2014 10:21, Jan Kiszka ha scritto: >> On 2014-03-07 20:48, Paolo Bonzini wrote: >>> Il 07/03/2014 20:03, Jan Kiszka ha scritto: >>>> @@ -4631,22 +4631,8 @@ static void vmx_set_nmi_mask(struct kvm_vcpu >>>> *vcpu, bool masked) >>>> >>>> static int vmx_nmi_allowed(struct kvm_vcpu *vcpu) >>>> { >>>> - if (is_guest_mode(vcpu)) { >>>> - if (to_vmx(vcpu)->nested.nested_run_pending) >>>> - return 0; >>>> - if (nested_exit_on_nmi(vcpu)) { >>>> - nested_vmx_vmexit(vcpu, EXIT_REASON_EXCEPTION_NMI, >>>> - NMI_VECTOR | INTR_TYPE_NMI_INTR | >>>> - INTR_INFO_VALID_MASK, 0); >>>> - /* >>>> - * The NMI-triggered VM exit counts as injection: >>>> - * clear this one and block further NMIs. >>>> - */ >>>> - vcpu->arch.nmi_pending = 0; >>>> - vmx_set_nmi_mask(vcpu, true); >>>> - return 0; >>>> - } >>>> - } >>>> + if (to_vmx(vcpu)->nested.nested_run_pending) >>>> + return 0; >>>> >>>> if (!cpu_has_virtual_nmis() && to_vmx(vcpu)->soft_vnmi_blocked) >>>> return 0; >>>> @@ -4658,19 +4644,8 @@ static int vmx_nmi_allowed(struct kvm_vcpu >>>> *vcpu) >>>> >>>> static int vmx_interrupt_allowed(struct kvm_vcpu *vcpu) >>>> { >>>> - if (is_guest_mode(vcpu)) { >>>> - if (to_vmx(vcpu)->nested.nested_run_pending) >>>> - return 0; >>>> - if (nested_exit_on_intr(vcpu)) { >>>> - nested_vmx_vmexit(vcpu, EXIT_REASON_EXTERNAL_INTERRUPT, >>>> - 0, 0); >>>> - /* >>>> - * fall through to normal code, but now in L1, not L2 >>>> - */ >>>> - } >>>> - } >>>> - >>>> - return (vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_IF) && >>>> + return (!to_vmx(vcpu)->nested.nested_run_pending && >>>> + vmcs_readl(GUEST_RFLAGS) & X86_EFLAGS_IF) && >>>> !(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) & >>>> (GUEST_INTR_STATE_STI | GUEST_INTR_STATE_MOV_SS)); >>> >>> The checks on nested_run_pending are not needed anymore and can be >>> replaced with a WARN_ON. Otherwise, >> >> Nope, that won't be correct: If we have a pending interrupt that L1 does >> not intercept, we still trigger this condition legally. > > Right, this is the case of !nested_exit_on_intr(vcpu) or > !nested_exit_on_nmi(vcpu). > > Why don't we need to request an immediate exit in that case, in order to > inject the interrupt into L2? We enable the hardware interrupt/NMI window request for L2 instead. Jan
Attachment:
signature.asc
Description: OpenPGP digital signature