Re: [PATCH v2 2/3] PCI: endpoint: pci-epf-test: Don't free doorbell IRQ unless requested

Frank Li <[email protected]>
Newsgroups dev.linux.lists.ntb,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci
Message-ID <aZSfzp6mA4pmdGkQ@lizhi-Precision-Tower-5810>
On Tue, Feb 17, 2026 at 03:38:55PM +0900, Koichiro Den wrote:
> 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 <[email protected]>
> ---
Reviewed-by: Frank Li <[email protected]>
>  drivers/pci/endpoint/functions/pci-epf-test.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c
> index 0cb7af0919dc..12705858e502 100644
> --- a/drivers/pci/endpoint/functions/pci-epf-test.c
> +++ b/drivers/pci/endpoint/functions/pci-epf-test.c
> @@ -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);
>
>  	/*
> --
> 2.51.0
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.