KVM: VMX: Move Posted Interrupt ndst computation out of write loop
authorSean Christopherson <seanjc@google.com>
Sat, 9 Oct 2021 02:12:20 +0000 (19:12 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 8 Dec 2021 09:24:57 +0000 (04:24 -0500)
Hoist the CPU => APIC ID conversion for the Posted Interrupt descriptor
out of the loop to write the descriptor, preemption is disabled so the
CPU won't change, and if the APIC ID changes KVM has bigger problems.

No functional change intended.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20211009021236.4122790-28-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/posted_intr.c

index a1ce598e95444907d7f483a6737703df33a6c7a5..e29a40042978d6f6ca1219f1363bd2d4b365a875 100644 (file)
@@ -52,17 +52,15 @@ void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu)
                goto after_clear_sn;
        }
 
-       /* The full case.  */
+       /* The full case.  Set the new destination and clear SN. */
+       dest = cpu_physical_id(cpu);
+       if (!x2apic_mode)
+               dest = (dest << 8) & 0xFF00;
+
        do {
                old.control = new.control = READ_ONCE(pi_desc->control);
 
-               dest = cpu_physical_id(cpu);
-
-               if (x2apic_mode)
-                       new.ndst = dest;
-               else
-                       new.ndst = (dest << 8) & 0xFF00;
-
+               new.ndst = dest;
                new.sn = 0;
        } while (cmpxchg64(&pi_desc->control, old.control,
                           new.control) != old.control);
@@ -106,17 +104,16 @@ static void __pi_post_block(struct kvm_vcpu *vcpu)
        struct pi_desc old, new;
        unsigned int dest;
 
+       dest = cpu_physical_id(vcpu->cpu);
+       if (!x2apic_mode)
+               dest = (dest << 8) & 0xFF00;
+
        do {
                old.control = new.control = READ_ONCE(pi_desc->control);
                WARN(old.nv != POSTED_INTR_WAKEUP_VECTOR,
                     "Wakeup handler not enabled while the VCPU is blocked\n");
 
-               dest = cpu_physical_id(vcpu->cpu);
-
-               if (x2apic_mode)
-                       new.ndst = dest;
-               else
-                       new.ndst = (dest << 8) & 0xFF00;
+               new.ndst = dest;
 
                /* set 'NV' to 'notification vector' */
                new.nv = POSTED_INTR_VECTOR;