Skip to content

Commit 00e9888

Browse files
committed
bdev/nvme: force adminq poll period for NVMe/TCP interrupt mode to avoid EBADF
longhorn/longhorn-9834 Signed-off-by: Chin-Ya Huang <chin-ya.huang@suse.com>
1 parent 9aaeca2 commit 00e9888

1 file changed

Lines changed: 14 additions & 5 deletions

File tree

module/bdev/nvme/bdev_nvme.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5983,12 +5983,21 @@ nvme_ctrlr_create(struct spdk_nvme_ctrlr *ctrlr,
59835983
spdk_bdev_nvme_get_default_ctrlr_opts(&nvme_ctrlr->opts);
59845984
}
59855985

5986-
/* In interrupt mode, NVMe/TCP requires periodic polling of the admin queue
5987-
* to ensure timely Keep Alive command completion. Unlike PCIe, TCP transport
5988-
* does not provide hardware interrupts for admin completions.
5989-
*/
5990-
period = (spdk_interrupt_mode_is_enabled() && (g_nvme_trtype != SPDK_NVME_TRANSPORT_TCP)) ? 0 : g_opts.nvme_adminq_poll_period_us;
5986+
period = spdk_interrupt_mode_is_enabled() ? 0 : g_opts.nvme_adminq_poll_period_us;
5987+
/*
5988+
* In interrupt mode, NVMe/TCP requires periodic polling of the admin queue
5989+
* to ensure timely Keep Alive and disconnect handling. TCP transport does not
5990+
* provide hardware interrupts for admin completions.
5991+
*
5992+
* To prevent a race condition where IOQs detect socket closure before adminq
5993+
* wakes up (causing commands to be issued on a closed socket, EBADF), we force
5994+
* a shorter admin queue poll period for NVMe/TCP in interrupt mode.
5995+
*
5996+
* This should ideally match or be shorter than nvme_ioq_poll_period_us.
5997+
*/
5998+
period = (spdk_interrupt_mode_is_enabled() && (g_nvme_trtype != SPDK_NVME_TRANSPORT_TCP)) ? period : 100;
59915999

6000+
SPDK_DEBUGLOG(bdev_nvme, "Registering admin poller for controller with poll period %" PRIu64 "\n", period);
59926001
nvme_ctrlr->adminq_timer_poller = SPDK_POLLER_REGISTER(bdev_nvme_poll_adminq, nvme_ctrlr,
59936002
period);
59946003

0 commit comments

Comments
 (0)