linux-hardened/drivers/pci
Dexuan Cui de0aa7b2f9 PCI: hv: Fix 2 hang issues in hv_compose_msi_msg()
1. With the patch "x86/vector/msi: Switch to global reservation mode",
the recent v4.15 and newer kernels always hang for 1-vCPU Hyper-V VM
with SR-IOV. This is because when we reach hv_compose_msi_msg() by
request_irq() -> request_threaded_irq() ->__setup_irq()->irq_startup()
-> __irq_startup() -> irq_domain_activate_irq() -> ... ->
msi_domain_activate() -> ... -> hv_compose_msi_msg(), local irq is
disabled in __setup_irq().

Note: when we reach hv_compose_msi_msg() by another code path:
pci_enable_msix_range() -> ... -> irq_domain_activate_irq() -> ... ->
hv_compose_msi_msg(), local irq is not disabled.

hv_compose_msi_msg() depends on an interrupt from the host.
With interrupts disabled, a UP VM always hangs in the busy loop in
the function, because the interrupt callback hv_pci_onchannelcallback()
can not be called.

We can do nothing but work it around by polling the channel. This
is ugly, but we don't have any other choice.

2. If the host is ejecting the VF device before we reach
hv_compose_msi_msg(), in a UP VM, we can hang in hv_compose_msi_msg()
forever, because at this time the host doesn't respond to the
CREATE_INTERRUPT request. This issue exists the first day the
pci-hyperv driver appears in the kernel.

Luckily, this can also by worked around by polling the channel
for the PCI_EJECT message and hpdev->state, and by checking the
PCI vendor ID.

Note: actually the above 2 issues also happen to a SMP VM, if
"hbus->hdev->channel->target_cpu == smp_processor_id()" is true.

Fixes: 4900be8360 ("x86/vector/msi: Switch to global reservation mode")
Tested-by: Adrian Suhov <v-adsuho@microsoft.com>
Tested-by: Chris Valean <v-chvale@microsoft.com>
Signed-off-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Acked-by: Haiyang Zhang <haiyangz@microsoft.com>
Cc: <stable@vger.kernel.org>
Cc: Stephen Hemminger <sthemmin@microsoft.com>
Cc: K. Y. Srinivasan <kys@microsoft.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
Cc: Jack Morgenstein <jackm@mellanox.com>
2018-03-16 18:19:01 +00:00
..
cadence PCI: cadence: Add EndPoint Controller driver for Cadence PCIe controller 2018-01-31 11:13:27 +00:00
dwc Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
endpoint Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
host PCI: hv: Fix 2 hang issues in hv_compose_msi_msg() 2018-03-16 18:19:01 +00:00
hotplug More ACPI updates for v4.16-rc1 2018-02-09 09:44:25 -08:00
pcie pci-v4.16-changes 2018-02-06 09:59:40 -08:00
switch vfs: do bulk POLL* -> EPOLL* replacement 2018-02-11 14:34:03 -08:00
access.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
ats.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
bus.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
ecam.c PCI: Add SPDX GPL-2.0 to replace GPL v2 boilerplate 2018-01-28 15:48:29 -06:00
host-bridge.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
iov.c pci-v4.16-changes 2018-02-06 09:59:40 -08:00
irq.c PCI: Add wrappers for dev_printk() 2018-01-18 12:55:24 -06:00
Kconfig Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
Makefile PCI: cadence: Add EndPoint Controller driver for Cadence PCIe controller 2018-01-31 11:13:27 +00:00
mmap.c PCI: Add SPDX GPL-2.0 to replace GPL v2 boilerplate 2018-01-28 15:48:29 -06:00
msi.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
of.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
pci-acpi.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
pci-driver.c pci-v4.16-changes 2018-02-06 09:59:40 -08:00
pci-label.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
pci-mid.c PCI: Add SPDX GPL-2.0 to replace GPL v2 boilerplate 2018-01-28 15:48:29 -06:00
pci-stub.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
pci-sysfs.c Merge branch 'pci/virtualization' into next 2018-01-31 10:13:09 -06:00
pci.c pci-v4.16-changes 2018-02-06 09:59:40 -08:00
pci.h Merge branch 'pci/trivial' into next 2018-01-31 10:13:07 -06:00
probe.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
proc.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
quirks.c Merge branch 'pci/virtualization' into next 2018-01-31 10:13:09 -06:00
remove.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
rom.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
search.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
setup-bus.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
setup-irq.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
setup-res.c PCI: Add wrappers for dev_printk() 2018-01-18 12:55:24 -06:00
slot.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
syscall.c PCI: Deprecate pci_get_bus_and_slot() 2018-01-17 08:16:46 -06:00
vc.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00
vpd.c PCI: Add SPDX GPL-2.0 when no license was specified 2018-01-26 11:45:16 -06:00
xen-pcifront.c Merge branch 'pci/spdx' into next 2018-02-01 11:40:07 -06:00