]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.17-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 20 Jul 2018 07:28:12 +0000 (09:28 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 20 Jul 2018 07:28:12 +0000 (09:28 +0200)
added patches:
pci-hv-disable-enable-irqs-rather-than-bh-in-hv_compose_msi_msg.patch

queue-4.17/pci-hv-disable-enable-irqs-rather-than-bh-in-hv_compose_msi_msg.patch [new file with mode: 0644]
queue-4.17/series

diff --git a/queue-4.17/pci-hv-disable-enable-irqs-rather-than-bh-in-hv_compose_msi_msg.patch b/queue-4.17/pci-hv-disable-enable-irqs-rather-than-bh-in-hv_compose_msi_msg.patch
new file mode 100644 (file)
index 0000000..f98c153
--- /dev/null
@@ -0,0 +1,73 @@
+From 35a88a18d7ea58600e11590405bc93b08e16e7f5 Mon Sep 17 00:00:00 2001
+From: Dexuan Cui <decui@microsoft.com>
+Date: Mon, 9 Jul 2018 13:16:07 -0500
+Subject: PCI: hv: Disable/enable IRQs rather than BH in hv_compose_msi_msg()
+
+From: Dexuan Cui <decui@microsoft.com>
+
+commit 35a88a18d7ea58600e11590405bc93b08e16e7f5 upstream.
+
+Commit de0aa7b2f97d ("PCI: hv: Fix 2 hang issues in hv_compose_msi_msg()")
+uses local_bh_disable()/enable(), because hv_pci_onchannelcallback() can
+also run in tasklet context as the channel event callback, so bottom halves
+should be disabled to prevent a race condition.
+
+With CONFIG_PROVE_LOCKING=y in the recent mainline, or old kernels that
+don't have commit f71b74bca637 ("irq/softirqs: Use lockdep to assert IRQs
+are disabled/enabled"), when the upper layer IRQ code calls
+hv_compose_msi_msg() with local IRQs disabled, we'll see a warning at the
+beginning of __local_bh_enable_ip():
+
+  IRQs not enabled as expected
+    WARNING: CPU: 0 PID: 408 at kernel/softirq.c:162 __local_bh_enable_ip
+
+The warning exposes an issue in de0aa7b2f97d: local_bh_enable() can
+potentially call do_softirq(), which is not supposed to run when local IRQs
+are disabled. Let's fix this by using local_irq_save()/restore() instead.
+
+Note: hv_pci_onchannelcallback() is not a hot path because it's only called
+when the PCI device is hot added and removed, which is infrequent.
+
+Fixes: de0aa7b2f97d ("PCI: hv: Fix 2 hang issues in hv_compose_msi_msg()")
+Signed-off-by: Dexuan Cui <decui@microsoft.com>
+Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
+Cc: stable@vger.kernel.org
+Cc: Stephen Hemminger <sthemmin@microsoft.com>
+Cc: K. Y. Srinivasan <kys@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/pci/host/pci-hyperv.c |    8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+--- a/drivers/pci/host/pci-hyperv.c
++++ b/drivers/pci/host/pci-hyperv.c
+@@ -1077,6 +1077,7 @@ static void hv_compose_msi_msg(struct ir
+       struct pci_bus *pbus;
+       struct pci_dev *pdev;
+       struct cpumask *dest;
++      unsigned long flags;
+       struct compose_comp_ctxt comp;
+       struct tran_int_desc *int_desc;
+       struct {
+@@ -1168,14 +1169,15 @@ static void hv_compose_msi_msg(struct ir
+                * the channel callback directly when channel->target_cpu is
+                * the current CPU. When the higher level interrupt code
+                * calls us with interrupt enabled, let's add the
+-               * local_bh_disable()/enable() to avoid race.
++               * local_irq_save()/restore() to avoid race:
++               * hv_pci_onchannelcallback() can also run in tasklet.
+                */
+-              local_bh_disable();
++              local_irq_save(flags);
+               if (hbus->hdev->channel->target_cpu == smp_processor_id())
+                       hv_pci_onchannelcallback(hbus);
+-              local_bh_enable();
++              local_irq_restore(flags);
+               if (hpdev->state == hv_pcichild_ejecting) {
+                       dev_err_once(&hbus->hdev->device,
index c1aa73fa325b919e2759a4fb5393e0dbef89cac8..949ccde67b1f3253e495359bfb05519f605b3cf8 100644 (file)
@@ -64,3 +64,4 @@ rtlwifi-fix-kernel-oops-fw-download-fail.patch
 rtlwifi-rtl8821ae-fix-firmware-is-not-ready-to-run.patch
 net-lan78xx-fix-race-in-tx-pending-skb-size-calculation.patch
 crypto-af_alg-initialize-sg_num_bytes-in-error-code-path.patch
+pci-hv-disable-enable-irqs-rather-than-bh-in-hv_compose_msi_msg.patch