Message ID | 20241009083519.10088-3-pstanner@redhat.com |
---|---|
State | New |
Headers | show |
Series | Remove implicit devres from pci_intx() | expand |
On Wed, Oct 09, 2024 at 10:35:08AM +0200, 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. > > hda_intel enables its PCI-Device with pcim_enable_device(). Thus, it needs > the always-managed version. > > Replace pci_intx() with pcim_intx(). ... > bus->irq = chip->pci->irq; > chip->card->sync_irq = bus->irq; > - pci_intx(chip->pci, !chip->msi); > + pcim_intx(chip->pci, !chip->msi); > return 0; I believe each driver needs an individual approach. Looking at the above I would first to understand why this one is being used and why we can't switch to pci{m}_alloc_irq_vectors(). (Yeah, managed pci_alloc_irq_vectors() is probably still missing, I don't remember if you introduced it or not.
On Thu, 2024-10-10 at 17:46 +0300, Andy Shevchenko wrote: > On Wed, Oct 09, 2024 at 10:35:08AM +0200, 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. > > > > hda_intel enables its PCI-Device with pcim_enable_device(). Thus, > > it needs > > the always-managed version. > > > > Replace pci_intx() with pcim_intx(). > > ... > > > bus->irq = chip->pci->irq; > > chip->card->sync_irq = bus->irq; > > - pci_intx(chip->pci, !chip->msi); > > + pcim_intx(chip->pci, !chip->msi); > > return 0; > > I believe each driver needs an individual approach. Looking at the > above > I would first to understand why this one is being used and why we > can't > switch to pci{m}_alloc_irq_vectors(). (Yeah, managed > pci_alloc_irq_vectors() > is probably still missing, I don't remember if you introduced it or > not. > Alright alright – we touched it in the other mail briefly, but let me point out another specific problem: pci_alloc_irq_vectors() *uses* pci_intx(). And pci_intx() can be managed sometimes. See the problem? :( So it's not just that I couldn't port the driver Alex is concerned about, it's also that MSI itself is a user of pci_intx(). So a pcim_alloc_irq_vectors() might end up doing double-devres or God knows what else. Only once pci_intx() is clean one can start thinking about the code in pci/msi/ It's the biggest reason why I want to clean it up as suggested here, and also why the only patch I'm really nervous about is number 8. P.
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index b4540c5cd2a6..b44ca7b6e54f 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -786,7 +786,7 @@ static int azx_acquire_irq(struct azx *chip, int do_disconnect) } bus->irq = chip->pci->irq; chip->card->sync_irq = bus->irq; - pci_intx(chip->pci, !chip->msi); + pcim_intx(chip->pci, !chip->msi); return 0; }
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. hda_intel 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> --- sound/pci/hda/hda_intel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)