]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: endpoint: pci-epf-vntb: Fix MSI doorbell IRQ unwind
authorKoichiro Den <den@valinux.co.jp>
Tue, 17 Feb 2026 06:38:54 +0000 (15:38 +0900)
committerManivannan Sadhasivam <mani@kernel.org>
Tue, 24 Feb 2026 10:23:45 +0000 (15:53 +0530)
epf_ntb_db_bar_init_msi_doorbell() requests ntb->db_count doorbell IRQs
and then performs additional MSI doorbell setup that may still fail.
The error path unwinds the requested IRQs, but it uses a loop variable
that is reused later in the function. When a later step fails, the
unwind can run with an unexpected index value and leave some IRQs
requested.

Track the number of successfully requested IRQs separately and use that
counter for the unwind so all previously requested IRQs are freed on
failure.

Fixes: dc693d606644 ("PCI: endpoint: pci-epf-vntb: Add MSI doorbell support")
Signed-off-by: Koichiro Den <den@valinux.co.jp>
Signed-off-by: Manivannan Sadhasivam <mani@kernel.org>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Reviewed-by: Niklas Cassel <cassel@kernel.org>
Link: https://patch.msgid.link/20260217063856.3759713-2-den@valinux.co.jp
drivers/pci/endpoint/functions/pci-epf-vntb.c

index 20a400e834392715275ebbacac6f98eb4b33b63f..52cf442ca1d9aadf2472bfc5a10462b920d29618 100644 (file)
@@ -527,20 +527,20 @@ static int epf_ntb_db_bar_init_msi_doorbell(struct epf_ntb *ntb,
        struct msi_msg *msg;
        size_t sz;
        int ret;
-       int i;
+       int i, req;
 
        ret = pci_epf_alloc_doorbell(epf,  ntb->db_count);
        if (ret)
                return ret;
 
-       for (i = 0; i < ntb->db_count; i++) {
-               ret = request_irq(epf->db_msg[i].virq, epf_ntb_doorbell_handler,
+       for (req = 0; req < ntb->db_count; req++) {
+               ret = request_irq(epf->db_msg[req].virq, epf_ntb_doorbell_handler,
                                  0, "pci_epf_vntb_db", ntb);
 
                if (ret) {
                        dev_err(&epf->dev,
                                "Failed to request doorbell IRQ: %d\n",
-                               epf->db_msg[i].virq);
+                               epf->db_msg[req].virq);
                        goto err_free_irq;
                }
        }
@@ -598,8 +598,8 @@ static int epf_ntb_db_bar_init_msi_doorbell(struct epf_ntb *ntb,
        return 0;
 
 err_free_irq:
-       for (i--; i >= 0; i--)
-               free_irq(epf->db_msg[i].virq, ntb);
+       for (req--; req >= 0; req--)
+               free_irq(epf->db_msg[req].virq, ntb);
 
        pci_epf_free_doorbell(ntb->epf);
        return ret;