qemu/hw/pci
Michael S. Tsirkin 110c477c2e pcie: work around for racy guest init
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: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Tested-by: Igor Mammedov <imammedo@redhat.com>
2019-07-01 09:17:30 -04:00
..
Kconfig kconfig: add CONFIG_MSI_NONBROKEN 2019-03-18 09:39:57 +01:00
Makefile.objs hw/pci/Makefile.objs: make pcie configurable 2019-03-07 21:45:53 +01:00
msi.c pci/msi: export msi_is_masked() 2019-02-05 10:58:33 -05:00
msix.c pci: msix: move 'MSIX_CAP_LENGTH' to header file 2019-05-22 17:35:27 +02:00
pci_bridge.c Include qemu/module.h where needed, drop it from qemu-common.h 2019-06-12 13:18:33 +02:00
pci_host.c Include qemu/module.h where needed, drop it from qemu-common.h 2019-06-12 13:18:33 +02:00
pci-stub.c hw/pci/pci-stub: Add msi_enabled() and msi_notify() to the pci stubs 2019-05-13 09:36:31 +02:00
pci.c Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
pcie_aer.c Drop superfluous includes of qapi/qmp/qjson.h 2018-02-09 13:52:15 +01:00
pcie_host.c Include qemu/module.h where needed, drop it from qemu-common.h 2019-06-12 13:18:33 +02:00
pcie_port.c Include qemu/module.h where needed, drop it from qemu-common.h 2019-06-12 13:18:33 +02:00
pcie.c pcie: work around for racy guest init 2019-07-01 09:17:30 -04:00
shpc.c Include qemu-common.h exactly where needed 2019-06-12 13:20:20 +02:00
slotid_cap.c pci: Convert shpc_init() to Error 2017-07-03 22:29:49 +03:00
trace-events trace-events: Shorten file names in comments 2019-03-22 16:18:07 +00:00