Skip to content

Commit f33315d

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 917646a commit f33315d

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
@@ -715,7 +715,6 @@ static void pci_epf_test_doorbell_cleanup(struct pci_epf_test *epf_test)
715715
struct pci_epf_test_reg *reg = epf_test->reg[epf_test->test_reg_bar];
716716
struct pci_epf *epf = epf_test->epf;
717717

718-
free_irq(epf->db_msg[0].virq, epf_test);
719718
reg->doorbell_bar = cpu_to_le32(NO_BAR);
720719

721720
pci_epf_free_doorbell(epf);
@@ -759,7 +758,7 @@ static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test,
759758
&epf_test->db_bar.phys_addr, &offset);
760759

761760
if (ret)
762-
goto err_doorbell_cleanup;
761+
goto err_free_irq;
763762

764763
reg->doorbell_offset = cpu_to_le32(offset);
765764

@@ -769,12 +768,14 @@ static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test,
769768

770769
ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, &epf_test->db_bar);
771770
if (ret)
772-
goto err_doorbell_cleanup;
771+
goto err_free_irq;
773772

774773
status |= STATUS_DOORBELL_ENABLE_SUCCESS;
775774
reg->status = cpu_to_le32(status);
776775
return;
777776

777+
err_free_irq:
778+
free_irq(epf->db_msg[0].virq, epf_test);
778779
err_doorbell_cleanup:
779780
pci_epf_test_doorbell_cleanup(epf_test);
780781
set_status_err:
@@ -794,6 +795,7 @@ static void pci_epf_test_disable_doorbell(struct pci_epf_test *epf_test,
794795
if (bar < BAR_0)
795796
goto set_status_err;
796797

798+
free_irq(epf->db_msg[0].virq, epf_test);
797799
pci_epf_test_doorbell_cleanup(epf_test);
798800

799801
/*

0 commit comments

Comments
 (0)