• M
    pcie: work around for racy guest init · 110c477c
    Michael S. Tsirkin 提交于
    During boot, linux guests tend to clear all bits in pcie slot status
    register which is used for hotplug.
    If they clear bits that weren't set this is racy and will lose events:
    not a big problem for manual hotplug on bare-metal, but a problem for us.
    
    For example, the following is broken ATM:
    
    /x86_64-softmmu/qemu-system-x86_64 -enable-kvm -S -machine q35  \
        -device pcie-root-port,id=pcie_root_port_0,slot=2,chassis=2,addr=0x2,bus=pcie.0 \
        -device virtio-balloon-pci,id=balloon,bus=pcie_root_port_0 \
        -monitor stdio disk.qcow2
    (qemu)device_del balloon
    (qemu)cont
    
    Balloon isn't deleted as it should.
    
    As a work-around, detect this attempt to clear slot status and revert
    status to what it was before the write.
    
    Note: in theory this can be detected as a duplicate button press
    which cancels the previous press. Does not seem to happen in
    practice as guests seem to only have this bug during init.
    
    Note2: the right thing to do is probably to fix Linux to
    read status before clearing it, and act on the bits that are set.
    Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
    Reviewed-by: NMarcel Apfelbaum <marcel.apfelbaum@gmail.com>
    Reviewed-by: NIgor Mammedov <imammedo@redhat.com>
    Tested-by: NIgor Mammedov <imammedo@redhat.com>
    110c477c
pcie.c 34.9 KB