Hannes Reinecke 711fb6
From: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke 711fb6
Date: Thu, 12 Mar 2020 16:06:38 -0700
Hannes Reinecke 711fb6
Subject: [PATCH] nvmet-tcp: set MSG_MORE only if we actually have more to send
Hannes Reinecke 711fb6
Git-commit: 98fd5c723730f560e5bea919a64ac5b83d45eb72
Hannes Reinecke 711fb6
Patch-mainline: v5.6-rc7
Hannes Reinecke 711fb6
References: bsc#1161930
Hannes Reinecke 711fb6
Hannes Reinecke 711fb6
When we send PDU data, we want to optimize the tcp stack
Hannes Reinecke 711fb6
operation if we have more data to send. So when we set MSG_MORE
Hannes Reinecke 711fb6
when:
Hannes Reinecke 711fb6
- We have more fragments coming in the batch, or
Hannes Reinecke 711fb6
- We have a more data to send in this PDU
Hannes Reinecke 711fb6
- We don't have a data digest trailer
Hannes Reinecke 711fb6
- We optimize with the SUCCESS flag and omit the NVMe completion
Hannes Reinecke 711fb6
  (used if sq_head pointer update is disabled)
Hannes Reinecke 711fb6
Hannes Reinecke 711fb6
This addresses a regression in QD=1 with SUCCESS flag optimization
Hannes Reinecke 711fb6
as we unconditionally set MSG_MORE when we didn't actually have
Hannes Reinecke 711fb6
more data to send.
Hannes Reinecke 711fb6
Hannes Reinecke 711fb6
Fixes: 70583295388a ("nvmet-tcp: implement C2HData SUCCESS optimization")
Hannes Reinecke 711fb6
Reported-by: Mark Wunderlich <mark.wunderlich@intel.com>
Hannes Reinecke 711fb6
Tested-by: Mark Wunderlich <mark.wunderlich@intel.com>
Hannes Reinecke 711fb6
Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Hannes Reinecke 711fb6
Signed-off-by: Keith Busch <kbusch@kernel.org>
Hannes Reinecke 711fb6
Acked-by: Hannes Reinecke <hare@suse.com>
Hannes Reinecke 711fb6
---
Hannes Reinecke 711fb6
 drivers/nvme/target/tcp.c | 12 +++++++++---
Hannes Reinecke 711fb6
 1 file changed, 9 insertions(+), 3 deletions(-)
Hannes Reinecke 711fb6
Hannes Reinecke 711fb6
diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
Hannes Reinecke 711fb6
index af674fc0bb1e..5bb5342b8d0c 100644
Hannes Reinecke 711fb6
--- a/drivers/nvme/target/tcp.c
Hannes Reinecke 711fb6
+++ b/drivers/nvme/target/tcp.c
Hannes Reinecke 711fb6
@@ -515,7 +515,7 @@ static int nvmet_try_send_data_pdu(struct nvmet_tcp_cmd *cmd)
Hannes Reinecke 711fb6
 	return 1;
Hannes Reinecke 711fb6
 }
Hannes Reinecke 711fb6
 
Hannes Reinecke 711fb6
-static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd)
Hannes Reinecke 711fb6
+static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd, bool last_in_batch)
Hannes Reinecke 711fb6
 {
Hannes Reinecke 711fb6
 	struct nvmet_tcp_queue *queue = cmd->queue;
Hannes Reinecke 711fb6
 	int ret;
Hannes Reinecke 711fb6
@@ -523,9 +523,15 @@ static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd)
Hannes Reinecke 711fb6
 	while (cmd->cur_sg) {
Hannes Reinecke 711fb6
 		struct page *page = sg_page(cmd->cur_sg);
Hannes Reinecke 711fb6
 		u32 left = cmd->cur_sg->length - cmd->offset;
Hannes Reinecke 711fb6
+		int flags = MSG_DONTWAIT;
Hannes Reinecke 711fb6
+
Hannes Reinecke 711fb6
+		if ((!last_in_batch && cmd->queue->send_list_len) ||
Hannes Reinecke 711fb6
+		    cmd->wbytes_done + left < cmd->req.transfer_len ||
Hannes Reinecke 711fb6
+		    queue->data_digest || !queue->nvme_sq.sqhd_disabled)
Hannes Reinecke 711fb6
+			flags |= MSG_MORE;
Hannes Reinecke 711fb6
 
Hannes Reinecke 711fb6
 		ret = kernel_sendpage(cmd->queue->sock, page, cmd->offset,
Hannes Reinecke 711fb6
-					left, MSG_DONTWAIT | MSG_MORE);
Hannes Reinecke 711fb6
+					left, flags);
Hannes Reinecke 711fb6
 		if (ret <= 0)
Hannes Reinecke 711fb6
 			return ret;
Hannes Reinecke 711fb6
 
Hannes Reinecke 711fb6
@@ -660,7 +666,7 @@ static int nvmet_tcp_try_send_one(struct nvmet_tcp_queue *queue,
Hannes Reinecke 711fb6
 	}
Hannes Reinecke 711fb6
 
Hannes Reinecke 711fb6
 	if (cmd->state == NVMET_TCP_SEND_DATA) {
Hannes Reinecke 711fb6
-		ret = nvmet_try_send_data(cmd);
Hannes Reinecke 711fb6
+		ret = nvmet_try_send_data(cmd, last_in_batch);
Hannes Reinecke 711fb6
 		if (ret <= 0)
Hannes Reinecke 711fb6
 			goto done_send;
Hannes Reinecke 711fb6
 	}
Hannes Reinecke 711fb6
-- 
Hannes Reinecke 711fb6
2.16.4
Hannes Reinecke 711fb6