linux_dsm_epyc7002/drivers/pci/host
Vitaly Kuznetsov bdd74440d9 PCI: hv: Add explicit barriers to config space access
I'm trying to pass-through Broadcom BCM5720 NIC (Dell device 1f5b) on a
Dell R720 server.  Everything works fine when the target VM has only one
CPU, but SMP guests reboot when the NIC driver accesses PCI config space
with hv_pcifront_read_config()/hv_pcifront_write_config().  The reboot
appears to be induced by the hypervisor and no crash is observed.  Windows
event logs are not helpful at all ('Virtual machine ... has quit
unexpectedly').  The particular access point is always different and
putting debug between them (printk/mdelay/...) moves the issue further
away.  The server model affects the issue as well: on Dell R420 I'm able to
pass-through BCM5720 NIC to SMP guests without issues.

While I'm obviously failing to reveal the essence of the issue I was able
to come up with a (possible) solution: if explicit barriers are added to
hv_pcifront_read_config()/hv_pcifront_write_config() the issue goes away.
The essential minimum is rmb() at the end on _hv_pcifront_read_config() and
wmb() at the end of _hv_pcifront_write_config() but I'm not confident it
will be sufficient for all hardware.  I suggest the following barriers:

1) wmb()/mb() between choosing the function and writing to its space.
2) mb() before releasing the spinlock in both _hv_pcifront_read_config()/
   _hv_pcifront_write_config() to ensure that consecutive reads/writes to
  the space won't get re-ordered as drivers may count on that.

Config space access is not supposed to be performance-critical so these
explicit barriers should not cause any slowdown.

[bhelgaas: use Linux "barriers" terminology]
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Jake Oshins <jakeo@microsoft.com>
2016-05-04 17:03:41 -05:00
..
Kconfig Revert "PCI: dra7xx: Mark driver as broken" 2016-03-22 07:50:11 -05:00
Makefile Merge branch 'pci/host-hv' into next 2016-03-15 08:56:16 -05:00
pci-dra7xx.c PCI: designware: Add generic dw_pcie_wait_for_link() 2016-03-15 08:50:45 -05:00
pci-exynos.c PCI: designware: Add generic dw_pcie_wait_for_link() 2016-03-15 08:50:45 -05:00
pci-host-common.c PCI: generic: Expose pci_host_common_probe() for use by other drivers 2016-03-11 15:50:20 -06:00
pci-host-common.h PCI: generic: Expose pci_host_common_probe() for use by other drivers 2016-03-11 15:50:20 -06:00
pci-host-generic.c PCI: generic: Expose pci_host_common_probe() for use by other drivers 2016-03-11 15:50:20 -06:00
pci-hyperv.c PCI: hv: Add explicit barriers to config space access 2016-05-04 17:03:41 -05:00
pci-imx6.c Merge branch 'pci/host-designware' into next 2016-03-15 08:55:52 -05:00
pci-keystone-dw.c PCI: keystone: Fix MSI code that retrieves struct pcie_port pointer 2016-02-29 17:18:22 -06:00
pci-keystone.c Merge branch 'pci/host-designware' into next 2016-03-15 08:55:52 -05:00
pci-keystone.h PCI: designware: Make get_msi_addr() return phys_addr_t, not u32 2015-09-18 13:58:35 -05:00
pci-layerscape.c PCI changes for the v4.6 merge window: 2016-03-16 14:45:55 -07:00
pci-mvebu.c PCI: mvebu: Remove code restricting accesses to slot 0 2015-10-09 11:23:37 -05:00
pci-rcar-gen2.c PCI: rcar: Add gen2 fallback compatibility string for pci-rcar-gen2 2015-12-09 12:28:21 -06:00
pci-tegra.c PCI: tegra: Remove misleading PHYS_OFFSET 2016-03-08 15:42:56 -06:00
pci-thunder-ecam.c PCI: thunder: Add driver for ThunderX-pass{1,2} on-chip devices 2016-03-11 16:10:48 -06:00
pci-thunder-pem.c PCI: thunder: Add PCIe host driver for ThunderX processors 2016-03-11 15:53:41 -06:00
pci-versatile.c PCI: generic,versatile: Remove unused pci_sys_data structures 2015-11-25 12:08:04 -06:00
pci-xgene-msi.c irqdomain/msi: Use fwnode instead of of_node 2015-10-13 19:01:25 +02:00
pci-xgene.c PCI/MSI: xgene: Remove msi_controller assignment 2015-09-25 18:24:28 -05:00
pcie-altera-msi.c PCI changes for the v4.4 merge window: 2015-11-06 11:29:53 -08:00
pcie-altera.c PCI: altera: Fix altera_pcie_link_is_up() 2016-03-11 12:14:39 -06:00
pcie-designware-plat.c PCI: designware: Add driver for prototyping kits based on ARC SDP 2016-03-15 08:50:45 -05:00
pcie-designware.c PCI: designware: Add default link up check if sub-driver doesn't override 2016-03-15 08:50:45 -05:00
pcie-designware.h PCI: designware: Add generic dw_pcie_wait_for_link() 2016-03-15 08:50:45 -05:00
pcie-hisi.c PCI changes for the v4.5 merge window: 2016-01-21 11:52:16 -08:00
pcie-iproc-bcma.c PCI: iproc: Add iProc PCIe MSI support 2016-01-06 18:04:35 -06:00
pcie-iproc-msi.c PCI: iproc: Add iProc PCIe MSI support 2016-01-06 18:04:35 -06:00
pcie-iproc-platform.c PCI: iproc: Add iProc PCIe MSI support 2016-01-06 18:04:35 -06:00
pcie-iproc.c PCI: iproc: Allow multiple devices except on PAXC 2016-01-27 16:52:24 -06:00
pcie-iproc.h PCI: iproc: Add iProc PCIe MSI support 2016-01-06 18:04:35 -06:00
pcie-qcom.c PCI: designware: Add generic dw_pcie_wait_for_link() 2016-03-15 08:50:45 -05:00
pcie-rcar.c PCI: rcar: Remove PCI_PROBE_ONLY handling 2016-02-05 14:22:41 -06:00
pcie-spear13xx.c PCI: designware: Add generic dw_pcie_wait_for_link() 2016-03-15 08:50:45 -05:00
pcie-xilinx-nwl.c PCI: xilinx-nwl: Add support for Xilinx NWL PCIe Host Controller 2016-03-11 12:42:31 -06:00
pcie-xilinx.c PCI: xilinx: Don't call pci_fixup_irqs() on Microblaze 2016-03-08 14:06:17 -06:00