lkml.org 
[lkml]   [2020]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 099/102] nvmet-tcp: set MSG_MORE only if we actually have more to send
    Date
    From: Sagi Grimberg <sagi@grimberg.me>

    commit 98fd5c723730f560e5bea919a64ac5b83d45eb72 upstream.

    When we send PDU data, we want to optimize the tcp stack
    operation if we have more data to send. So when we set MSG_MORE
    when:
    - We have more fragments coming in the batch, or
    - We have a more data to send in this PDU
    - We don't have a data digest trailer
    - We optimize with the SUCCESS flag and omit the NVMe completion
    (used if sq_head pointer update is disabled)

    This addresses a regression in QD=1 with SUCCESS flag optimization
    as we unconditionally set MSG_MORE when we didn't actually have
    more data to send.

    Fixes: 70583295388a ("nvmet-tcp: implement C2HData SUCCESS optimization")
    Reported-by: Mark Wunderlich <mark.wunderlich@intel.com>
    Tested-by: Mark Wunderlich <mark.wunderlich@intel.com>
    Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Keith Busch <kbusch@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/nvme/target/tcp.c | 12 +++++++++---
    1 file changed, 9 insertions(+), 3 deletions(-)

    --- a/drivers/nvme/target/tcp.c
    +++ b/drivers/nvme/target/tcp.c
    @@ -515,7 +515,7 @@ static int nvmet_try_send_data_pdu(struc
    return 1;
    }

    -static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd)
    +static int nvmet_try_send_data(struct nvmet_tcp_cmd *cmd, bool last_in_batch)
    {
    struct nvmet_tcp_queue *queue = cmd->queue;
    int ret;
    @@ -523,9 +523,15 @@ static int nvmet_try_send_data(struct nv
    while (cmd->cur_sg) {
    struct page *page = sg_page(cmd->cur_sg);
    u32 left = cmd->cur_sg->length - cmd->offset;
    + int flags = MSG_DONTWAIT;
    +
    + if ((!last_in_batch && cmd->queue->send_list_len) ||
    + cmd->wbytes_done + left < cmd->req.transfer_len ||
    + queue->data_digest || !queue->nvme_sq.sqhd_disabled)
    + flags |= MSG_MORE;

    ret = kernel_sendpage(cmd->queue->sock, page, cmd->offset,
    - left, MSG_DONTWAIT | MSG_MORE);
    + left, flags);
    if (ret <= 0)
    return ret;

    @@ -660,7 +666,7 @@ static int nvmet_tcp_try_send_one(struct
    }

    if (cmd->state == NVMET_TCP_SEND_DATA) {
    - ret = nvmet_try_send_data(cmd);
    + ret = nvmet_try_send_data(cmd, last_in_batch);
    if (ret <= 0)
    goto done_send;
    }

    \
     
     \ /
      Last update: 2020-03-24 14:20    [W:2.633 / U:0.172 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site