Hi Marek, On Tue, May 22, 2018 at 11:53 PM, Marek Vasut <marek.vasut@xxxxxxxxx> wrote: > On 05/22/2018 08:36 PM, Geert Uytterhoeven wrote: >> On Mon, May 21, 2018 at 3:11 PM, Marek Vasut <marek.vasut@xxxxxxxxx> wrote: >>> --- a/drivers/pci/host/pcie-rcar.c >>> +++ b/drivers/pci/host/pcie-rcar.c >>> @@ -900,6 +900,28 @@ static int rcar_pcie_enable_msi(struct rcar_pcie *pcie) >>> return err; >>> } >>> >>> +static void rcar_pcie_teardown_msi(struct rcar_pcie *pcie) >>> +{ >>> + struct rcar_msi *msi = &pcie->msi; >>> + int irq, i; >>> + >>> + /* Disable all MSI interrupts */ >>> + rcar_pci_write_reg(pcie, 0, PCIEMSIIER); >>> + >>> + /* Disable address decoding of the MSI interrupt, MSIFE */ >>> + rcar_pci_write_reg(pcie, 0, PCIEMSIALR); >>> + >>> + free_pages(msi->pages, 0); >>> + >>> + for (i = 0; i < INT_PCI_MSI_NR; i++) { >>> + irq = irq_find_mapping(msi->domain, i); >>> + if (irq > 0) >>> + irq_dispose_mapping(irq); >>> + } >> >> Note that similar calls to irq_dispose_mapping() should be added to the >> failure path of rcar_pcie_enable_msi(), too. > > There are no failures happening in rcar_pcie_enable_msi() after the > mapping is created, just memory writes, so no. Did I miss something there ? In my copy, there are two calls to devm_request_irq(). If they fail, the IRQ domain is removed, but the mappings are never disposed of. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds