]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
PCI: endpoint: pci-epf-test: Don't free doorbell IRQ unless requested
authorKoichiro Den <den@valinux.co.jp>
Tue, 17 Feb 2026 06:38:55 +0000 (15:38 +0900)
committerManivannan Sadhasivam <mani@kernel.org>
Tue, 24 Feb 2026 10:23:59 +0000 (15:53 +0530)
pci_epf_test_doorbell_cleanup() unconditionally calls free_irq() for the
doorbell virq, which can trigger "Trying to free already-free IRQ"
warnings when the IRQ was never requested or when request_threaded_irq()
failed.

Move free_irq() out of pci_epf_test_doorbell_cleanup() and invoke it
only after a successful request, so that free_irq() is not called for
an unrequested IRQ.

Fixes: eff0c286aa91 ("PCI: endpoint: pci-epf-test: Add doorbell test 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-3-den@valinux.co.jp
drivers/pci/endpoint/functions/pci-epf-test.c

index 582938b7b4f1fb19fddd7462bbc0c15d2c62d64f..5893de370b6e16a9aad8b9876122043392d81859 100644 (file)
@@ -715,7 +715,6 @@ static void pci_epf_test_doorbell_cleanup(struct pci_epf_test *epf_test)
        struct pci_epf_test_reg *reg = epf_test->reg[epf_test->test_reg_bar];
        struct pci_epf *epf = epf_test->epf;
 
-       free_irq(epf->db_msg[0].virq, epf_test);
        reg->doorbell_bar = cpu_to_le32(NO_BAR);
 
        pci_epf_free_doorbell(epf);
@@ -759,7 +758,7 @@ static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test,
                                         &epf_test->db_bar.phys_addr, &offset);
 
        if (ret)
-               goto err_doorbell_cleanup;
+               goto err_free_irq;
 
        reg->doorbell_offset = cpu_to_le32(offset);
 
@@ -769,12 +768,14 @@ static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test,
 
        ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, &epf_test->db_bar);
        if (ret)
-               goto err_doorbell_cleanup;
+               goto err_free_irq;
 
        status |= STATUS_DOORBELL_ENABLE_SUCCESS;
        reg->status = cpu_to_le32(status);
        return;
 
+err_free_irq:
+       free_irq(epf->db_msg[0].virq, epf_test);
 err_doorbell_cleanup:
        pci_epf_test_doorbell_cleanup(epf_test);
 set_status_err:
@@ -794,6 +795,7 @@ static void pci_epf_test_disable_doorbell(struct pci_epf_test *epf_test,
        if (bar < BAR_0)
                goto set_status_err;
 
+       free_irq(epf->db_msg[0].virq, epf_test);
        pci_epf_test_doorbell_cleanup(epf_test);
 
        /*