public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] PCI: Fix devres regression in pci_intx()
@ 2024-07-25 12:07 Philipp Stanner
  2024-07-25 14:26 ` Christoph Hellwig
                   ` (3 more replies)
  0 siblings, 4 replies; 24+ messages in thread
From: Philipp Stanner @ 2024-07-25 12:07 UTC (permalink / raw)
  To: Bjorn Helgaas, Krzysztof Wilczyński, Philipp Stanner
  Cc: linux-pci, linux-kernel, Damien Le Moal

pci_intx() is a function that becomes managed if pcim_enable_device()
has been called in advance. Commit 25216afc9db5 ("PCI: Add managed
pcim_intx()") changed this behavior so that pci_intx() always leads to
creation of a separate device resource for itself, whereas earlier, a
shared resource was used for all PCI devres operations.

Unfortunately, pci_intx() seems to be used in some drivers' remove()
paths; in the managed case this causes a device resource to be created
on driver detach.

Fix the regression by only redirecting pci_intx() to its managed twin
pcim_intx() if the pci_command changes.

Fixes: 25216afc9db5 ("PCI: Add managed pcim_intx()")
Reported-by: Damien Le Moal <dlemoal@kernel.org>
Closes: https://lore.kernel.org/all/b8f4ba97-84fc-4b7e-ba1a-99de2d9f0118@kernel.org/
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
---
Alright, I reproduced this with QEMU as Damien described and this here
fixes the issue on my side. Feedback welcome. Thank you very much,
Damien.

It seems that this might yet again be the issue of drivers not being
aware that pci_intx() might become managed, so they use it in their
unwind path (rightfully so; there probably was no alternative back
then).

That will make the long term cleanup difficult. But I think this for now
is the most elegant possible workaround.
---
 drivers/pci/pci.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index e3a49f66982d..ffaaca0978cb 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4477,12 +4477,6 @@ void pci_intx(struct pci_dev *pdev, int enable)
 {
 	u16 pci_command, new;
 
-	/* Preserve the "hybrid" behavior for backwards compatibility */
-	if (pci_is_managed(pdev)) {
-		WARN_ON_ONCE(pcim_intx(pdev, enable) != 0);
-		return;
-	}
-
 	pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
 
 	if (enable)
@@ -4490,8 +4484,15 @@ void pci_intx(struct pci_dev *pdev, int enable)
 	else
 		new = pci_command | PCI_COMMAND_INTX_DISABLE;
 
-	if (new != pci_command)
+	if (new != pci_command) {
+		/* Preserve the "hybrid" behavior for backwards compatibility */
+		if (pci_is_managed(pdev)) {
+			WARN_ON_ONCE(pcim_intx(pdev, enable) != 0);
+			return;
+		}
+
 		pci_write_config_word(pdev, PCI_COMMAND, new);
+	}
 }
 EXPORT_SYMBOL_GPL(pci_intx);
 
-- 
2.45.2


^ permalink raw reply related	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2024-09-06  6:45 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-25 12:07 [PATCH] PCI: Fix devres regression in pci_intx() Philipp Stanner
2024-07-25 14:26 ` Christoph Hellwig
2024-07-25 15:21   ` Philipp Stanner
2024-07-25 15:47     ` Christoph Hellwig
2024-07-25 21:00 ` Bjorn Helgaas
2024-07-26  0:19 ` Damien Le Moal
2024-07-26 18:43   ` pstanner
2024-07-26 18:59     ` Bjorn Helgaas
2024-07-29 11:29     ` Damien Le Moal
2024-07-29 15:45       ` Philipp Stanner
2024-09-03 15:44 ` Alex Williamson
2024-09-04  7:06   ` Philipp Stanner
2024-09-04  8:25     ` Damien Le Moal
2024-09-04 13:37       ` Philipp Stanner
2024-09-04 18:07         ` Alex Williamson
2024-09-04 20:24           ` Andy Shevchenko
2024-09-04 21:10             ` Alex Williamson
2024-09-05  0:33               ` Damien Le Moal
2024-09-05  1:56                 ` Alex Williamson
2024-09-05  7:13                 ` Philipp Stanner
2024-09-06  0:37                   ` Damien Le Moal
2024-09-06  6:45                     ` Philipp Stanner
2024-09-04 12:57     ` Alex Williamson
2024-09-04 13:29       ` Philipp Stanner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox