From patchwork Fri Jun 16 16:12:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 13282940 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 630A9EB64DA for ; Fri, 16 Jun 2023 16:13:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B5E888E000A; Fri, 16 Jun 2023 12:13:39 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AE4588E0001; Fri, 16 Jun 2023 12:13:39 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 914918E000B; Fri, 16 Jun 2023 12:13:39 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 754EE8E000A for ; Fri, 16 Jun 2023 12:13:39 -0400 (EDT) Received: from smtpin19.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 3EF241A0CF2 for ; Fri, 16 Jun 2023 16:13:39 +0000 (UTC) X-FDA: 80909106558.19.956AB4B Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf12.hostedemail.com (Postfix) with ESMTP id 7A56A4000C for ; Fri, 16 Jun 2023 16:13:37 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=BtOL9WWI; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf12.hostedemail.com: domain of dhowells@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1686932017; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Fr8R9cUCocDj4LYXtGmeXkCgA5OgO4hqxYPqdNjfTX8=; b=MTP2NvShedb9uWZZrTNOdhi1rcJ4CM7/XMdGX6bOjLsjSOwDEJLnCO/uDmJZcksQAdPNSw gh5rm46h4NDXC5fXzi9OEJSZde7/6QyFhGbEXBYN4ZzbXaG4cJbeEsjn0EfvXWCiSYxmPo Z/oinAZ5dbf2PfhBMKAZttqf2d5AcxQ= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=BtOL9WWI; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf12.hostedemail.com: domain of dhowells@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1686932017; a=rsa-sha256; cv=none; b=EsZIHIDCYMc6SS1wIIzBZgOnj1GXeQukBDlNSzHr49EE7lmNjScxMSmnwxojFPbnlHOtQT H7IRCaUh6d4w3psBXjrap4ovTNBSwnqq09zHyZM+b03T6qsKKB3WHiY4tInNO2ds7Ydk8W Ck7TuZrdGo9XNAqq7AIRLC3MaxsiJ7g= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1686932016; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Fr8R9cUCocDj4LYXtGmeXkCgA5OgO4hqxYPqdNjfTX8=; b=BtOL9WWIv7I4EkbNQtsc+VhJm8AdIdsSnO5nP8VNQRV2R+a4r1Zy8M1QW8QDz7nmMXKRp2 FrNrD6M7cpHTlqWbNHLCpj7fFpSqEp1qOtN9ZCNOQRBtMs+cfKEK1/pUZz1CQk6Z+Peg2F OPjHGLWAgwc7h6NgaJVBbdvE/vBsbH4= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-627-m0GIPd8iMeWBnIZd0MxhlQ-1; Fri, 16 Jun 2023 12:13:33 -0400 X-MC-Unique: m0GIPd8iMeWBnIZd0MxhlQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id CDEC81C05ABF; Fri, 16 Jun 2023 16:13:32 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.51]) by smtp.corp.redhat.com (Postfix) with ESMTP id 054141121314; Fri, 16 Jun 2023 16:13:30 +0000 (UTC) From: David Howells To: 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, Santosh Shilimkar , linux-rdma@vger.kernel.org, rds-devel@oss.oracle.com Subject: [PATCH net-next 08/17] rds: Use sendmsg(MSG_SPLICE_PAGES) rather than sendpage Date: Fri, 16 Jun 2023 17:12:51 +0100 Message-ID: <20230616161301.622169-9-dhowells@redhat.com> In-Reply-To: <20230616161301.622169-1-dhowells@redhat.com> References: <20230616161301.622169-1-dhowells@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Rspam-User: X-Stat-Signature: 3kwmkobyoadu4wwjbnejr5e4yttz148x X-Rspamd-Server: rspam07 X-Rspamd-Queue-Id: 7A56A4000C X-HE-Tag: 1686932017-143370 X-HE-Meta: U2FsdGVkX1/V0cD/8V4Qwjy5ROHQxmFA9EUZbvLW9u5StxYU5PoU4N/YBSf/W4sTmId0Vd6FtW0Un3X56jnaB59zwuX8wYvhfOuaOZHjO3zRXCEGEjolAZ3u0av7l5QbnRxtqPn/yKAxouLRzYbKXM5hhEaMnprpaY8rzs6OHUSiDzjabZy8/N/waM9+8uu6Hahak2QCdtD+aksKAFTu8n1zAiE0bVXm8REMwp6jE88b3jm9E0y69JcBqBFr6lWY1lbYDgYZwZT2Bfgq1Kwr35t53s6OJFIZMlyFnYIhlbZsdDZxq5MuMHqtt7Wn5txt7BZ7nY33cnUhI1pHfPTntqNeZ1TVud/Z/qdGe106TRUqPVtdI9Yqv0LmmxsEgGC8CT7G27Tez3V+W8z8MJ1t0nju6zRfWIBHHy5DbGxn6oIyKZQtp0rf6f+tuJtsy1Z2p/4w6KYd/s4DwPUU+abxc4jALVc+cmigFR6O2KLTzs2+JARLGxeOTxiO+Ufy0ROAUO7XuM5TwbQhUSfrGZnZPwEVzRE/rUfH0r5NJhpXkuyUY8xEJ5iTLuH1I7bNz4Q8oOSYWSljZGisdNjT2/Pt115lOzyO0IpYewYf9Jgr1g4/NoK+8QVyeuOo5//9mZz8VfucLTXKhAToQgnLlQ3YtaiZlOr2wSCfc6dhm4e5H23e4PweKqCbe1zMoHH0321Payv8nkv04eMBgWetY4ohBC5jccokynpt9akKeOwzJLOaZFEEEeIK3PG7/hDES251KXSVOSjsWRhoBBfGqq3hGI3G3Wc/LhjHLSTQkpsTazwEVZw8ld1nKMjiqmWSkIIrIVPJkj6455HgQrCJvs3urhClx/fJMCf5ULtfVwknHLHcjZqlXPzhK/tFIQPVjoHF2TrirDsGEgiEJAfb0ydskhX3nryCCPJbDli99FIYS02ZLuB1V+j0UQDUXj5d2a5nljEmpUlWGxzZXvA7dsH YH2X9Kgl LBB0uDY1HsvdxxscXTsvH+2pZdPaDitEeqTwYpCuOe9sFvGcKcq8Q+MC3bVbpAFzYw0yd/bpqNa+Sgf07OuU8SxNpU/VNz3zlt5QMhkNQIgLuyvBadrrtKe6r9wIA9qsjg6G3vLPkrrh166gzmQ6bUICWhITzG1O3+focJz97M2IjTCcpwHDI1uuf6RG8bRVlUqukzIP67vW0nikV4KVcjeOESOQf9gLLhfP9o2evWKG9FJ/HCK8eSik0HNvvE7zCh0WRtkq+jFcDHeQUgvkKb8tcbXnYSL1QCld6gQWE8fLNW5uCOIFMwD/JJ+1FvcQoq0nQ6GBIGRSyjGsWrXoiJ5R2wlygQ8qXlxnHJrwIBsfEg9VmwOfwpGHdJPl+tJ+tb8BJVaFChzDzXuHt3PaKB7k4LhqwQruvvS/WPvAnklh+exxfR8EtPVrpkxEii4jBy6htosqMdJ3tIUMd26Yi7S8AKF+T4rdLbS9uxbcG34l4ZWnH9hv5eVmlwftJAHMNUfECFLPLwffvups= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: 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 and data pages. To make this work, the data is assembled in a bio_vec array and attached to a BVEC-type iterator. The header are copied into memory acquired from zcopy_alloc() which just breaks a page up into small pieces that can be freed with put_page(). Signed-off-by: David Howells cc: Santosh Shilimkar cc: "David S. Miller" cc: Eric Dumazet cc: Jakub Kicinski cc: Paolo Abeni cc: Jens Axboe cc: Matthew Wilcox cc: linux-rdma@vger.kernel.org cc: rds-devel@oss.oracle.com cc: netdev@vger.kernel.org --- net/rds/tcp_send.c | 74 +++++++++++++++++----------------------------- 1 file changed, 27 insertions(+), 47 deletions(-) diff --git a/net/rds/tcp_send.c b/net/rds/tcp_send.c index 8c4d1d6e9249..550390d5ff2b 100644 --- a/net/rds/tcp_send.c +++ b/net/rds/tcp_send.c @@ -52,29 +52,23 @@ void rds_tcp_xmit_path_complete(struct rds_conn_path *cp) tcp_sock_set_cork(tc->t_sock->sk, false); } -/* the core send_sem serializes this with other xmit and shutdown */ -static int rds_tcp_sendmsg(struct socket *sock, void *data, unsigned int len) -{ - struct kvec vec = { - .iov_base = data, - .iov_len = len, - }; - struct msghdr msg = { - .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL, - }; - - return kernel_sendmsg(sock, &msg, &vec, 1, vec.iov_len); -} - /* the core send_sem serializes this with other xmit and shutdown */ int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, unsigned int hdr_off, unsigned int sg, unsigned int off) { struct rds_conn_path *cp = rm->m_inc.i_conn_path; struct rds_tcp_connection *tc = cp->cp_transport_data; + struct msghdr msg = { + .msg_flags = MSG_SPLICE_PAGES | MSG_DONTWAIT | MSG_NOSIGNAL, + }; + struct bio_vec *bvec; + unsigned int i, size = 0, ix = 0; int done = 0; - int ret = 0; - int more; + int ret = -ENOMEM; + + bvec = kmalloc_array(1 + sg, sizeof(struct bio_vec), GFP_KERNEL); + if (!bvec) + goto out; if (hdr_off == 0) { /* @@ -101,41 +95,26 @@ int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, /* see rds_tcp_write_space() */ set_bit(SOCK_NOSPACE, &tc->t_sock->sk->sk_socket->flags); - ret = rds_tcp_sendmsg(tc->t_sock, - (void *)&rm->m_inc.i_hdr + hdr_off, - sizeof(rm->m_inc.i_hdr) - hdr_off); - if (ret < 0) - goto out; - done += ret; - if (hdr_off + done != sizeof(struct rds_header)) - goto out; + bvec_set_virt(&bvec[ix], (void *)&rm->m_inc.i_hdr + hdr_off, + sizeof(rm->m_inc.i_hdr) - hdr_off); + size += bvec[ix].bv_len; + ix++; } - more = rm->data.op_nents > 1 ? (MSG_MORE | MSG_SENDPAGE_NOTLAST) : 0; - while (sg < rm->data.op_nents) { - int flags = MSG_DONTWAIT | MSG_NOSIGNAL | more; - - ret = tc->t_sock->ops->sendpage(tc->t_sock, - sg_page(&rm->data.op_sg[sg]), - rm->data.op_sg[sg].offset + off, - rm->data.op_sg[sg].length - off, - flags); - rdsdebug("tcp sendpage %p:%u:%u ret %d\n", (void *)sg_page(&rm->data.op_sg[sg]), - rm->data.op_sg[sg].offset + off, rm->data.op_sg[sg].length - off, - ret); - if (ret <= 0) - break; - - off += ret; - done += ret; - if (off == rm->data.op_sg[sg].length) { - off = 0; - sg++; - } - if (sg == rm->data.op_nents - 1) - more = 0; + for (i = sg; i < rm->data.op_nents; i++) { + bvec_set_page(&bvec[ix], + sg_page(&rm->data.op_sg[i]), + rm->data.op_sg[i].length - off, + rm->data.op_sg[i].offset + off); + off = 0; + size += bvec[ix].bv_len; + ix++; } + iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, bvec, ix, size); + ret = sock_sendmsg(tc->t_sock, &msg); + rdsdebug("tcp sendmsg-splice %u,%u ret %d\n", ix, size, ret); + out: if (ret <= 0) { /* write_space will hit after EAGAIN, all else fatal */ @@ -158,6 +137,7 @@ int rds_tcp_xmit(struct rds_connection *conn, struct rds_message *rm, } if (done == 0) done = ret; + kfree(bvec); return done; }