OSDN Git Service

KVM: x86: Fix misleading comments on handling pending exceptions
authorLiran Alon <liran.alon@oracle.com>
Fri, 23 Mar 2018 00:01:32 +0000 (03:01 +0300)
committerRadim Krčmář <rkrcmar@redhat.com>
Wed, 28 Mar 2018 20:47:06 +0000 (22:47 +0200)
The reason that exception.pending should block re-injection of
NMI/interrupt is not described correctly in comment in code.
Instead, it describes why a pending exception should be injected
before a pending NMI/interrupt.

Therefore, move currently present comment to code-block evaluating
a new pending event which explains why exception.pending is evaluated
first.
In addition, create a new comment describing that exception.pending
blocks re-injection of NMI/interrupt because the exception was
queued by handling vmexit which was due to NMI/interrupt delivery.

Signed-off-by: Liran Alon <liran.alon@oracle.com>
Reviewed-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
Signed-off-by: Krish Sadhukhan <krish.sadhukhan@orcle.com>
[Used a comment from Sean J <sean.j.christopherson@intel.com>. - Radim]
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
arch/x86/kvm/x86.c

index d15dc8c..bb9dee4 100644 (file)
@@ -6758,8 +6758,18 @@ static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win)
        }
 
        /*
-        * Exceptions must be injected immediately, or the exception
-        * frame will have the address of the NMI or interrupt handler.
+        * Do not inject an NMI or interrupt if there is a pending
+        * exception.  Exceptions and interrupts are recognized at
+        * instruction boundaries, i.e. the start of an instruction.
+        * Trap-like exceptions, e.g. #DB, have higher priority than
+        * NMIs and interrupts, i.e. traps are recognized before an
+        * NMI/interrupt that's pending on the same instruction.
+        * Fault-like exceptions, e.g. #GP and #PF, are the lowest
+        * priority, but are only generated (pended) during instruction
+        * execution, i.e. a pending fault-like exception means the
+        * fault occurred on the *previous* instruction and must be
+        * serviced prior to recognizing any new events in order to
+        * fully complete the previous instruction.
         */
        if (!vcpu->arch.exception.pending) {
                if (vcpu->arch.nmi_injected) {