Commit 724b3962 authored by Sean Christopherson's avatar Sean Christopherson Committed by Paolo Bonzini

KVM: VMX: Move Posted Interrupt ndst computation out of write loop

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: default avatarSean Christopherson <seanjc@google.com>
Message-Id: <20211009021236.4122790-28-seanjc@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent cfb0e130
...@@ -52,17 +52,15 @@ void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu) ...@@ -52,17 +52,15 @@ void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu)
goto after_clear_sn; 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 { do {
old.control = new.control = READ_ONCE(pi_desc->control); old.control = new.control = READ_ONCE(pi_desc->control);
dest = cpu_physical_id(cpu);
if (x2apic_mode)
new.ndst = dest; new.ndst = dest;
else
new.ndst = (dest << 8) & 0xFF00;
new.sn = 0; new.sn = 0;
} while (cmpxchg64(&pi_desc->control, old.control, } while (cmpxchg64(&pi_desc->control, old.control,
new.control) != old.control); new.control) != old.control);
...@@ -106,17 +104,16 @@ static void __pi_post_block(struct kvm_vcpu *vcpu) ...@@ -106,17 +104,16 @@ static void __pi_post_block(struct kvm_vcpu *vcpu)
struct pi_desc old, new; struct pi_desc old, new;
unsigned int dest; unsigned int dest;
dest = cpu_physical_id(vcpu->cpu);
if (!x2apic_mode)
dest = (dest << 8) & 0xFF00;
do { do {
old.control = new.control = READ_ONCE(pi_desc->control); old.control = new.control = READ_ONCE(pi_desc->control);
WARN(old.nv != POSTED_INTR_WAKEUP_VECTOR, WARN(old.nv != POSTED_INTR_WAKEUP_VECTOR,
"Wakeup handler not enabled while the VCPU is blocked\n"); "Wakeup handler not enabled while the VCPU is blocked\n");
dest = cpu_physical_id(vcpu->cpu);
if (x2apic_mode)
new.ndst = dest; new.ndst = dest;
else
new.ndst = (dest << 8) & 0xFF00;
/* set 'NV' to 'notification vector' */ /* set 'NV' to 'notification vector' */
new.nv = POSTED_INTR_VECTOR; new.nv = POSTED_INTR_VECTOR;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment