[PATCH 1/8] nvme-tcp: switch TX deadline to microseconds and make it configurable

Hannes Reinecke hare at kernel.org
Tue Jul 16 00:36:09 PDT 2024


The current TX deadline for the workqueue is pretty much arbitrary,
and jiffies is not the best choice for sub-microseconds granularity.
So make the deadline configurable via a config option and switch to
ktime instead of jiffies.

Signed-off-by: Hannes Reinecke <hare at kernel.org>
---
 drivers/nvme/host/tcp.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index 0873b3949355..3cf9a9abb0e0 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -44,6 +44,10 @@ static bool wq_unbound;
 module_param(wq_unbound, bool, 0644);
 MODULE_PARM_DESC(wq_unbound, "Use unbound workqueue for nvme-tcp IO context (default false)");
 
+static int deadline = 1000;
+module_param(deadline, int, 0644);
+MODULE_PARM_DESC(deadline, "RX/TX deadline in microseconds (default: 1000)");
+
 /*
  * TLS handshake timeout
  */
@@ -1278,7 +1282,8 @@ static void nvme_tcp_io_work(struct work_struct *w)
 {
 	struct nvme_tcp_queue *queue =
 		container_of(w, struct nvme_tcp_queue, io_work);
-	unsigned long deadline = jiffies + msecs_to_jiffies(1);
+	u64 start = ktime_to_us(ktime_get());
+	u64 tx_deadline = start + deadline;
 
 	do {
 		bool pending = false;
@@ -1302,7 +1307,7 @@ static void nvme_tcp_io_work(struct work_struct *w)
 		if (!pending || !queue->rd_enabled)
 			return;
 
-	} while (!time_after(jiffies, deadline)); /* quota is exhausted */
+	} while (ktime_to_us(ktime_get()) < tx_deadline); /* quota is exhausted */
 
 	queue_work_on(queue->io_cpu, nvme_tcp_wq, &queue->io_work);
 }
-- 
2.35.3




More information about the Linux-nvme mailing list