KVM: nVMX: Fail on MMIO completion for nested posted interrupts
authorJim Mattson <jmattson@google.com>
Fri, 4 Jun 2021 17:26:05 +0000 (10:26 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 17 Jun 2021 17:09:31 +0000 (13:09 -0400)
When the kernel has no mapping for the vmcs02 virtual APIC page,
userspace MMIO completion is necessary to process nested posted
interrupts. This is not a configuration that KVM supports. Rather than
silently ignoring the problem, try to exit to userspace with
KVM_INTERNAL_ERROR.

Note that the event that triggers this error is consumed as a
side-effect of a call to kvm_check_nested_events. On some paths
(notably through kvm_vcpu_check_block), the error is dropped. In any
case, this is an incremental improvement over always ignoring the
error.

Signed-off-by: Jim Mattson <jmattson@google.com>
Message-Id: <20210604172611.281819-7-jmattson@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/nested.c

index 73f63ad..4e54599 100644 (file)
@@ -3707,7 +3707,7 @@ static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu)
        if (max_irr != 256) {
                vapic_page = vmx->nested.virtual_apic_map.hva;
                if (!vapic_page)
-                       return 0;
+                       goto mmio_needed;
 
                __kvm_apic_update_irr(vmx->nested.pi_desc->pir,
                        vapic_page, &max_irr);
@@ -3721,6 +3721,10 @@ static int vmx_complete_nested_posted_interrupt(struct kvm_vcpu *vcpu)
 
        nested_mark_vmcs12_pages_dirty(vcpu);
        return 0;
+
+mmio_needed:
+       kvm_handle_memory_failure(vcpu, X86EMUL_IO_NEEDED, NULL);
+       return -ENXIO;
 }
 
 static void nested_vmx_inject_exception_vmexit(struct kvm_vcpu *vcpu,