Re: [PATCH 4/4] PCI: rcar: Teardown MSI setup if rcar_pcie_enable() fails

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 05/23/2018 08:18 AM, Geert Uytterhoeven wrote:
> 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.

Ah, true, I'll pull out a bit of the rcar_pcie_teardown_msi and call it
in the failpath to remove the mapping. Thanks

-- 
Best regards,
Marek Vasut



[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux