linux/drivers/pci/controller
Dexuan Cui 4db49d59a8 PCI: hv: Add a per-bus mutex state_lock
commit 067d6ec7ed upstream.

In the case of fast device addition/removal, it's possible that
hv_eject_device_work() can start to run before create_root_hv_pci_bus()
starts to run; as a result, the pci_get_domain_bus_and_slot() in
hv_eject_device_work() can return a 'pdev' of NULL, and
hv_eject_device_work() can remove the 'hpdev', and immediately send a
message PCI_EJECTION_COMPLETE to the host, and the host immediately
unassigns the PCI device from the guest; meanwhile,
create_root_hv_pci_bus() and the PCI device driver can be probing the
dead PCI device and reporting timeout errors.

Fix the issue by adding a per-bus mutex 'state_lock' and grabbing the
mutex before powering on the PCI bus in hv_pci_enter_d0(): when
hv_eject_device_work() starts to run, it's able to find the 'pdev' and call
pci_stop_and_remove_bus_device(pdev): if the PCI device driver has
loaded, the PCI device driver's probe() function is already called in
create_root_hv_pci_bus() -> pci_bus_add_devices(), and now
hv_eject_device_work() -> pci_stop_and_remove_bus_device() is able
to call the PCI device driver's remove() function and remove the device
reliably; if the PCI device driver hasn't loaded yet, the function call
hv_eject_device_work() -> pci_stop_and_remove_bus_device() is able to
remove the PCI device reliably and the PCI device driver's probe()
function won't be called; if the PCI device driver's probe() is already
running (e.g., systemd-udev is loading the PCI device driver), it must
be holding the per-device lock, and after the probe() finishes and releases
the lock, hv_eject_device_work() -> pci_stop_and_remove_bus_device() is
able to proceed to remove the device reliably.

Fixes: 4daace0d8c ("PCI: hv: Add paravirtual PCI front-end for Microsoft Hyper-V VMs")
Signed-off-by: Dexuan Cui <decui@microsoft.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Acked-by: Lorenzo Pieralisi <lpieralisi@kernel.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20230615044451.5580-6-decui@microsoft.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2023-06-28 11:12:24 +02:00
..
cadence PCI: Convert to new *_PM_OPS macros 2022-07-27 11:56:17 -05:00
dwc PCI: imx6: Install the fault handler only on compatible match 2023-05-11 23:03:28 +09:00
mobiveil PCI: Add defines for normal and subtractive PCI bridges 2022-02-17 15:29:35 -06:00
Kconfig arm64: bcmbca: Make BCM4908 drivers depend on ARCH_BCMBCA 2022-08-15 09:55:34 -07:00
Makefile Merge branch 'pci/host/mt7621' 2021-11-05 11:28:51 -05:00
pci-aardvark.c Merge branch 'remotes/lorenzo/pci/bridge-emul' 2022-10-05 17:32:55 -05:00
pci-ftpci100.c PCI: ftpci100: Use PCI_CONF1_ADDRESS() macro 2022-09-27 11:08:20 +02:00
pci-host-common.c PCI/MSI: Make pci_host_common_probe() declare its reliance on MSI domains 2021-04-20 14:11:22 +01:00
pci-host-generic.c PCI: Unify ECAM constants in native PCI Express drivers 2020-12-10 14:55:49 -06:00
pci-hyperv-intf.c PCI: hv: Add a Hyper-V PCI interface driver for software backchannel interface 2019-08-22 00:25:12 -07:00
pci-hyperv.c PCI: hv: Add a per-bus mutex state_lock 2023-06-28 11:12:24 +02:00
pci-ixp4xx.c ARM: ixp4xx: fix building both pci drivers 2021-08-12 23:10:09 +02:00
pci-loongson.c PCI: loongson: Add more devices that need MRRS quirk 2023-03-11 13:55:39 +01:00
pci-mvebu.c Merge branch 'remotes/lorenzo/pci/mvebu' 2022-10-05 17:32:56 -05:00
pci-rcar-gen2.c PCI: rcar-gen2: Add RZ/N1 SOC family compatible string 2022-06-23 17:37:05 -05:00
pci-tegra.c Revert "PCI: tegra: Use PCI_CONF1_EXT_ADDRESS() macro" 2022-10-17 12:11:09 -05:00
pci-thunder-ecam.c PCI: thunder: Drop error data fabrication when config read fails 2021-11-18 13:39:32 -06:00
pci-thunder-pem.c PCI: thunder: Drop error data fabrication when config read fails 2021-11-18 13:39:32 -06:00
pci-v3-semi.c PCI: v3-semi: Remove unneeded break 2020-10-20 10:59:55 -05:00
pci-versatile.c PCI: versatile: Remove redundant variable retval 2022-04-28 10:46:37 +01:00
pci-xgene-msi.c PCI: xgene-msi: Use bitmap_zalloc() when applicable 2021-11-29 17:29:15 +00:00
pci-xgene.c PCI: Drop of_match_ptr() to avoid unused variables 2022-07-06 14:34:09 -05:00
pcie-altera-msi.c PCI: Bulk conversion to generic_handle_domain_irq() 2021-08-02 11:53:05 -05:00
pcie-altera.c Merge branch 'pci/driver-cleanup' 2022-01-13 09:57:53 -06:00
pcie-apple.c PCI: apple: Do not leak reset GPIO on unbind/unload/error 2022-09-14 17:45:47 +02:00
pcie-brcmstb.c PCI: brcmstb: Rename .map_bus() functions to end with 'map_bus' 2022-07-27 11:53:12 -05:00
pcie-hisi-error.c PCI: hip: Add handling of HiSilicon HIP PCIe controller errors 2020-09-16 10:30:42 +01:00
pcie-iproc-bcma.c PCI: Add defines for normal and subtractive PCI bridges 2022-02-17 15:29:35 -06:00
pcie-iproc-msi.c PCI: iproc: Use bitmap API to allocate bitmaps 2022-07-05 15:02:56 -05:00
pcie-iproc-platform.c PCI: iproc: Rename iproc_pcie_pltfm_ to iproc_pltfm_pcie_ 2022-01-03 15:01:53 -06:00
pcie-iproc.c PCI: iproc: Set all 24 bits of PCI class code 2022-02-17 15:30:01 -06:00
pcie-iproc.h PCI: Fix kernel-doc formatting 2021-07-06 10:37:46 -05:00
pcie-mediatek-gen3.c PCI: mediatek-gen3: Change driver name to mtk-pcie-gen3 2022-08-23 14:58:49 +02:00
pcie-mediatek.c PCI: Convert to new *_PM_OPS macros 2022-07-27 11:56:17 -05:00
pcie-microchip-host.c PCI: microchip: Fix refcount leak in mc_pcie_init_irq_domains() 2022-06-08 15:26:24 -05:00
pcie-mt7621.c PCI: mt7621: Delay phy ports initialization 2023-03-10 09:33:35 +01:00
pcie-rcar-ep.c PCI: rcar-ep: Remove unneeded includes 2021-10-08 09:41:38 -05:00
pcie-rcar-host.c PCI: Convert to new *_PM_OPS macros 2022-07-27 11:56:17 -05:00
pcie-rcar.c PCI: rcar: Fix calculating mask for PCIEPAMR register 2020-05-11 11:29:48 +01:00
pcie-rcar.h PCI: rcar: Add L1 link state fix into data abort hook 2021-08-16 14:51:30 +01:00
pcie-rockchip-ep.c PCI: rockchip: Fix find_first_zero_bit() limit 2022-04-08 14:42:07 +01:00
pcie-rockchip-host.c PCI: Convert to new *_PM_OPS macros 2022-07-27 11:56:17 -05:00
pcie-rockchip.c PCI: rockchip: Make 'ep-gpios' DT property optional 2021-02-23 14:23:50 -06:00
pcie-rockchip.h PCI: Add defines for normal and subtractive PCI bridges 2022-02-17 15:29:35 -06:00
pcie-xilinx-cpm.c PCI: xilinx-cpm: Add support for Versal CPM5 Root Port 2022-07-22 14:21:06 -05:00
pcie-xilinx-nwl.c PCI: xilinx-nwl: Simplify code and fix a memory leak 2021-12-01 09:26:51 +00:00
pcie-xilinx.c PCI: xilinx: Rename xilinx_pcie_port to xilinx_pcie 2022-01-03 15:05:28 -06:00
vmd.c PCI: vmd: Fix secondary bus reset for Intel bridges 2022-12-31 13:32:36 +01:00