]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nvmet: pci-epf: clear completion queue IRQ flag on delete
authorDamien Le Moal <dlemoal@kernel.org>
Thu, 8 May 2025 23:25:00 +0000 (08:25 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 May 2025 09:12:17 +0000 (11:12 +0200)
[ Upstream commit 85adf2094abb9084770dc4ab302aaa9c5d26dd2d ]

The function nvmet_pci_epf_delete_cq() unconditionally calls
nvmet_pci_epf_remove_irq_vector() even for completion queues that do not
have interrupts enabled. Furthermore, for completion queues that do
have IRQ enabled, deleting and re-creating the completion queue leaves
the flag NVMET_PCI_EPF_Q_IRQ_ENABLED set, even if the completion queue
is being re-created with IRQ disabled.

Fix these issues by calling nvmet_pci_epf_remove_irq_vector() only if
NVMET_PCI_EPF_Q_IRQ_ENABLED is set and make sure to always clear that
flag.

Fixes: 0faa0fe6f90e ("nvmet: New NVMe PCI endpoint function target driver")
Cc: stable@vger.kernel.org
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/nvme/target/pci-epf.c

index 81957b6e84986ad1e2a2172bffc2f00bc394f07c..fbc167f47d8a6736dba7d393e43c8850fa1f489d 100644 (file)
@@ -1344,7 +1344,8 @@ static u16 nvmet_pci_epf_delete_cq(struct nvmet_ctrl *tctrl, u16 cqid)
 
        cancel_delayed_work_sync(&cq->work);
        nvmet_pci_epf_drain_queue(cq);
-       nvmet_pci_epf_remove_irq_vector(ctrl, cq->vector);
+       if (test_and_clear_bit(NVMET_PCI_EPF_Q_IRQ_ENABLED, &cq->flags))
+               nvmet_pci_epf_remove_irq_vector(ctrl, cq->vector);
        nvmet_pci_epf_mem_unmap(ctrl->nvme_epf, &cq->pci_map);
 
        return NVME_SC_SUCCESS;