Skip to content

Commit b13984f

Browse files
Koichiro Dengregkh
authored andcommitted
PCI: endpoint: pci-epf-test: Don't free doorbell IRQ unless requested
[ Upstream commit e81fa70 ] 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: eff0c28 ("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 Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 511c093 commit b13984f

1 file changed

Lines changed: 5 additions & 3 deletions

File tree

drivers/pci/endpoint/functions/pci-epf-test.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,6 @@ static void pci_epf_test_doorbell_cleanup(struct pci_epf_test *epf_test)
704704
struct pci_epf_test_reg *reg = epf_test->reg[epf_test->test_reg_bar];
705705
struct pci_epf *epf = epf_test->epf;
706706

707-
free_irq(epf->db_msg[0].virq, epf_test);
708707
reg->doorbell_bar = cpu_to_le32(NO_BAR);
709708

710709
pci_epf_free_doorbell(epf);
@@ -748,7 +747,7 @@ static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test,
748747
&epf_test->db_bar.phys_addr, &offset);
749748

750749
if (ret)
751-
goto err_doorbell_cleanup;
750+
goto err_free_irq;
752751

753752
reg->doorbell_offset = cpu_to_le32(offset);
754753

@@ -758,12 +757,14 @@ static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test,
758757

759758
ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, &epf_test->db_bar);
760759
if (ret)
761-
goto err_doorbell_cleanup;
760+
goto err_free_irq;
762761

763762
status |= STATUS_DOORBELL_ENABLE_SUCCESS;
764763
reg->status = cpu_to_le32(status);
765764
return;
766765

766+
err_free_irq:
767+
free_irq(epf->db_msg[0].virq, epf_test);
767768
err_doorbell_cleanup:
768769
pci_epf_test_doorbell_cleanup(epf_test);
769770
set_status_err:
@@ -783,6 +784,7 @@ static void pci_epf_test_disable_doorbell(struct pci_epf_test *epf_test,
783784
if (bar < BAR_0)
784785
goto set_status_err;
785786

787+
free_irq(epf->db_msg[0].virq, epf_test);
786788
pci_epf_test_doorbell_cleanup(epf_test);
787789

788790
/*

0 commit comments

Comments
 (0)