From patchwork Tue Jun 20 14:53:32 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 13286018 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 A8D5DEB64DB for ; Tue, 20 Jun 2023 14:57:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 41BA78D0013; Tue, 20 Jun 2023 10:57:23 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3CC598D0001; Tue, 20 Jun 2023 10:57:23 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 26C318D0013; Tue, 20 Jun 2023 10:57:23 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 169928D0001 for ; Tue, 20 Jun 2023 10:57:23 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id DAE651410EE for ; Tue, 20 Jun 2023 14:57:22 +0000 (UTC) X-FDA: 80923429524.13.BDC79EE Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf26.hostedemail.com (Postfix) with ESMTP id DEDB4140002 for ; Tue, 20 Jun 2023 14:57:20 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=MsdUC5o5; spf=pass (imf26.hostedemail.com: domain of dhowells@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1687273041; 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=LPVmbLfi9bgga9t/1pR/YmjTCDUThBHs3vchY9icGtA=; b=IVMgs6oyYd+1W1Yesazc2KJ9dZtrY73xPhd+kdpsgolFaqHaDyNFTJPXGB3OvPKZ2FOPa1 EeQbW2RdzoUdQHjIIcgpuLxG0VvNA28+GM9cdOgEO/QQfFstN0fdEaW+lyDxjORBFDEpBJ 7wRBXWZt0nOC7n7JJjuQATqc8Ge4UzI= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=MsdUC5o5; spf=pass (imf26.hostedemail.com: domain of dhowells@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=dhowells@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1687273041; a=rsa-sha256; cv=none; b=46Fm3WzYaA4seSfrS6MYaUH+jmSLkqIn3jhdI819FWbJ8gOtrOTzvDo5E9/V38SJIhK1+E IHj0DVBewT2HYBqHnN15fD18BOO3pHbbgjobGfOfy9wCjSxqPAhTHLIw6GZKE0cD3aSOhP IaNBHK8SoJ3K7aHSncjNI5yGD4VuzGg= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1687273040; 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=LPVmbLfi9bgga9t/1pR/YmjTCDUThBHs3vchY9icGtA=; b=MsdUC5o52FZFpwxiI2KIo1CiMTCfAKAnNSIDh7v1SThbkWSoCQvCF58J2J4KiXXGAKNycq x3m0sK3ML+lzIdQ24sCEzvOOHdCTGGUoSRBVnGlafs7G4Nc//QxzDJnfHaV7x/sxRd5Ng/ VhIZilSKjdq6cMJZ3YjmnxVlxUkABPo= 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-572-azJhDjRHOim524o5jKEhlw-1; Tue, 20 Jun 2023 10:57:14 -0400 X-MC-Unique: azJhDjRHOim524o5jKEhlw-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.rdu2.redhat.com [10.11.54.7]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 543CA3C1A5FB; Tue, 20 Jun 2023 14:54:33 +0000 (UTC) Received: from warthog.procyon.org.com (unknown [10.42.28.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6F4C51400C34; Tue, 20 Jun 2023 14:54:31 +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, Mark Fasheh , Joel Becker , Joseph Qi , ocfs2-devel@oss.oracle.com Subject: [PATCH net-next v3 13/18] ocfs2: Use sendmsg(MSG_SPLICE_PAGES) rather than sendpage() Date: Tue, 20 Jun 2023 15:53:32 +0100 Message-ID: <20230620145338.1300897-14-dhowells@redhat.com> In-Reply-To: <20230620145338.1300897-1-dhowells@redhat.com> References: <20230620145338.1300897-1-dhowells@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.7 X-Rspamd-Queue-Id: DEDB4140002 X-Rspam-User: X-Stat-Signature: fdz456n51yy9m3r3xbh9ntu4im7bjwun X-Rspamd-Server: rspam01 X-HE-Tag: 1687273040-729817 X-HE-Meta: U2FsdGVkX1+VU/vmt4eO7udzBPEj/HbOOYTiLsjhaVb/ZJV+/nzyXZ74Z6QSbFFBrwIK6EtiUHCrBpTw9+l3t5fkokmHYuUHzLQsSz26csVQISobvDh3t9rDFjwbtqpQJnhflqUmfGhEPe5oQb7QQhAUvHW25Ik9b0RdqYvXKJTa2pFBwpOq7EsbNezfvZ9EsxWOgOAC9qDTnwxKIhmA6OSLVcOyI7w6LVbtfaXh/3mzV8+QRn9HAzWUTouLNVRauznGffDL2lqgnHFSqms/yUkage3Fq0/x3t6lIccIrQ24AQzr98HBFGfVaqhfjt5CVMFMFpI9GkqI/dE9gnzstS9+6CKRBFSXbYtP0GqSlcLQLPlzHDbe0QtcsCQBF5jYGj/WIlHS1Vfyy+DnWDtVECpTSzObJCryv183FqIw06XBlwfG8RBbKXpDIzg/LbrL7LtZaZxAY/5K6n1q2pOIMjFLiScLOnZ1vFZZ2RDbBH3FSSiUAkQKHC0aaSj7cYn8zrTCk7VHJI/aXt1NjRSa7pCCR81JKRonx0yOPTSllt6PimyFIk6KBRMAyJxtn+hketrxB11pl7U4EdZvD8hoApsBjPGM47OfOYlE3QZ1KVRX/vovUfiZE5dFyJXnyOKk2CCl4o+O3LefOEXHlgWb8YOhr5z/DiiEu46+Uz5D3MT8RP5Jcj+otNTgSkd6Xs+b8pMNcJOsOVPpFVHwtPlBEYZhuCCiKbRA3McAB//holiXj4IxuZtvn0AQrpaGMnWYSoniM3hDMP3pWjqNAJssmWCYaG0D3YT1Hv1cBFwpK6Vp821PYjRI/uCk1ftJHB8U/+AeAmZGAVUTytqKaHtnLpHygeNziOdmIaH8PYG0pLg8CGpTlknIrQ/oT8Z42HaduYJydySfTXgNW6zl++XP+Oslb1gFEVcKdzG6KF5j+P4S4lt4pWgpw3mey2Q3EnmoQAmIi8BPRRfhYvdGD+8 xDeBv4Cr yZqprxgjThY3xeW5knjHFz3G/dECoZESuK/QQmnJs0Fv2CxOGtStxlhh49c6gV1j9dgfkKC+GQ/bPPtf4NGE9QX3k7lqP2eFsqKTm5mHfaOyFbPhTLV9Jp6K8jP/P9KZz16p3Ej0vAhze/t5wPAs+oq5r8Xr4/L9zn0bgtFo25H2v3jmSZDG3zq4XY/D7iBhHNqZ7/4HOcmXNob5FPWD5wHUZtoPU5cZDFJcSM7ZU0wFhYHQVULjCM6kTYEiDKuM0wyMkmIdBmfBwSrXD4DDFdSXgaj/09XZ90K34WwWWnQVdaFk+YEkg5JNsL9B67vd3SKO4fcqdfHRHNK9aTKqzIODhSbOtrYMJjJKOuPfeFsSjA2vt/VVi15//kK2Cd1zFqcX6WrSU3u8lfPMRdHzkiMzY55nyOHQC37nT6YhwAIcR16FsjbHUbEK2Njwzc9fuArS0XNUIChWjdJLpV4hvkJq/NStpKZ16rw8FhEZcusRHP9rObEJe8C3QvmQmvp9euE4DiytoTsSEAQoDmwBhLQXm6BkMeaYuZb2IJtvWDxjFfjAWw7hxRAjN52M1/dL4BTL2qJA7mf0kfK+/FgvCPzmuH+No02JD39q5 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: Fix ocfs2 to use the page fragment allocator rather than kzalloc in order to allocate the buffers for the handshake message and keepalive request and reply messages. Switch from using sendpage() to using sendmsg() + MSG_SPLICE_PAGES so that sendpage can be phased out. Signed-off-by: David Howells cc: Mark Fasheh cc: Joel Becker cc: Joseph Qi cc: "David S. Miller" cc: Eric Dumazet cc: Jakub Kicinski cc: Paolo Abeni cc: ocfs2-devel@oss.oracle.com cc: netdev@vger.kernel.org --- Notes: ver #2) - Wrap lines at 80. fs/ocfs2/cluster/tcp.c | 109 +++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 49 deletions(-) diff --git a/fs/ocfs2/cluster/tcp.c b/fs/ocfs2/cluster/tcp.c index aecbd712a00c..969d347ed9fa 100644 --- a/fs/ocfs2/cluster/tcp.c +++ b/fs/ocfs2/cluster/tcp.c @@ -110,9 +110,6 @@ static struct work_struct o2net_listen_work; static struct o2hb_callback_func o2net_hb_up, o2net_hb_down; #define O2NET_HB_PRI 0x1 -static struct o2net_handshake *o2net_hand; -static struct o2net_msg *o2net_keep_req, *o2net_keep_resp; - static int o2net_sys_err_translations[O2NET_ERR_MAX] = {[O2NET_ERR_NONE] = 0, [O2NET_ERR_NO_HNDLR] = -ENOPROTOOPT, @@ -930,19 +927,22 @@ static int o2net_send_tcp_msg(struct socket *sock, struct kvec *vec, } static void o2net_sendpage(struct o2net_sock_container *sc, - void *kmalloced_virt, - size_t size) + void *virt, size_t size) { struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num); + struct msghdr msg = {}; + struct bio_vec bv; ssize_t ret; + bvec_set_virt(&bv, virt, size); + iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, &bv, 1, size); + while (1) { + msg.msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES; mutex_lock(&sc->sc_send_lock); - ret = sc->sc_sock->ops->sendpage(sc->sc_sock, - virt_to_page(kmalloced_virt), - offset_in_page(kmalloced_virt), - size, MSG_DONTWAIT); + ret = sock_sendmsg(sc->sc_sock, &msg); mutex_unlock(&sc->sc_send_lock); + if (ret == size) break; if (ret == (ssize_t)-EAGAIN) { @@ -1168,6 +1168,7 @@ static int o2net_process_message(struct o2net_sock_container *sc, struct o2net_msg *hdr) { struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num); + struct o2net_msg *keep_resp; int ret = 0, handler_status; enum o2net_system_error syserr; struct o2net_msg_handler *nmh = NULL; @@ -1186,8 +1187,17 @@ static int o2net_process_message(struct o2net_sock_container *sc, be32_to_cpu(hdr->status)); goto out; case O2NET_MSG_KEEP_REQ_MAGIC: - o2net_sendpage(sc, o2net_keep_resp, - sizeof(*o2net_keep_resp)); + keep_resp = alloc_skb_frag(sizeof(*keep_resp), + GFP_KERNEL); + if (!keep_resp) { + ret = -ENOMEM; + goto out; + } + memset(keep_resp, 0, sizeof(*keep_resp)); + keep_resp->magic = + cpu_to_be16(O2NET_MSG_KEEP_RESP_MAGIC); + o2net_sendpage(sc, keep_resp, sizeof(*keep_resp)); + folio_put(virt_to_folio(keep_resp)); goto out; case O2NET_MSG_KEEP_RESP_MAGIC: goto out; @@ -1439,15 +1449,23 @@ static void o2net_rx_until_empty(struct work_struct *work) sc_put(sc); } -static void o2net_initialize_handshake(void) +static struct o2net_handshake *o2net_initialize_handshake(void) { - o2net_hand->o2hb_heartbeat_timeout_ms = cpu_to_be32( - O2HB_MAX_WRITE_TIMEOUT_MS); - o2net_hand->o2net_idle_timeout_ms = cpu_to_be32(o2net_idle_timeout()); - o2net_hand->o2net_keepalive_delay_ms = cpu_to_be32( - o2net_keepalive_delay()); - o2net_hand->o2net_reconnect_delay_ms = cpu_to_be32( - o2net_reconnect_delay()); + struct o2net_handshake *hand; + + hand = alloc_skb_frag(sizeof(*hand), GFP_KERNEL); + if (!hand) + return NULL; + + memset(hand, 0, sizeof(*hand)); + hand->protocol_version = cpu_to_be64(O2NET_PROTOCOL_VERSION); + hand->connector_id = cpu_to_be64(1); + hand->o2hb_heartbeat_timeout_ms = + cpu_to_be32(O2HB_MAX_WRITE_TIMEOUT_MS); + hand->o2net_idle_timeout_ms = cpu_to_be32(o2net_idle_timeout()); + hand->o2net_keepalive_delay_ms = cpu_to_be32(o2net_keepalive_delay()); + hand->o2net_reconnect_delay_ms = cpu_to_be32(o2net_reconnect_delay()); + return hand; } /* ------------------------------------------------------------ */ @@ -1456,16 +1474,22 @@ static void o2net_initialize_handshake(void) * rx path will see the response and mark the sc valid */ static void o2net_sc_connect_completed(struct work_struct *work) { + struct o2net_handshake *hand; struct o2net_sock_container *sc = container_of(work, struct o2net_sock_container, sc_connect_work); + hand = o2net_initialize_handshake(); + if (!hand) + goto out; + mlog(ML_MSG, "sc sending handshake with ver %llu id %llx\n", (unsigned long long)O2NET_PROTOCOL_VERSION, - (unsigned long long)be64_to_cpu(o2net_hand->connector_id)); + (unsigned long long)be64_to_cpu(hand->connector_id)); - o2net_initialize_handshake(); - o2net_sendpage(sc, o2net_hand, sizeof(*o2net_hand)); + o2net_sendpage(sc, hand, sizeof(*hand)); + folio_put(virt_to_folio(hand)); +out: sc_put(sc); } @@ -1475,8 +1499,15 @@ static void o2net_sc_send_keep_req(struct work_struct *work) struct o2net_sock_container *sc = container_of(work, struct o2net_sock_container, sc_keepalive_work.work); + struct o2net_msg *keep_req; - o2net_sendpage(sc, o2net_keep_req, sizeof(*o2net_keep_req)); + keep_req = alloc_skb_frag(sizeof(*keep_req), GFP_KERNEL); + if (keep_req) { + memset(keep_req, 0, sizeof(*keep_req)); + keep_req->magic = cpu_to_be16(O2NET_MSG_KEEP_REQ_MAGIC); + o2net_sendpage(sc, keep_req, sizeof(*keep_req)); + folio_put(virt_to_folio(keep_req)); + } sc_put(sc); } @@ -1780,6 +1811,7 @@ static int o2net_accept_one(struct socket *sock, int *more) struct socket *new_sock = NULL; struct o2nm_node *node = NULL; struct o2nm_node *local_node = NULL; + struct o2net_handshake *hand; struct o2net_sock_container *sc = NULL; struct o2net_node *nn; unsigned int nofs_flag; @@ -1882,8 +1914,11 @@ static int o2net_accept_one(struct socket *sock, int *more) o2net_register_callbacks(sc->sc_sock->sk, sc); o2net_sc_queue_work(sc, &sc->sc_rx_work); - o2net_initialize_handshake(); - o2net_sendpage(sc, o2net_hand, sizeof(*o2net_hand)); + hand = o2net_initialize_handshake(); + if (hand) { + o2net_sendpage(sc, hand, sizeof(*hand)); + folio_put(virt_to_folio(hand)); + } out: if (new_sock) @@ -2090,21 +2125,8 @@ int o2net_init(void) unsigned long i; o2quo_init(); - o2net_debugfs_init(); - o2net_hand = kzalloc(sizeof(struct o2net_handshake), GFP_KERNEL); - o2net_keep_req = kzalloc(sizeof(struct o2net_msg), GFP_KERNEL); - o2net_keep_resp = kzalloc(sizeof(struct o2net_msg), GFP_KERNEL); - if (!o2net_hand || !o2net_keep_req || !o2net_keep_resp) - goto out; - - o2net_hand->protocol_version = cpu_to_be64(O2NET_PROTOCOL_VERSION); - o2net_hand->connector_id = cpu_to_be64(1); - - o2net_keep_req->magic = cpu_to_be16(O2NET_MSG_KEEP_REQ_MAGIC); - o2net_keep_resp->magic = cpu_to_be16(O2NET_MSG_KEEP_RESP_MAGIC); - for (i = 0; i < ARRAY_SIZE(o2net_nodes); i++) { struct o2net_node *nn = o2net_nn_from_num(i); @@ -2122,21 +2144,10 @@ int o2net_init(void) } return 0; - -out: - kfree(o2net_hand); - kfree(o2net_keep_req); - kfree(o2net_keep_resp); - o2net_debugfs_exit(); - o2quo_exit(); - return -ENOMEM; } void o2net_exit(void) { o2quo_exit(); - kfree(o2net_hand); - kfree(o2net_keep_req); - kfree(o2net_keep_resp); o2net_debugfs_exit(); }