lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0790/1039] KVM: VMX: Read Posted Interrupt "control" exactly once per loop iteration
    Date
    From: Sean Christopherson <seanjc@google.com>

    [ Upstream commit cfb0e1306a3790eb055ebf7cdb7b0ee8a23e9b6e ]

    Use READ_ONCE() when loading the posted interrupt descriptor control
    field to ensure "old" and "new" have the same base value. If the
    compiler emits separate loads, and loads into "new" before "old", KVM
    could theoretically drop the ON bit if it were set between the loads.

    Fixes: 28b835d60fcc ("KVM: Update Posted-Interrupts Descriptor when vCPU is preempted")
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Message-Id: <20211009021236.4122790-27-seanjc@google.com>
    Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/kvm/vmx/posted_intr.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/kvm/vmx/posted_intr.c b/arch/x86/kvm/vmx/posted_intr.c
    index 696ad48ab5daa..46fb83d6a286e 100644
    --- a/arch/x86/kvm/vmx/posted_intr.c
    +++ b/arch/x86/kvm/vmx/posted_intr.c
    @@ -51,7 +51,7 @@ void vmx_vcpu_pi_load(struct kvm_vcpu *vcpu, int cpu)

    /* The full case. */
    do {
    - old.control = new.control = pi_desc->control;
    + old.control = new.control = READ_ONCE(pi_desc->control);

    dest = cpu_physical_id(cpu);

    @@ -104,7 +104,7 @@ static void __pi_post_block(struct kvm_vcpu *vcpu)
    unsigned int dest;

    do {
    - old.control = new.control = pi_desc->control;
    + 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");

    @@ -163,7 +163,7 @@ int pi_pre_block(struct kvm_vcpu *vcpu)
    }

    do {
    - old.control = new.control = pi_desc->control;
    + old.control = new.control = READ_ONCE(pi_desc->control);

    WARN((pi_desc->sn == 1),
    "Warning: SN field of posted-interrupts "
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-01-25 00:11    [W:2.521 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site