* [PATCH v2 01/11] PCI: Prepare removing devres from pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 16:04 ` Thomas Gleixner
2024-11-13 12:41 ` [PATCH v2 02/11] drivers/xen: Use never-managed version of pci_intx() Philipp Stanner
` (9 subsequent siblings)
10 siblings, 1 reply; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which sometimes performs devres
operations, depending on whether pcim_enable_device() has been used to
enable the pci_dev. This sometimes-managed nature of the function is
problematic. Notably, it causes the function to allocate under some
circumstances which makes it unusable from interrupt context.
To, ultimately, remove the hybrid nature from pci_intx(), it is first
necessary to provide an always-managed and a never-managed version
of that function. Then, all callers of pci_intx() can be ported to the
version they need, depending whether they use pci_enable_device() or
pcim_enable_device().
An always-managed function exists, namely pcim_intx(), for which
__pcim_intx(), a never-managed version of pci_intx() has been
implemented.
Make __pcim_intx() a public function under the name
pci_intx_unmanaged(). Make pcim_intx() a public function.
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
---
drivers/pci/devres.c | 24 +++---------------------
drivers/pci/pci.c | 29 +++++++++++++++++++++++++++++
include/linux/pci.h | 2 ++
3 files changed, 34 insertions(+), 21 deletions(-)
diff --git a/drivers/pci/devres.c b/drivers/pci/devres.c
index b133967faef8..d32827a1f2f4 100644
--- a/drivers/pci/devres.c
+++ b/drivers/pci/devres.c
@@ -411,31 +411,12 @@ static inline bool mask_contains_bar(int mask, int bar)
return mask & BIT(bar);
}
-/*
- * This is a copy of pci_intx() used to bypass the problem of recursive
- * function calls due to the hybrid nature of pci_intx().
- */
-static void __pcim_intx(struct pci_dev *pdev, int enable)
-{
- u16 pci_command, new;
-
- pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
-
- if (enable)
- new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
- else
- new = pci_command | PCI_COMMAND_INTX_DISABLE;
-
- if (new != pci_command)
- pci_write_config_word(pdev, PCI_COMMAND, new);
-}
-
static void pcim_intx_restore(struct device *dev, void *data)
{
struct pci_dev *pdev = to_pci_dev(dev);
struct pcim_intx_devres *res = data;
- __pcim_intx(pdev, res->orig_intx);
+ pci_intx_unmanaged(pdev, res->orig_intx);
}
static struct pcim_intx_devres *get_or_create_intx_devres(struct device *dev)
@@ -472,10 +453,11 @@ int pcim_intx(struct pci_dev *pdev, int enable)
return -ENOMEM;
res->orig_intx = !enable;
- __pcim_intx(pdev, enable);
+ pci_intx_unmanaged(pdev, enable);
return 0;
}
+EXPORT_SYMBOL_GPL(pcim_intx);
static void pcim_disable_device(void *pdev_raw)
{
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 225a6cd2e9ca..c945811b207a 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4480,6 +4480,35 @@ void pci_disable_parity(struct pci_dev *dev)
}
}
+/**
+ * pci_intx_unmanaged - enables/disables PCI INTx for device dev,
+ * unmanaged version
+ * @pdev: the PCI device to operate on
+ * @enable: boolean: whether to enable or disable PCI INTx
+ *
+ * Enables/disables PCI INTx for device @pdev
+ *
+ * This function behavios identically to pci_intx(), but is never managed with
+ * devres.
+ */
+void pci_intx_unmanaged(struct pci_dev *pdev, int enable)
+{
+ u16 pci_command, new;
+
+ pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
+
+ if (enable)
+ new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
+ else
+ new = pci_command | PCI_COMMAND_INTX_DISABLE;
+
+ if (new == pci_command)
+ return;
+
+ pci_write_config_word(pdev, PCI_COMMAND, new);
+}
+EXPORT_SYMBOL_GPL(pci_intx_unmanaged);
+
/**
* pci_intx - enables/disables PCI INTx for device dev
* @pdev: the PCI device to operate on
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 573b4c4c2be6..6b8cde76d564 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1353,6 +1353,7 @@ int __must_check pcim_set_mwi(struct pci_dev *dev);
int pci_try_set_mwi(struct pci_dev *dev);
void pci_clear_mwi(struct pci_dev *dev);
void pci_disable_parity(struct pci_dev *dev);
+void pci_intx_unmanaged(struct pci_dev *pdev, int enable);
void pci_intx(struct pci_dev *dev, int enable);
bool pci_check_and_mask_intx(struct pci_dev *dev);
bool pci_check_and_unmask_intx(struct pci_dev *dev);
@@ -2293,6 +2294,7 @@ static inline void pci_fixup_device(enum pci_fixup_pass pass,
struct pci_dev *dev) { }
#endif
+int pcim_intx(struct pci_dev *pdev, int enabled);
void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen);
void __iomem *pcim_iomap_region(struct pci_dev *pdev, int bar,
const char *name);
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v2 01/11] PCI: Prepare removing devres from pci_intx()
2024-11-13 12:41 ` [PATCH v2 01/11] PCI: Prepare removing " Philipp Stanner
@ 2024-11-13 16:04 ` Thomas Gleixner
2024-11-13 16:11 ` Philipp Stanner
0 siblings, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2024-11-13 16:04 UTC (permalink / raw)
To: Philipp Stanner, Damien Le Moal, Niklas Cassel, Basavaraj Natikar,
Jiri Kosina, Benjamin Tissoires, Arnd Bergmann,
Greg Kroah-Hartman, Alex Dubov, Sudarsana Kalluru, Manish Chopra,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rasesh Mody, GR-Linux-NIC-Dev, Igor Mitsyanko,
Sergey Matyukevich, Kalle Valo, Sanjay R Mehta, Shyam Sundar S K,
Jon Mason, Dave Jiang, Allen Hubbe, Bjorn Helgaas,
Alex Williamson, Juergen Gross, Stefano Stabellini,
Oleksandr Tyshchenko, Philipp Stanner, Mario Limonciello, Chen Ni,
Ricky Wu, Al Viro, Breno Leitao, Kevin Tian, Mostafa Saleh,
Andy Shevchenko, Jason Gunthorpe, Yi Liu, Kunwu Chan,
Ankit Agrawal, Christian Brauner, Reinette Chatre, Eric Auger,
Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
On Wed, Nov 13 2024 at 13:41, Philipp Stanner wrote:
> +/**
> + * pci_intx_unmanaged - enables/disables PCI INTx for device dev,
> + * unmanaged version
> + * @pdev: the PCI device to operate on
> + * @enable: boolean: whether to enable or disable PCI INTx
Except that the argument is of type int, which really should be type bool.
> + * Enables/disables PCI INTx for device @pdev
> + *
> + * This function behavios identically to pci_intx(), but is never managed with
> + * devres.
behavios?
> + */
> +void pci_intx_unmanaged(struct pci_dev *pdev, int enable)
I find this function name mildy confusing. This _unmanaged suffix is not
really telling me anything. And the reference that this behaves
identically to pci_intx() makes it even worse.
This function is about controlling the PCI INTX_DISABLE bit in the
PCI_COMMAND config word, right?
So naming it pci_intx_control() would make it entirely clear what this
is about, no?
Thanks,
tglx
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v2 01/11] PCI: Prepare removing devres from pci_intx()
2024-11-13 16:04 ` Thomas Gleixner
@ 2024-11-13 16:11 ` Philipp Stanner
0 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 16:11 UTC (permalink / raw)
To: Thomas Gleixner, Damien Le Moal, Niklas Cassel, Basavaraj Natikar,
Jiri Kosina, Benjamin Tissoires, Arnd Bergmann,
Greg Kroah-Hartman, Alex Dubov, Sudarsana Kalluru, Manish Chopra,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rasesh Mody, GR-Linux-NIC-Dev, Igor Mitsyanko,
Sergey Matyukevich, Kalle Valo, Sanjay R Mehta, Shyam Sundar S K,
Jon Mason, Dave Jiang, Allen Hubbe, Bjorn Helgaas,
Alex Williamson, Juergen Gross, Stefano Stabellini,
Oleksandr Tyshchenko, Mario Limonciello, Chen Ni, Ricky Wu,
Al Viro, Breno Leitao, Kevin Tian, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
On Wed, 2024-11-13 at 17:04 +0100, Thomas Gleixner wrote:
> On Wed, Nov 13 2024 at 13:41, Philipp Stanner wrote:
> > +/**
> > + * pci_intx_unmanaged - enables/disables PCI INTx for device dev,
> > + * unmanaged version
> > + * @pdev: the PCI device to operate on
> > + * @enable: boolean: whether to enable or disable PCI INTx
>
> Except that the argument is of type int, which really should be type
> bool.
True, but this is a *temporary* copy of pci_intx(), a ~16 year old
function. Older C programmers had the habit of for some reason using
32-bit integers for a true/false boolean all the time.
We _could_ think of changing pci_intx()'s parameter to a boolean, but I
think it wouldn't really improve things very much
see also below
>
> > + * Enables/disables PCI INTx for device @pdev
> > + *
> > + * This function behavios identically to pci_intx(), but is never
> > managed with
> > + * devres.
>
> behavios?
-> behaves. Will fix.
>
> > + */
> > +void pci_intx_unmanaged(struct pci_dev *pdev, int enable)
>
> I find this function name mildy confusing. This _unmanaged suffix is
> not
> really telling me anything. And the reference that this behaves
> identically to pci_intx() makes it even worse.
>
> This function is about controlling the PCI INTX_DISABLE bit in the
> PCI_COMMAND config word, right?
>
> So naming it pci_intx_control() would make it entirely clear what
> this
> is about, no?
We had this conversation last week. I answered on that already, maybe
you have overlooked it:
https://lore.kernel.org/all/a8d9f32f60f55c58d79943c4409b8b94535ff853.camel@redhat.com/
Please also take a look at patch 11, then you'll see the full picture
Danke,
Philipp
>
> Thanks,
>
> tglx
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 02/11] drivers/xen: Use never-managed version of pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 01/11] PCI: Prepare removing " Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 03/11] net/ethernet: " Philipp Stanner
` (8 subsequent siblings)
10 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
xen enables its PCI-Device with pci_enable_device(). Thus, it
needs the never-managed version.
Replace pci_intx() with pci_intx_unmanaged().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Acked-by: Juergen Gross <jgross@suse.com>
---
| 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--git a/drivers/xen/xen-pciback/conf_space_header.c b/drivers/xen/xen-pciback/conf_space_header.c
index fc0332645966..8d26d64232e8 100644
--- a/drivers/xen/xen-pciback/conf_space_header.c
+++ b/drivers/xen/xen-pciback/conf_space_header.c
@@ -106,7 +106,7 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
if (dev_data && dev_data->allow_interrupt_control &&
((cmd->val ^ value) & PCI_COMMAND_INTX_DISABLE))
- pci_intx(dev, !(value & PCI_COMMAND_INTX_DISABLE));
+ pci_intx_unmanaged(dev, !(value & PCI_COMMAND_INTX_DISABLE));
cmd->val = value;
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v2 03/11] net/ethernet: Use never-managed version of pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 01/11] PCI: Prepare removing " Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 02/11] drivers/xen: Use never-managed version of pci_intx() Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 04/11] net/ntb: " Philipp Stanner
` (7 subsequent siblings)
10 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
broadcom/bnx2x and brocade/bna enable their PCI-Device with
pci_enable_device(). Thus, they need the never-managed version.
Replace pci_intx() with pci_intx_unmanaged().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
---
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 2 +-
drivers/net/ethernet/brocade/bna/bnad.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 678829646cec..2ae63d6e6792 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -1669,7 +1669,7 @@ static void bnx2x_igu_int_enable(struct bnx2x *bp)
REG_WR(bp, IGU_REG_PF_CONFIGURATION, val);
if (val & IGU_PF_CONF_INT_LINE_EN)
- pci_intx(bp->pdev, true);
+ pci_intx_unmanaged(bp->pdev, true);
barrier();
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index ece6f3b48327..2b37462d406e 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -2669,7 +2669,7 @@ bnad_enable_msix(struct bnad *bnad)
}
}
- pci_intx(bnad->pcidev, 0);
+ pci_intx_unmanaged(bnad->pcidev, 0);
return;
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v2 04/11] net/ntb: Use never-managed version of pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
` (2 preceding siblings ...)
2024-11-13 12:41 ` [PATCH v2 03/11] net/ethernet: " Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 15:24 ` Dave Jiang
2024-11-13 12:41 ` [PATCH v2 05/11] misc: " Philipp Stanner
` (6 subsequent siblings)
10 siblings, 1 reply; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
hw/amd and how/intel enable their PCI-Device with pci_enable_device().
Thus, they need the never-managed version.
Replace pci_intx() with pci_intx_unmanaged().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Acked-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> #for ntb_hw_amd.c
---
drivers/ntb/hw/amd/ntb_hw_amd.c | 4 ++--
drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c
index d687e8c2cc78..b146f170e839 100644
--- a/drivers/ntb/hw/amd/ntb_hw_amd.c
+++ b/drivers/ntb/hw/amd/ntb_hw_amd.c
@@ -791,7 +791,7 @@ static int ndev_init_isr(struct amd_ntb_dev *ndev,
err_msi_enable:
/* Try to set up intx irq */
- pci_intx(pdev, 1);
+ pci_intx_unmanaged(pdev, 1);
rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
"ndev_irq_isr", ndev);
@@ -831,7 +831,7 @@ static void ndev_deinit_isr(struct amd_ntb_dev *ndev)
if (pci_dev_msi_enabled(pdev))
pci_disable_msi(pdev);
else
- pci_intx(pdev, 0);
+ pci_intx_unmanaged(pdev, 0);
}
}
diff --git a/drivers/ntb/hw/intel/ntb_hw_gen1.c b/drivers/ntb/hw/intel/ntb_hw_gen1.c
index 079b8cd79785..9ad9d7fe227e 100644
--- a/drivers/ntb/hw/intel/ntb_hw_gen1.c
+++ b/drivers/ntb/hw/intel/ntb_hw_gen1.c
@@ -445,7 +445,7 @@ int ndev_init_isr(struct intel_ntb_dev *ndev,
/* Try to set up intx irq */
- pci_intx(pdev, 1);
+ pci_intx_unmanaged(pdev, 1);
rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
"ndev_irq_isr", ndev);
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v2 04/11] net/ntb: Use never-managed version of pci_intx()
2024-11-13 12:41 ` [PATCH v2 04/11] net/ntb: " Philipp Stanner
@ 2024-11-13 15:24 ` Dave Jiang
0 siblings, 0 replies; 20+ messages in thread
From: Dave Jiang @ 2024-11-13 15:24 UTC (permalink / raw)
To: Philipp Stanner, Damien Le Moal, Niklas Cassel, Basavaraj Natikar,
Jiri Kosina, Benjamin Tissoires, Arnd Bergmann,
Greg Kroah-Hartman, Alex Dubov, Sudarsana Kalluru, Manish Chopra,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rasesh Mody, GR-Linux-NIC-Dev, Igor Mitsyanko,
Sergey Matyukevich, Kalle Valo, Sanjay R Mehta, Shyam Sundar S K,
Jon Mason, Allen Hubbe, Bjorn Helgaas, Alex Williamson,
Juergen Gross, Stefano Stabellini, Oleksandr Tyshchenko,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
On 11/13/24 5:41 AM, Philipp Stanner wrote:
> pci_intx() is a hybrid function which can sometimes be managed through
> devres. To remove this hybrid nature from pci_intx(), it is necessary to
> port users to either an always-managed or a never-managed version.
>
> hw/amd and how/intel enable their PCI-Device with pci_enable_device().
> Thus, they need the never-managed version.
>
> Replace pci_intx() with pci_intx_unmanaged().
>
> Signed-off-by: Philipp Stanner <pstanner@redhat.com>
> Acked-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> #for ntb_hw_amd.c
Acked-by: Dave Jiang <dave.jiang@intel.com> # for ntb_hw_gen1.c
> ---
> drivers/ntb/hw/amd/ntb_hw_amd.c | 4 ++--
> drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +-
> 2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c
> index d687e8c2cc78..b146f170e839 100644
> --- a/drivers/ntb/hw/amd/ntb_hw_amd.c
> +++ b/drivers/ntb/hw/amd/ntb_hw_amd.c
> @@ -791,7 +791,7 @@ static int ndev_init_isr(struct amd_ntb_dev *ndev,
> err_msi_enable:
>
> /* Try to set up intx irq */
> - pci_intx(pdev, 1);
> + pci_intx_unmanaged(pdev, 1);
>
> rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
> "ndev_irq_isr", ndev);
> @@ -831,7 +831,7 @@ static void ndev_deinit_isr(struct amd_ntb_dev *ndev)
> if (pci_dev_msi_enabled(pdev))
> pci_disable_msi(pdev);
> else
> - pci_intx(pdev, 0);
> + pci_intx_unmanaged(pdev, 0);
> }
> }
>
> diff --git a/drivers/ntb/hw/intel/ntb_hw_gen1.c b/drivers/ntb/hw/intel/ntb_hw_gen1.c
> index 079b8cd79785..9ad9d7fe227e 100644
> --- a/drivers/ntb/hw/intel/ntb_hw_gen1.c
> +++ b/drivers/ntb/hw/intel/ntb_hw_gen1.c
> @@ -445,7 +445,7 @@ int ndev_init_isr(struct intel_ntb_dev *ndev,
>
> /* Try to set up intx irq */
>
> - pci_intx(pdev, 1);
> + pci_intx_unmanaged(pdev, 1);
>
> rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
> "ndev_irq_isr", ndev);
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 05/11] misc: Use never-managed version of pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
` (3 preceding siblings ...)
2024-11-13 12:41 ` [PATCH v2 04/11] net/ntb: " Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 06/11] vfio/pci: " Philipp Stanner
` (5 subsequent siblings)
10 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
cardreader/rtsx_pcr.c and tifm_7xx1.c enable their PCI-Device with
pci_enable_device(). Thus, they need the never-managed version.
Replace pci_intx() with pci_intx_unmanaged().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
---
drivers/misc/cardreader/rtsx_pcr.c | 2 +-
drivers/misc/tifm_7xx1.c | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c
index be3d4e0e50cc..e25e6d560dd7 100644
--- a/drivers/misc/cardreader/rtsx_pcr.c
+++ b/drivers/misc/cardreader/rtsx_pcr.c
@@ -1057,7 +1057,7 @@ static int rtsx_pci_acquire_irq(struct rtsx_pcr *pcr)
}
pcr->irq = pcr->pci->irq;
- pci_intx(pcr->pci, !pcr->msi_en);
+ pci_intx_unmanaged(pcr->pci, !pcr->msi_en);
return 0;
}
diff --git a/drivers/misc/tifm_7xx1.c b/drivers/misc/tifm_7xx1.c
index 1d54680d6ed2..5f9c7ccae8d2 100644
--- a/drivers/misc/tifm_7xx1.c
+++ b/drivers/misc/tifm_7xx1.c
@@ -327,7 +327,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev,
goto err_out;
}
- pci_intx(dev, 1);
+ pci_intx_unmanaged(dev, 1);
fm = tifm_alloc_adapter(dev->device == PCI_DEVICE_ID_TI_XX21_XX11_FM
? 4 : 2, &dev->dev);
@@ -368,7 +368,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev,
err_out_free:
tifm_free_adapter(fm);
err_out_int:
- pci_intx(dev, 0);
+ pci_intx_unmanaged(dev, 0);
pci_release_regions(dev);
err_out:
if (!pci_dev_busy)
@@ -392,7 +392,7 @@ static void tifm_7xx1_remove(struct pci_dev *dev)
tifm_7xx1_sock_power_off(tifm_7xx1_sock_addr(fm->addr, cnt));
iounmap(fm->addr);
- pci_intx(dev, 0);
+ pci_intx_unmanaged(dev, 0);
pci_release_regions(dev);
pci_disable_device(dev);
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v2 06/11] vfio/pci: Use never-managed version of pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
` (4 preceding siblings ...)
2024-11-13 12:41 ` [PATCH v2 05/11] misc: " Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 07/11] PCI: MSI: " Philipp Stanner
` (4 subsequent siblings)
10 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
vfio enables its PCI-Device with pci_enable_device(). Thus, it
needs the never-managed version.
Replace pci_intx() with pci_intx_unmanaged().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
---
drivers/vfio/pci/vfio_pci_core.c | 2 +-
drivers/vfio/pci/vfio_pci_intrs.c | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
index 1ab58da9f38a..90240c8d51aa 100644
--- a/drivers/vfio/pci/vfio_pci_core.c
+++ b/drivers/vfio/pci/vfio_pci_core.c
@@ -498,7 +498,7 @@ int vfio_pci_core_enable(struct vfio_pci_core_device *vdev)
if (vfio_pci_nointx(pdev)) {
pci_info(pdev, "Masking broken INTx support\n");
vdev->nointx = true;
- pci_intx(pdev, 0);
+ pci_intx_unmanaged(pdev, 0);
} else
vdev->pci_2_3 = pci_intx_mask_supported(pdev);
}
diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
index 8382c5834335..40abb0b937a2 100644
--- a/drivers/vfio/pci/vfio_pci_intrs.c
+++ b/drivers/vfio/pci/vfio_pci_intrs.c
@@ -118,7 +118,7 @@ static bool __vfio_pci_intx_mask(struct vfio_pci_core_device *vdev)
*/
if (unlikely(!is_intx(vdev))) {
if (vdev->pci_2_3)
- pci_intx(pdev, 0);
+ pci_intx_unmanaged(pdev, 0);
goto out_unlock;
}
@@ -132,7 +132,7 @@ static bool __vfio_pci_intx_mask(struct vfio_pci_core_device *vdev)
* mask, not just when something is pending.
*/
if (vdev->pci_2_3)
- pci_intx(pdev, 0);
+ pci_intx_unmanaged(pdev, 0);
else
disable_irq_nosync(pdev->irq);
@@ -178,7 +178,7 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *data)
*/
if (unlikely(!is_intx(vdev))) {
if (vdev->pci_2_3)
- pci_intx(pdev, 1);
+ pci_intx_unmanaged(pdev, 1);
goto out_unlock;
}
@@ -296,7 +296,7 @@ static int vfio_intx_enable(struct vfio_pci_core_device *vdev,
*/
ctx->masked = vdev->virq_disabled;
if (vdev->pci_2_3) {
- pci_intx(pdev, !ctx->masked);
+ pci_intx_unmanaged(pdev, !ctx->masked);
irqflags = IRQF_SHARED;
} else {
irqflags = ctx->masked ? IRQF_NO_AUTOEN : 0;
@@ -569,7 +569,7 @@ static void vfio_msi_disable(struct vfio_pci_core_device *vdev, bool msix)
* via their shutdown paths. Restore for NoINTx devices.
*/
if (vdev->nointx)
- pci_intx(pdev, 0);
+ pci_intx_unmanaged(pdev, 0);
vdev->irq_type = VFIO_PCI_NUM_IRQS;
}
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v2 07/11] PCI: MSI: Use never-managed version of pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
` (5 preceding siblings ...)
2024-11-13 12:41 ` [PATCH v2 06/11] vfio/pci: " Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-15 15:35 ` Thomas Gleixner
2024-11-13 12:41 ` [PATCH v2 08/11] ata: Use always-managed " Philipp Stanner
` (3 subsequent siblings)
10 siblings, 1 reply; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
MSI sets up its own separate devres callback implicitly in
pcim_setup_msi_release(). This callback ultimately uses pci_intx(),
which is problematic since the callback of course runs on driver-detach.
That problem has last been described here:
https://lore.kernel.org/all/ee44ea7ac760e73edad3f20b30b4d2fff66c1a85.camel@redhat.com/
Replace the call to pci_intx() with one to the never-managed version
pci_intx_unmanaged().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
---
drivers/pci/msi/api.c | 2 +-
drivers/pci/msi/msi.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index b956ce591f96..c95e2e7dc9ab 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -289,7 +289,7 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
*/
if (affd)
irq_create_affinity_masks(1, affd);
- pci_intx(dev, 1);
+ pci_intx_unmanaged(dev, 1);
return 1;
}
}
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 3a45879d85db..53f13b09db50 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -268,7 +268,7 @@ EXPORT_SYMBOL_GPL(pci_write_msi_msg);
static void pci_intx_for_msi(struct pci_dev *dev, int enable)
{
if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG))
- pci_intx(dev, enable);
+ pci_intx_unmanaged(dev, enable);
}
static void pci_msi_set_enable(struct pci_dev *dev, int enable)
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v2 07/11] PCI: MSI: Use never-managed version of pci_intx()
2024-11-13 12:41 ` [PATCH v2 07/11] PCI: MSI: " Philipp Stanner
@ 2024-11-15 15:35 ` Thomas Gleixner
0 siblings, 0 replies; 20+ messages in thread
From: Thomas Gleixner @ 2024-11-15 15:35 UTC (permalink / raw)
To: Philipp Stanner, Damien Le Moal, Niklas Cassel, Basavaraj Natikar,
Jiri Kosina, Benjamin Tissoires, Arnd Bergmann,
Greg Kroah-Hartman, Alex Dubov, Sudarsana Kalluru, Manish Chopra,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rasesh Mody, GR-Linux-NIC-Dev, Igor Mitsyanko,
Sergey Matyukevich, Kalle Valo, Sanjay R Mehta, Shyam Sundar S K,
Jon Mason, Dave Jiang, Allen Hubbe, Bjorn Helgaas,
Alex Williamson, Juergen Gross, Stefano Stabellini,
Oleksandr Tyshchenko, Philipp Stanner, Mario Limonciello, Chen Ni,
Ricky Wu, Al Viro, Breno Leitao, Kevin Tian, Mostafa Saleh,
Andy Shevchenko, Jason Gunthorpe, Yi Liu, Kunwu Chan,
Ankit Agrawal, Christian Brauner, Reinette Chatre, Eric Auger,
Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
On Wed, Nov 13 2024 at 13:41, Philipp Stanner wrote:
> pci_intx() is a hybrid function which can sometimes be managed through
> devres. To remove this hybrid nature from pci_intx(), it is necessary to
> port users to either an always-managed or a never-managed version.
>
> MSI sets up its own separate devres callback implicitly in
> pcim_setup_msi_release(). This callback ultimately uses pci_intx(),
> which is problematic since the callback of course runs on driver-detach.
>
> That problem has last been described here:
> https://lore.kernel.org/all/ee44ea7ac760e73edad3f20b30b4d2fff66c1a85.camel@redhat.com/
>
> Replace the call to pci_intx() with one to the never-managed version
> pci_intx_unmanaged().
>
> Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 08/11] ata: Use always-managed version of pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
` (6 preceding siblings ...)
2024-11-13 12:41 ` [PATCH v2 07/11] PCI: MSI: " Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 09/11] wifi: qtnfmac: use always-managed version of pcim_intx() Philipp Stanner
` (2 subsequent siblings)
10 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel, Sergey Shtylyov
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
All users in ata enable their PCI-Device with pcim_enable_device(). Thus,
they need the always-managed version.
Replace pci_intx() with pcim_intx().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Reviewed-by: Sergey Shtylyov <s.shtylyov@omp.ru>
Acked-by: Niklas Cassel <cassel@kernel.org>
---
drivers/ata/ahci.c | 2 +-
drivers/ata/ata_piix.c | 2 +-
drivers/ata/pata_rdc.c | 2 +-
drivers/ata/sata_sil24.c | 2 +-
drivers/ata/sata_sis.c | 2 +-
drivers/ata/sata_uli.c | 2 +-
drivers/ata/sata_vsc.c | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 45f63b09828a..9273ff3d4732 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -1985,7 +1985,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (ahci_init_msi(pdev, n_ports, hpriv) < 0) {
/* legacy intx interrupts */
- pci_intx(pdev, 1);
+ pcim_intx(pdev, 1);
}
hpriv->irq = pci_irq_vector(pdev, 0);
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
index 093b940bc953..d441246fa357 100644
--- a/drivers/ata/ata_piix.c
+++ b/drivers/ata/ata_piix.c
@@ -1725,7 +1725,7 @@ static int piix_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
* message-signalled interrupts currently).
*/
if (port_flags & PIIX_FLAG_CHECKINTR)
- pci_intx(pdev, 1);
+ pcim_intx(pdev, 1);
if (piix_check_450nx_errata(pdev)) {
/* This writes into the master table but it does not
diff --git a/drivers/ata/pata_rdc.c b/drivers/ata/pata_rdc.c
index 0a9689862f71..09792aac7f9d 100644
--- a/drivers/ata/pata_rdc.c
+++ b/drivers/ata/pata_rdc.c
@@ -340,7 +340,7 @@ static int rdc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
return rc;
host->private_data = hpriv;
- pci_intx(pdev, 1);
+ pcim_intx(pdev, 1);
host->flags |= ATA_HOST_PARALLEL_SCAN;
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
index 72c03cbdaff4..b771ebd41252 100644
--- a/drivers/ata/sata_sil24.c
+++ b/drivers/ata/sata_sil24.c
@@ -1317,7 +1317,7 @@ static int sil24_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
if (sata_sil24_msi && !pci_enable_msi(pdev)) {
dev_info(&pdev->dev, "Using MSI\n");
- pci_intx(pdev, 0);
+ pcim_intx(pdev, 0);
}
pci_set_master(pdev);
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c
index ef8724986de3..b8b6d9eff3b8 100644
--- a/drivers/ata/sata_sis.c
+++ b/drivers/ata/sata_sis.c
@@ -290,7 +290,7 @@ static int sis_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
}
pci_set_master(pdev);
- pci_intx(pdev, 1);
+ pcim_intx(pdev, 1);
return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &sis_sht);
}
diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c
index 60ea45926cd1..52894ff49dcb 100644
--- a/drivers/ata/sata_uli.c
+++ b/drivers/ata/sata_uli.c
@@ -221,7 +221,7 @@ static int uli_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
}
pci_set_master(pdev);
- pci_intx(pdev, 1);
+ pcim_intx(pdev, 1);
return ata_host_activate(host, pdev->irq, ata_bmdma_interrupt,
IRQF_SHARED, &uli_sht);
}
diff --git a/drivers/ata/sata_vsc.c b/drivers/ata/sata_vsc.c
index d39b87537168..a53a2dfc1e17 100644
--- a/drivers/ata/sata_vsc.c
+++ b/drivers/ata/sata_vsc.c
@@ -384,7 +384,7 @@ static int vsc_sata_init_one(struct pci_dev *pdev,
pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x80);
if (pci_enable_msi(pdev) == 0)
- pci_intx(pdev, 0);
+ pcim_intx(pdev, 0);
/*
* Config offset 0x98 is "Extended Control and Status Register 0"
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v2 09/11] wifi: qtnfmac: use always-managed version of pcim_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
` (7 preceding siblings ...)
2024-11-13 12:41 ` [PATCH v2 08/11] ata: Use always-managed " Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 10/11] HID: amd_sfh: Use " Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 11/11] Remove devres from pci_intx() Philipp Stanner
10 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
qtnfmac enables its PCI-Device with pcim_enable_device(). Thus, it needs
the always-managed version.
Replace pci_intx() with pcim_intx().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Acked-by: Kalle Valo <kvalo@kernel.org>
---
drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c b/drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c
index f66eb43094d4..3adcfac2886f 100644
--- a/drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c
+++ b/drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c
@@ -204,7 +204,7 @@ static void qtnf_pcie_init_irq(struct qtnf_pcie_bus_priv *priv, bool use_msi)
if (!priv->msi_enabled) {
pr_warn("legacy PCIE interrupts enabled\n");
- pci_intx(pdev, 1);
+ pcim_intx(pdev, 1);
}
}
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v2 10/11] HID: amd_sfh: Use always-managed version of pcim_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
` (8 preceding siblings ...)
2024-11-13 12:41 ` [PATCH v2 09/11] wifi: qtnfmac: use always-managed version of pcim_intx() Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 12:41 ` [PATCH v2 11/11] Remove devres from pci_intx() Philipp Stanner
10 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel, Basavaraj Natikar
pci_intx() is a hybrid function which can sometimes be managed through
devres. To remove this hybrid nature from pci_intx(), it is necessary to
port users to either an always-managed or a never-managed version.
All users of amd_mp2_pci_remove(), where pci_intx() is used, call
pcim_enable_device(), which is why the driver needs the always-managed
version.
Replace pci_intx() with pcim_intx().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
Acked-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
---
drivers/hid/amd-sfh-hid/amd_sfh_pcie.c | 4 ++--
drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
index 0c28ca349bcd..48cfd0c58241 100644
--- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
@@ -122,7 +122,7 @@ int amd_sfh_irq_init_v2(struct amd_mp2_dev *privdata)
{
int rc;
- pci_intx(privdata->pdev, true);
+ pcim_intx(privdata->pdev, true);
rc = devm_request_irq(&privdata->pdev->dev, privdata->pdev->irq,
amd_sfh_irq_handler, 0, DRIVER_NAME, privdata);
@@ -248,7 +248,7 @@ static void amd_mp2_pci_remove(void *privdata)
struct amd_mp2_dev *mp2 = privdata;
amd_sfh_hid_client_deinit(privdata);
mp2->mp2_ops->stop_all(mp2);
- pci_intx(mp2->pdev, false);
+ pcim_intx(mp2->pdev, false);
amd_sfh_clear_intr(mp2);
}
diff --git a/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c b/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c
index db36d87d5634..ec9feb8e023b 100644
--- a/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c
+++ b/drivers/hid/amd-sfh-hid/sfh1_1/amd_sfh_init.c
@@ -289,7 +289,7 @@ static void amd_mp2_pci_remove(void *privdata)
sfh_deinit_emp2();
amd_sfh_hid_client_deinit(privdata);
mp2->mp2_ops->stop_all(mp2);
- pci_intx(mp2->pdev, false);
+ pcim_intx(mp2->pdev, false);
amd_sfh_clear_intr(mp2);
}
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v2 11/11] Remove devres from pci_intx()
2024-11-13 12:41 [PATCH v2 00/11] Remove implicit devres from pci_intx() Philipp Stanner
` (9 preceding siblings ...)
2024-11-13 12:41 ` [PATCH v2 10/11] HID: amd_sfh: Use " Philipp Stanner
@ 2024-11-13 12:41 ` Philipp Stanner
2024-11-13 16:22 ` Thomas Gleixner
10 siblings, 1 reply; 20+ messages in thread
From: Philipp Stanner @ 2024-11-13 12:41 UTC (permalink / raw)
To: Damien Le Moal, Niklas Cassel, Basavaraj Natikar, Jiri Kosina,
Benjamin Tissoires, Arnd Bergmann, Greg Kroah-Hartman, Alex Dubov,
Sudarsana Kalluru, Manish Chopra, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rasesh Mody,
GR-Linux-NIC-Dev, Igor Mitsyanko, Sergey Matyukevich, Kalle Valo,
Sanjay R Mehta, Shyam Sundar S K, Jon Mason, Dave Jiang,
Allen Hubbe, Bjorn Helgaas, Alex Williamson, Juergen Gross,
Stefano Stabellini, Oleksandr Tyshchenko, Philipp Stanner,
Mario Limonciello, Chen Ni, Ricky Wu, Al Viro, Breno Leitao,
Kevin Tian, Thomas Gleixner, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
pci_intx() is a hybrid function which can sometimes be managed through
devres. This hybrid nature is undesirable.
Since all users of pci_intx() have by now been ported either to
always-managed pcim_intx() or never-managed pci_intx_unmanaged(), the
devres functionality can be removed from pci_intx().
Consequently, pci_intx_unmanaged() is now redundant, because pci_intx()
itself is now unmanaged.
Remove the devres functionality from pci_intx(). Have all users of
pci_intx_unmanaged() call pci_intx(). Remove pci_intx_unmanaged().
Signed-off-by: Philipp Stanner <pstanner@redhat.com>
---
drivers/misc/cardreader/rtsx_pcr.c | 2 +-
drivers/misc/tifm_7xx1.c | 6 +--
.../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 2 +-
drivers/net/ethernet/brocade/bna/bnad.c | 2 +-
drivers/ntb/hw/amd/ntb_hw_amd.c | 4 +-
drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +-
drivers/pci/devres.c | 4 +-
drivers/pci/msi/api.c | 2 +-
drivers/pci/msi/msi.c | 2 +-
drivers/pci/pci.c | 43 +------------------
drivers/vfio/pci/vfio_pci_core.c | 2 +-
drivers/vfio/pci/vfio_pci_intrs.c | 10 ++---
| 2 +-
include/linux/pci.h | 1 -
14 files changed, 22 insertions(+), 62 deletions(-)
diff --git a/drivers/misc/cardreader/rtsx_pcr.c b/drivers/misc/cardreader/rtsx_pcr.c
index e25e6d560dd7..be3d4e0e50cc 100644
--- a/drivers/misc/cardreader/rtsx_pcr.c
+++ b/drivers/misc/cardreader/rtsx_pcr.c
@@ -1057,7 +1057,7 @@ static int rtsx_pci_acquire_irq(struct rtsx_pcr *pcr)
}
pcr->irq = pcr->pci->irq;
- pci_intx_unmanaged(pcr->pci, !pcr->msi_en);
+ pci_intx(pcr->pci, !pcr->msi_en);
return 0;
}
diff --git a/drivers/misc/tifm_7xx1.c b/drivers/misc/tifm_7xx1.c
index 5f9c7ccae8d2..1d54680d6ed2 100644
--- a/drivers/misc/tifm_7xx1.c
+++ b/drivers/misc/tifm_7xx1.c
@@ -327,7 +327,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev,
goto err_out;
}
- pci_intx_unmanaged(dev, 1);
+ pci_intx(dev, 1);
fm = tifm_alloc_adapter(dev->device == PCI_DEVICE_ID_TI_XX21_XX11_FM
? 4 : 2, &dev->dev);
@@ -368,7 +368,7 @@ static int tifm_7xx1_probe(struct pci_dev *dev,
err_out_free:
tifm_free_adapter(fm);
err_out_int:
- pci_intx_unmanaged(dev, 0);
+ pci_intx(dev, 0);
pci_release_regions(dev);
err_out:
if (!pci_dev_busy)
@@ -392,7 +392,7 @@ static void tifm_7xx1_remove(struct pci_dev *dev)
tifm_7xx1_sock_power_off(tifm_7xx1_sock_addr(fm->addr, cnt));
iounmap(fm->addr);
- pci_intx_unmanaged(dev, 0);
+ pci_intx(dev, 0);
pci_release_regions(dev);
pci_disable_device(dev);
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 2ae63d6e6792..678829646cec 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -1669,7 +1669,7 @@ static void bnx2x_igu_int_enable(struct bnx2x *bp)
REG_WR(bp, IGU_REG_PF_CONFIGURATION, val);
if (val & IGU_PF_CONF_INT_LINE_EN)
- pci_intx_unmanaged(bp->pdev, true);
+ pci_intx(bp->pdev, true);
barrier();
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index 2b37462d406e..ece6f3b48327 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -2669,7 +2669,7 @@ bnad_enable_msix(struct bnad *bnad)
}
}
- pci_intx_unmanaged(bnad->pcidev, 0);
+ pci_intx(bnad->pcidev, 0);
return;
diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c
index b146f170e839..d687e8c2cc78 100644
--- a/drivers/ntb/hw/amd/ntb_hw_amd.c
+++ b/drivers/ntb/hw/amd/ntb_hw_amd.c
@@ -791,7 +791,7 @@ static int ndev_init_isr(struct amd_ntb_dev *ndev,
err_msi_enable:
/* Try to set up intx irq */
- pci_intx_unmanaged(pdev, 1);
+ pci_intx(pdev, 1);
rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
"ndev_irq_isr", ndev);
@@ -831,7 +831,7 @@ static void ndev_deinit_isr(struct amd_ntb_dev *ndev)
if (pci_dev_msi_enabled(pdev))
pci_disable_msi(pdev);
else
- pci_intx_unmanaged(pdev, 0);
+ pci_intx(pdev, 0);
}
}
diff --git a/drivers/ntb/hw/intel/ntb_hw_gen1.c b/drivers/ntb/hw/intel/ntb_hw_gen1.c
index 9ad9d7fe227e..079b8cd79785 100644
--- a/drivers/ntb/hw/intel/ntb_hw_gen1.c
+++ b/drivers/ntb/hw/intel/ntb_hw_gen1.c
@@ -445,7 +445,7 @@ int ndev_init_isr(struct intel_ntb_dev *ndev,
/* Try to set up intx irq */
- pci_intx_unmanaged(pdev, 1);
+ pci_intx(pdev, 1);
rc = request_irq(pdev->irq, ndev_irq_isr, IRQF_SHARED,
"ndev_irq_isr", ndev);
diff --git a/drivers/pci/devres.c b/drivers/pci/devres.c
index d32827a1f2f4..6f8f712fe34e 100644
--- a/drivers/pci/devres.c
+++ b/drivers/pci/devres.c
@@ -416,7 +416,7 @@ static void pcim_intx_restore(struct device *dev, void *data)
struct pci_dev *pdev = to_pci_dev(dev);
struct pcim_intx_devres *res = data;
- pci_intx_unmanaged(pdev, res->orig_intx);
+ pci_intx(pdev, res->orig_intx);
}
static struct pcim_intx_devres *get_or_create_intx_devres(struct device *dev)
@@ -453,7 +453,7 @@ int pcim_intx(struct pci_dev *pdev, int enable)
return -ENOMEM;
res->orig_intx = !enable;
- pci_intx_unmanaged(pdev, enable);
+ pci_intx(pdev, enable);
return 0;
}
diff --git a/drivers/pci/msi/api.c b/drivers/pci/msi/api.c
index c95e2e7dc9ab..b956ce591f96 100644
--- a/drivers/pci/msi/api.c
+++ b/drivers/pci/msi/api.c
@@ -289,7 +289,7 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs,
*/
if (affd)
irq_create_affinity_masks(1, affd);
- pci_intx_unmanaged(dev, 1);
+ pci_intx(dev, 1);
return 1;
}
}
diff --git a/drivers/pci/msi/msi.c b/drivers/pci/msi/msi.c
index 53f13b09db50..3a45879d85db 100644
--- a/drivers/pci/msi/msi.c
+++ b/drivers/pci/msi/msi.c
@@ -268,7 +268,7 @@ EXPORT_SYMBOL_GPL(pci_write_msi_msg);
static void pci_intx_for_msi(struct pci_dev *dev, int enable)
{
if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG))
- pci_intx_unmanaged(dev, enable);
+ pci_intx(dev, enable);
}
static void pci_msi_set_enable(struct pci_dev *dev, int enable)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index c945811b207a..df537c6f383d 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4481,17 +4481,13 @@ void pci_disable_parity(struct pci_dev *dev)
}
/**
- * pci_intx_unmanaged - enables/disables PCI INTx for device dev,
- * unmanaged version
+ * pci_intx - enables/disables PCI INTx for device dev
* @pdev: the PCI device to operate on
* @enable: boolean: whether to enable or disable PCI INTx
*
* Enables/disables PCI INTx for device @pdev
- *
- * This function behavios identically to pci_intx(), but is never managed with
- * devres.
*/
-void pci_intx_unmanaged(struct pci_dev *pdev, int enable)
+void pci_intx(struct pci_dev *pdev, int enable)
{
u16 pci_command, new;
@@ -4507,41 +4503,6 @@ void pci_intx_unmanaged(struct pci_dev *pdev, int enable)
pci_write_config_word(pdev, PCI_COMMAND, new);
}
-EXPORT_SYMBOL_GPL(pci_intx_unmanaged);
-
-/**
- * pci_intx - enables/disables PCI INTx for device dev
- * @pdev: the PCI device to operate on
- * @enable: boolean: whether to enable or disable PCI INTx
- *
- * Enables/disables PCI INTx for device @pdev
- *
- * NOTE:
- * This is a "hybrid" function: It's normally unmanaged, but becomes managed
- * when pcim_enable_device() has been called in advance. This hybrid feature is
- * DEPRECATED! If you want managed cleanup, use pcim_intx() instead.
- */
-void pci_intx(struct pci_dev *pdev, int enable)
-{
- u16 pci_command, new;
-
- pci_read_config_word(pdev, PCI_COMMAND, &pci_command);
-
- if (enable)
- new = pci_command & ~PCI_COMMAND_INTX_DISABLE;
- else
- new = pci_command | PCI_COMMAND_INTX_DISABLE;
-
- 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);
/**
diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
index 90240c8d51aa..1ab58da9f38a 100644
--- a/drivers/vfio/pci/vfio_pci_core.c
+++ b/drivers/vfio/pci/vfio_pci_core.c
@@ -498,7 +498,7 @@ int vfio_pci_core_enable(struct vfio_pci_core_device *vdev)
if (vfio_pci_nointx(pdev)) {
pci_info(pdev, "Masking broken INTx support\n");
vdev->nointx = true;
- pci_intx_unmanaged(pdev, 0);
+ pci_intx(pdev, 0);
} else
vdev->pci_2_3 = pci_intx_mask_supported(pdev);
}
diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c
index 40abb0b937a2..8382c5834335 100644
--- a/drivers/vfio/pci/vfio_pci_intrs.c
+++ b/drivers/vfio/pci/vfio_pci_intrs.c
@@ -118,7 +118,7 @@ static bool __vfio_pci_intx_mask(struct vfio_pci_core_device *vdev)
*/
if (unlikely(!is_intx(vdev))) {
if (vdev->pci_2_3)
- pci_intx_unmanaged(pdev, 0);
+ pci_intx(pdev, 0);
goto out_unlock;
}
@@ -132,7 +132,7 @@ static bool __vfio_pci_intx_mask(struct vfio_pci_core_device *vdev)
* mask, not just when something is pending.
*/
if (vdev->pci_2_3)
- pci_intx_unmanaged(pdev, 0);
+ pci_intx(pdev, 0);
else
disable_irq_nosync(pdev->irq);
@@ -178,7 +178,7 @@ static int vfio_pci_intx_unmask_handler(void *opaque, void *data)
*/
if (unlikely(!is_intx(vdev))) {
if (vdev->pci_2_3)
- pci_intx_unmanaged(pdev, 1);
+ pci_intx(pdev, 1);
goto out_unlock;
}
@@ -296,7 +296,7 @@ static int vfio_intx_enable(struct vfio_pci_core_device *vdev,
*/
ctx->masked = vdev->virq_disabled;
if (vdev->pci_2_3) {
- pci_intx_unmanaged(pdev, !ctx->masked);
+ pci_intx(pdev, !ctx->masked);
irqflags = IRQF_SHARED;
} else {
irqflags = ctx->masked ? IRQF_NO_AUTOEN : 0;
@@ -569,7 +569,7 @@ static void vfio_msi_disable(struct vfio_pci_core_device *vdev, bool msix)
* via their shutdown paths. Restore for NoINTx devices.
*/
if (vdev->nointx)
- pci_intx_unmanaged(pdev, 0);
+ pci_intx(pdev, 0);
vdev->irq_type = VFIO_PCI_NUM_IRQS;
}
--git a/drivers/xen/xen-pciback/conf_space_header.c b/drivers/xen/xen-pciback/conf_space_header.c
index 8d26d64232e8..fc0332645966 100644
--- a/drivers/xen/xen-pciback/conf_space_header.c
+++ b/drivers/xen/xen-pciback/conf_space_header.c
@@ -106,7 +106,7 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
if (dev_data && dev_data->allow_interrupt_control &&
((cmd->val ^ value) & PCI_COMMAND_INTX_DISABLE))
- pci_intx_unmanaged(dev, !(value & PCI_COMMAND_INTX_DISABLE));
+ pci_intx(dev, !(value & PCI_COMMAND_INTX_DISABLE));
cmd->val = value;
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 6b8cde76d564..1b2a6dd1dfed 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1353,7 +1353,6 @@ int __must_check pcim_set_mwi(struct pci_dev *dev);
int pci_try_set_mwi(struct pci_dev *dev);
void pci_clear_mwi(struct pci_dev *dev);
void pci_disable_parity(struct pci_dev *dev);
-void pci_intx_unmanaged(struct pci_dev *pdev, int enable);
void pci_intx(struct pci_dev *dev, int enable);
bool pci_check_and_mask_intx(struct pci_dev *dev);
bool pci_check_and_unmask_intx(struct pci_dev *dev);
--
2.47.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v2 11/11] Remove devres from pci_intx()
2024-11-13 12:41 ` [PATCH v2 11/11] Remove devres from pci_intx() Philipp Stanner
@ 2024-11-13 16:22 ` Thomas Gleixner
2024-11-14 9:05 ` Philipp Stanner
0 siblings, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2024-11-13 16:22 UTC (permalink / raw)
To: Philipp Stanner, Damien Le Moal, Niklas Cassel, Basavaraj Natikar,
Jiri Kosina, Benjamin Tissoires, Arnd Bergmann,
Greg Kroah-Hartman, Alex Dubov, Sudarsana Kalluru, Manish Chopra,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rasesh Mody, GR-Linux-NIC-Dev, Igor Mitsyanko,
Sergey Matyukevich, Kalle Valo, Sanjay R Mehta, Shyam Sundar S K,
Jon Mason, Dave Jiang, Allen Hubbe, Bjorn Helgaas,
Alex Williamson, Juergen Gross, Stefano Stabellini,
Oleksandr Tyshchenko, Philipp Stanner, Mario Limonciello, Chen Ni,
Ricky Wu, Al Viro, Breno Leitao, Kevin Tian, Mostafa Saleh,
Andy Shevchenko, Jason Gunthorpe, Yi Liu, Kunwu Chan,
Ankit Agrawal, Christian Brauner, Reinette Chatre, Eric Auger,
Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
On Wed, Nov 13 2024 at 13:41, Philipp Stanner wrote:
> pci_intx() is a hybrid function which can sometimes be managed through
> devres. This hybrid nature is undesirable.
>
> Since all users of pci_intx() have by now been ported either to
> always-managed pcim_intx() or never-managed pci_intx_unmanaged(), the
> devres functionality can be removed from pci_intx().
>
> Consequently, pci_intx_unmanaged() is now redundant, because pci_intx()
> itself is now unmanaged.
>
> Remove the devres functionality from pci_intx(). Have all users of
> pci_intx_unmanaged() call pci_intx(). Remove pci_intx_unmanaged().
>
> Signed-off-by: Philipp Stanner <pstanner@redhat.com>
> ---
> drivers/misc/cardreader/rtsx_pcr.c | 2 +-
> drivers/misc/tifm_7xx1.c | 6 +--
> .../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 2 +-
> drivers/net/ethernet/brocade/bna/bnad.c | 2 +-
> drivers/ntb/hw/amd/ntb_hw_amd.c | 4 +-
> drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +-
> drivers/pci/devres.c | 4 +-
> drivers/pci/msi/api.c | 2 +-
> drivers/pci/msi/msi.c | 2 +-
> drivers/pci/pci.c | 43 +------------------
> drivers/vfio/pci/vfio_pci_core.c | 2 +-
> drivers/vfio/pci/vfio_pci_intrs.c | 10 ++---
> drivers/xen/xen-pciback/conf_space_header.c | 2 +-
> include/linux/pci.h | 1 -
> 14 files changed, 22 insertions(+), 62 deletions(-)
Now I'm utterly confused. This undoes the pci_intx_unmanaged() churn
which you carefully split into several patches first.
So the net change is that:
1) pci_intx() is now always unmanaged
2) a couple of drivers use pcim_intx() now instead of pci_intx()
The obvious ordering is:
1) Convert the drivers which need the managed version to use
pcim_intx()
2) Remove the managed warning in pci_intx() and clean up the comment
3) Remove __pcim_intx() and invoke pci_intx() in the devres code.
No?
Thanks,
tglx
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v2 11/11] Remove devres from pci_intx()
2024-11-13 16:22 ` Thomas Gleixner
@ 2024-11-14 9:05 ` Philipp Stanner
2024-11-15 0:46 ` Thomas Gleixner
0 siblings, 1 reply; 20+ messages in thread
From: Philipp Stanner @ 2024-11-14 9:05 UTC (permalink / raw)
To: Thomas Gleixner, Damien Le Moal, Niklas Cassel, Basavaraj Natikar,
Jiri Kosina, Benjamin Tissoires, Arnd Bergmann,
Greg Kroah-Hartman, Alex Dubov, Sudarsana Kalluru, Manish Chopra,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rasesh Mody, GR-Linux-NIC-Dev, Igor Mitsyanko,
Sergey Matyukevich, Kalle Valo, Sanjay R Mehta, Shyam Sundar S K,
Jon Mason, Dave Jiang, Allen Hubbe, Bjorn Helgaas,
Alex Williamson, Juergen Gross, Stefano Stabellini,
Oleksandr Tyshchenko, Mario Limonciello, Chen Ni, Ricky Wu,
Al Viro, Breno Leitao, Kevin Tian, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
On Wed, 2024-11-13 at 17:22 +0100, Thomas Gleixner wrote:
> On Wed, Nov 13 2024 at 13:41, Philipp Stanner wrote:
> > pci_intx() is a hybrid function which can sometimes be managed
> > through
> > devres. This hybrid nature is undesirable.
> >
> > Since all users of pci_intx() have by now been ported either to
> > always-managed pcim_intx() or never-managed pci_intx_unmanaged(),
> > the
> > devres functionality can be removed from pci_intx().
> >
> > Consequently, pci_intx_unmanaged() is now redundant, because
> > pci_intx()
> > itself is now unmanaged.
> >
> > Remove the devres functionality from pci_intx(). Have all users of
> > pci_intx_unmanaged() call pci_intx(). Remove pci_intx_unmanaged().
> >
> > Signed-off-by: Philipp Stanner <pstanner@redhat.com>
> > ---
> > drivers/misc/cardreader/rtsx_pcr.c | 2 +-
> > drivers/misc/tifm_7xx1.c | 6 +--
> > .../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 2 +-
> > drivers/net/ethernet/brocade/bna/bnad.c | 2 +-
> > drivers/ntb/hw/amd/ntb_hw_amd.c | 4 +-
> > drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +-
> > drivers/pci/devres.c | 4 +-
> > drivers/pci/msi/api.c | 2 +-
> > drivers/pci/msi/msi.c | 2 +-
> > drivers/pci/pci.c | 43 +--------------
> > ----
> > drivers/vfio/pci/vfio_pci_core.c | 2 +-
> > drivers/vfio/pci/vfio_pci_intrs.c | 10 ++---
> > drivers/xen/xen-pciback/conf_space_header.c | 2 +-
> > include/linux/pci.h | 1 -
> > 14 files changed, 22 insertions(+), 62 deletions(-)
>
> Now I'm utterly confused. This undoes the pci_intx_unmanaged() churn
> which you carefully split into several patches first.
Have you read the email I have linked?
There is also the cover-letter (does anyone in the community ever read
those?) which explicitly states:
"Patch "Remove devres from pci_intx()" obviously reverts the previous
patches that made drivers use pci_intx_unmanaged(). But this way it's
easier to review and approve. It also makes sure that each checked out
commit should provide correct behavior, not just the entire series as a
whole."
P.
>
> So the net change is that:
>
> 1) pci_intx() is now always unmanaged
>
> 2) a couple of drivers use pcim_intx() now instead of pci_intx()
>
> The obvious ordering is:
>
> 1) Convert the drivers which need the managed version to use
> pcim_intx()
>
> 2) Remove the managed warning in pci_intx() and clean up the
> comment
>
> 3) Remove __pcim_intx() and invoke pci_intx() in the devres code.
>
> No?
>
> Thanks,
>
> tglx
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 11/11] Remove devres from pci_intx()
2024-11-14 9:05 ` Philipp Stanner
@ 2024-11-15 0:46 ` Thomas Gleixner
2024-11-15 8:32 ` Philipp Stanner
0 siblings, 1 reply; 20+ messages in thread
From: Thomas Gleixner @ 2024-11-15 0:46 UTC (permalink / raw)
To: Philipp Stanner, Damien Le Moal, Niklas Cassel, Basavaraj Natikar,
Jiri Kosina, Benjamin Tissoires, Arnd Bergmann,
Greg Kroah-Hartman, Alex Dubov, Sudarsana Kalluru, Manish Chopra,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rasesh Mody, GR-Linux-NIC-Dev, Igor Mitsyanko,
Sergey Matyukevich, Kalle Valo, Sanjay R Mehta, Shyam Sundar S K,
Jon Mason, Dave Jiang, Allen Hubbe, Bjorn Helgaas,
Alex Williamson, Juergen Gross, Stefano Stabellini,
Oleksandr Tyshchenko, Mario Limonciello, Chen Ni, Ricky Wu,
Al Viro, Breno Leitao, Kevin Tian, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
On Thu, Nov 14 2024 at 10:05, Philipp Stanner wrote:
> On Wed, 2024-11-13 at 17:22 +0100, Thomas Gleixner wrote:
>> On Wed, Nov 13 2024 at 13:41, Philipp Stanner wrote:
>> > pci_intx() is a hybrid function which can sometimes be managed
>> > through
>> > devres. This hybrid nature is undesirable.
>> >
>> > Since all users of pci_intx() have by now been ported either to
>> > always-managed pcim_intx() or never-managed pci_intx_unmanaged(),
>> > the
>> > devres functionality can be removed from pci_intx().
>> >
>> > Consequently, pci_intx_unmanaged() is now redundant, because
>> > pci_intx()
>> > itself is now unmanaged.
>> >
>> > Remove the devres functionality from pci_intx(). Have all users of
>> > pci_intx_unmanaged() call pci_intx(). Remove pci_intx_unmanaged().
>> >
>> > Signed-off-by: Philipp Stanner <pstanner@redhat.com>
>> > ---
>> > drivers/misc/cardreader/rtsx_pcr.c | 2 +-
>> > drivers/misc/tifm_7xx1.c | 6 +--
>> > .../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 2 +-
>> > drivers/net/ethernet/brocade/bna/bnad.c | 2 +-
>> > drivers/ntb/hw/amd/ntb_hw_amd.c | 4 +-
>> > drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +-
>> > drivers/pci/devres.c | 4 +-
>> > drivers/pci/msi/api.c | 2 +-
>> > drivers/pci/msi/msi.c | 2 +-
>> > drivers/pci/pci.c | 43 +--------------
>> > ----
>> > drivers/vfio/pci/vfio_pci_core.c | 2 +-
>> > drivers/vfio/pci/vfio_pci_intrs.c | 10 ++---
>> > drivers/xen/xen-pciback/conf_space_header.c | 2 +-
>> > include/linux/pci.h | 1 -
>> > 14 files changed, 22 insertions(+), 62 deletions(-)
>>
>> Now I'm utterly confused. This undoes the pci_intx_unmanaged() churn
>> which you carefully split into several patches first.
>
> Have you read the email I have linked?
>
> There is also the cover-letter (does anyone in the community ever read
> those?) which explicitly states:
>
> "Patch "Remove devres from pci_intx()" obviously reverts the previous
> patches that made drivers use pci_intx_unmanaged(). But this way it's
> easier to review and approve. It also makes sure that each checked out
> commit should provide correct behavior, not just the entire series as a
> whole."
I read it and I assume your intention was to force an eye on every use
case of pci_intx() and not just on those which need to be converted to
pcim_intx().
I'm not convinced that this is needed, but fair enough.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v2 11/11] Remove devres from pci_intx()
2024-11-15 0:46 ` Thomas Gleixner
@ 2024-11-15 8:32 ` Philipp Stanner
0 siblings, 0 replies; 20+ messages in thread
From: Philipp Stanner @ 2024-11-15 8:32 UTC (permalink / raw)
To: Thomas Gleixner, Damien Le Moal, Niklas Cassel, Basavaraj Natikar,
Jiri Kosina, Benjamin Tissoires, Arnd Bergmann,
Greg Kroah-Hartman, Alex Dubov, Sudarsana Kalluru, Manish Chopra,
Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rasesh Mody, GR-Linux-NIC-Dev, Igor Mitsyanko,
Sergey Matyukevich, Kalle Valo, Sanjay R Mehta, Shyam Sundar S K,
Jon Mason, Dave Jiang, Allen Hubbe, Bjorn Helgaas,
Alex Williamson, Juergen Gross, Stefano Stabellini,
Oleksandr Tyshchenko, Mario Limonciello, Chen Ni, Ricky Wu,
Al Viro, Breno Leitao, Kevin Tian, Mostafa Saleh, Andy Shevchenko,
Jason Gunthorpe, Yi Liu, Kunwu Chan, Ankit Agrawal,
Christian Brauner, Reinette Chatre, Eric Auger, Ye Bin
Cc: linux-ide, linux-kernel, linux-input, netdev, linux-wireless, ntb,
linux-pci, kvm, xen-devel
On Fri, 2024-11-15 at 01:46 +0100, Thomas Gleixner wrote:
> On Thu, Nov 14 2024 at 10:05, Philipp Stanner wrote:
> > On Wed, 2024-11-13 at 17:22 +0100, Thomas Gleixner wrote:
> > > On Wed, Nov 13 2024 at 13:41, Philipp Stanner wrote:
> > > > pci_intx() is a hybrid function which can sometimes be managed
> > > > through
> > > > devres. This hybrid nature is undesirable.
> > > >
> > > > Since all users of pci_intx() have by now been ported either to
> > > > always-managed pcim_intx() or never-managed
> > > > pci_intx_unmanaged(),
> > > > the
> > > > devres functionality can be removed from pci_intx().
> > > >
> > > > Consequently, pci_intx_unmanaged() is now redundant, because
> > > > pci_intx()
> > > > itself is now unmanaged.
> > > >
> > > > Remove the devres functionality from pci_intx(). Have all users
> > > > of
> > > > pci_intx_unmanaged() call pci_intx(). Remove
> > > > pci_intx_unmanaged().
> > > >
> > > > Signed-off-by: Philipp Stanner <pstanner@redhat.com>
> > > > ---
> > > > drivers/misc/cardreader/rtsx_pcr.c | 2 +-
> > > > drivers/misc/tifm_7xx1.c | 6 +--
> > > > .../net/ethernet/broadcom/bnx2x/bnx2x_main.c | 2 +-
> > > > drivers/net/ethernet/brocade/bna/bnad.c | 2 +-
> > > > drivers/ntb/hw/amd/ntb_hw_amd.c | 4 +-
> > > > drivers/ntb/hw/intel/ntb_hw_gen1.c | 2 +-
> > > > drivers/pci/devres.c | 4 +-
> > > > drivers/pci/msi/api.c | 2 +-
> > > > drivers/pci/msi/msi.c | 2 +-
> > > > drivers/pci/pci.c | 43 +----------
> > > > ----
> > > > ----
> > > > drivers/vfio/pci/vfio_pci_core.c | 2 +-
> > > > drivers/vfio/pci/vfio_pci_intrs.c | 10 ++---
> > > > drivers/xen/xen-pciback/conf_space_header.c | 2 +-
> > > > include/linux/pci.h | 1 -
> > > > 14 files changed, 22 insertions(+), 62 deletions(-)
> > >
> > > Now I'm utterly confused. This undoes the pci_intx_unmanaged()
> > > churn
> > > which you carefully split into several patches first.
> >
> > Have you read the email I have linked?
> >
> > There is also the cover-letter (does anyone in the community ever
> > read
> > those?) which explicitly states:
> >
> > "Patch "Remove devres from pci_intx()" obviously reverts the
> > previous
> > patches that made drivers use pci_intx_unmanaged(). But this way
> > it's
> > easier to review and approve. It also makes sure that each checked
> > out
> > commit should provide correct behavior, not just the entire series
> > as a
> > whole."
>
> I read it and I assume your intention was to force an eye on every
> use
> case of pci_intx() and not just on those which need to be converted
> to
> pcim_intx().
>
> I'm not convinced that this is needed, but fair enough.
Whether pcim_enable_device() is really not used could have been
overlooked, or the driver could move to "managed mode" in parallel for
v6.13 for example. Then a bug would be silently introduced into those
drivers.
Besides, me touching pci_intx() unfortunately caused a few explosions
in the past already, in
fc8c818e756991f5f50b8dfab07f970a18da2556 and
00f89ae4e759a7eef07e4188e1534af7dd2c7e9c
So this time I prefer to be rather safe than sorry.
BTW, if you can review the MSI patch and check whether removing devres
from there really is fine, that would be helpful.
Regards,
P.
^ permalink raw reply [flat|nested] 20+ messages in thread