Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp5363371rwd; Sun, 18 Jun 2023 09:57:19 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4dK1nYxj/Vcm/eSUl0GulR7a4pC9mc+u+0iSGkyOPoOApaI1wVEGOMOx2w8w1wCwYc+8J/ X-Received: by 2002:a05:6a20:3d82:b0:10b:d70d:f971 with SMTP id s2-20020a056a203d8200b0010bd70df971mr11836994pzi.3.1687107439088; Sun, 18 Jun 2023 09:57:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687107439; cv=none; d=google.com; s=arc-20160816; b=kuRCAwEEKjtR+KgNNEPKhkUtv6M2ft92d8txYCAGGfOnlNW0/tY82MbWAet/f+OwTs EjH5p3u8LtP/1pptUoCNz8BAOwToEAnJ4tLFPGh0q85NoGwoU1hNqMlnPlovknuFjaGO lX0XzQ11E6gALww2rS7ihff1akxvQ/bE//M/Qh0lOY7hb9ZQjRPcD9QXxsR1zLzfq+VD EbKqCmAbWHnSrFdFg1oq0jYnfIrB5dx+We7iIH30T+0G8ovJd+mTzovn68FsEH64Yo1V OCH3/Vg5Wh0ceY8/obWwCyTuiabrFwGusX/ir3bw2M1mYXeRPAFsQ9Sal+B0AwNfw11B eJhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version:subject :references:in-reply-to:message-id:cc:to:from:date:dkim-signature; bh=VPsd3RxvSK9akU38J5qW4D3wDnVV1+TTrRbY+MUugj8=; b=wXyYtlkYQj3O+OfefXJOnQjU21ouF6/LJ+vEKbPPPGC/rNms5j9BA/DryEC3jDK7YP YHbaZHwgmtayWU5GA7AcrerOjUqQMOdcmMCHdKuZh9ktOBZyBGPRAjAUWJxNF3hQL9jb icorzNboSWHogideV7ZPA5YmURjt2ysFdsMQuQyW4Lib5JhZQ1wzuV+6O7bzzVFo2PKI 5/fiBi7uDUmpqwiCMPalOCHaa0AxpW8kKsn7llEtY3XxwQge8QNmgvvfZW+BxGySJvQ4 HSOf0R/Gor17ejp27n953tNIEN586X2lK9kaiL27s68F3jycceGWtn1X3Xm1+UfK2jYM gX/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=Cfj0sc49; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id y16-20020a63b510000000b005340840c0c8si16169674pge.327.2023.06.18.09.57.06; Sun, 18 Jun 2023 09:57:19 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=Cfj0sc49; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229604AbjFRQsA (ORCPT + 99 others); Sun, 18 Jun 2023 12:48:00 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41734 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229524AbjFRQr7 (ORCPT ); Sun, 18 Jun 2023 12:47:59 -0400 Received: from mail-qt1-x82d.google.com (mail-qt1-x82d.google.com [IPv6:2607:f8b0:4864:20::82d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1F85E4D; Sun, 18 Jun 2023 09:47:57 -0700 (PDT) Received: by mail-qt1-x82d.google.com with SMTP id d75a77b69052e-3fde0f72f61so6433411cf.1; Sun, 18 Jun 2023 09:47:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1687106877; x=1689698877; h=content-transfer-encoding:mime-version:subject:references :in-reply-to:message-id:cc:to:from:date:from:to:cc:subject:date :message-id:reply-to; bh=VPsd3RxvSK9akU38J5qW4D3wDnVV1+TTrRbY+MUugj8=; b=Cfj0sc49fEerL20hzENwz8PtcItwwSbnaClH5NS/pVHzmM/dvwLvhEaT6FYCNl0dmR OKA9zNJyQSpEsphH2tw/CmB52MYtdWASeDtaWkyUm3LzO0GqY0RFWBEMNwQKgRY1gte/ hFMC/AS9uLs82RUEb9AvmdAHt4dHGLIlvQtI1Qr2qE9QAJ1KEPOoriAEOnrDHQkQ+d6+ gYyzxf6y0xuGX7Gw8XirNiB3R4dTioKlXECEhHMm60fL4/KIEzIlvrrC3HawxafPHOPi CkcKx2T+h62Q42tysZQtLYJz8kH1cDimH+ATSgv62GnlbyeLcPaoPKDyV/U0EqAyz9T6 O39w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1687106877; x=1689698877; h=content-transfer-encoding:mime-version:subject:references :in-reply-to:message-id:cc:to:from:date:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=VPsd3RxvSK9akU38J5qW4D3wDnVV1+TTrRbY+MUugj8=; b=boQ01BGe1/oC/WG8lsbbjORthDN8D0VDe5CMTNBh+1KPok2aREFdQ5GY9GEJIA5QT4 Sk1LGIrdyys3a+q0ORaRuNQYJ7k3SUuO1SSI4KWe5D6orSho3s0HUyR8fhDtmXzaWo63 k/vt04PGsywOzdhkquyZuSVxplBfkSKGT/j45vW8hyVW0yuvL7Kv/lxjS0/kIzorCBaw vo7BsrEt0gpgA42A4S7f/GQMfJ0FrB4U7ZouFH5pyOD/62cMTEP8+YmWFnK4L5VlFJVw QYqohund5qtkavUuKZiHDRPLfPcaq8WEsx9X1L3K3a3t62osnpcZUDz00GVzAijDcgx3 a67w== X-Gm-Message-State: AC+VfDyH/snbO3+4jXb/Dlp5NNDI3Y3uGovNgAnMF2TxgdIwsF6SGdWo /k3nZq9OzN5riTw0Z2q6BvU= X-Received: by 2002:a05:622a:195:b0:3f8:2a37:20f with SMTP id s21-20020a05622a019500b003f82a37020fmr15741005qtw.34.1687106876943; Sun, 18 Jun 2023 09:47:56 -0700 (PDT) Received: from localhost (172.174.245.35.bc.googleusercontent.com. [35.245.174.172]) by smtp.gmail.com with ESMTPSA id bc14-20020a05622a1cce00b003fe8a96fb3bsm571571qtb.54.2023.06.18.09.47.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 18 Jun 2023 09:47:56 -0700 (PDT) Date: Sun, 18 Jun 2023 12:47:56 -0400 From: Willem de Bruijn To: David Howells , netdev@vger.kernel.org Cc: David Howells , Alexander Duyck , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Willem de Bruijn , David Ahern , Matthew Wilcox , Jens Axboe , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Chaitanya Kulkarni , linux-nvme@lists.infradead.org Message-ID: <648f353c55ce8_33cfbc29413@willemb.c.googlers.com.notmuch> In-Reply-To: <20230617121146.716077-11-dhowells@redhat.com> References: <20230617121146.716077-1-dhowells@redhat.com> <20230617121146.716077-11-dhowells@redhat.com> Subject: RE: [PATCH net-next v2 10/17] nvme: Use sendmsg(MSG_SPLICE_PAGES) rather then sendpage Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org David Howells wrote: > When transmitting data, call down into TCP using a single sendmsg with > MSG_SPLICE_PAGES to indicate that content should be spliced rather than > performing several sendmsg and sendpage calls to transmit header, data > pages and trailer. > > Signed-off-by: David Howells > cc: Keith Busch > cc: Jens Axboe > cc: Christoph Hellwig > cc: Sagi Grimberg > cc: Chaitanya Kulkarni > cc: "David S. Miller" > cc: Eric Dumazet > cc: Jakub Kicinski > cc: Paolo Abeni > cc: Jens Axboe > cc: Matthew Wilcox > cc: linux-nvme@lists.infradead.org > cc: netdev@vger.kernel.org > --- > > Notes: > ver #2) > - Wrap lines at 80. > > drivers/nvme/host/tcp.c | 46 ++++++++++++++++++++------------------- > drivers/nvme/target/tcp.c | 46 ++++++++++++++++++++++++--------------- > 2 files changed, 53 insertions(+), 39 deletions(-) > > diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c > index bf0230442d57..6f31cdbb696a 100644 > --- a/drivers/nvme/host/tcp.c > +++ b/drivers/nvme/host/tcp.c > @@ -997,25 +997,25 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req) > u32 h2cdata_left = req->h2cdata_left; > > while (true) { > + struct bio_vec bvec; > + struct msghdr msg = { > + .msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES, > + }; > struct page *page = nvme_tcp_req_cur_page(req); > size_t offset = nvme_tcp_req_cur_offset(req); > size_t len = nvme_tcp_req_cur_length(req); > bool last = nvme_tcp_pdu_last_send(req, len); > int req_data_sent = req->data_sent; > - int ret, flags = MSG_DONTWAIT; > + int ret; > > if (last && !queue->data_digest && !nvme_tcp_queue_more(queue)) > - flags |= MSG_EOR; > + msg.msg_flags |= MSG_EOR; > else > - flags |= MSG_MORE | MSG_SENDPAGE_NOTLAST; > + msg.msg_flags |= MSG_MORE; > > - if (sendpage_ok(page)) { > - ret = kernel_sendpage(queue->sock, page, offset, len, > - flags); > - } else { > - ret = sock_no_sendpage(queue->sock, page, offset, len, > - flags); > - } > + bvec_set_page(&bvec, page, len, offset); > + iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, len); > + ret = sock_sendmsg(queue->sock, &msg); > if (ret <= 0) > return ret; > > @@ -1054,22 +1054,24 @@ static int nvme_tcp_try_send_cmd_pdu(struct nvme_tcp_request *req) > { > struct nvme_tcp_queue *queue = req->queue; > struct nvme_tcp_cmd_pdu *pdu = nvme_tcp_req_cmd_pdu(req); > + struct bio_vec bvec; > + struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES, }; > bool inline_data = nvme_tcp_has_inline_data(req); > u8 hdgst = nvme_tcp_hdgst_len(queue); > int len = sizeof(*pdu) + hdgst - req->offset; > - int flags = MSG_DONTWAIT; > int ret; > > if (inline_data || nvme_tcp_queue_more(queue)) > - flags |= MSG_MORE | MSG_SENDPAGE_NOTLAST; > + msg.msg_flags |= MSG_MORE; > else > - flags |= MSG_EOR; > + msg.msg_flags |= MSG_EOR; > > if (queue->hdr_digest && !req->offset) > nvme_tcp_hdgst(queue->snd_hash, pdu, sizeof(*pdu)); > > - ret = kernel_sendpage(queue->sock, virt_to_page(pdu), > - offset_in_page(pdu) + req->offset, len, flags); > + bvec_set_virt(&bvec, (void *)pdu + req->offset, len); > + iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bvec, 1, len); > + ret = sock_sendmsg(queue->sock, &msg); > if (unlikely(ret <= 0)) > return ret; > struct bio_vec bvec; struct msghdr msg = { .msg_flags = MSG_SPLICE_PAGES | ... }; .. bvec_set_virt iov_iter_bvec sock_sendmsg is a frequent pattern. Does it make sense to define a wrapper? Same for bvec_set_page.