• Paolo Bonzini's avatar
    KVM: VMX: avoid double list add with VT-d posted interrupts · 8b306e2f
    Paolo Bonzini authored
    In some cases, for example involving hot-unplug of assigned
    devices, pi_post_block can forget to remove the vCPU from the
    blocked_vcpu_list.  When this happens, the next call to
    pi_pre_block corrupts the list.
    
    Fix this in two ways.  First, check vcpu->pre_pcpu in pi_pre_block
    and WARN instead of adding the element twice in the list.  Second,
    always do the list removal in pi_post_block if vcpu->pre_pcpu is
    set (not -1).
    
    The new code keeps interrupts disabled for the whole duration of
    pi_pre_block/pi_post_block.  This is not strictly necessary, but
    easier to follow.  For the same reason, PI.ON is checked only
    after the cmpxchg, and to handle it we just call the post-block
    code.  This removes duplication of the list removal code.
    
    Cc: Huangweidong <weidong.huang@huawei.com>
    Cc: Gonglei <arei.gonglei@huawei.com>
    Cc: wangxin <wangxinxin.wang@huawei.com>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Tested-by: default avatarLongpeng (Mike) <longpeng2@huawei.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    8b306e2f
vmx.c 343 KB