From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (unknown [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id 8CA52806A2 for ; Wed, 30 Sep 2026 07:36:25 +0000 (UTC) Received: from mail.openvz.org (localhost [127.0.0.1]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 68U7Z96a014575; Wed, 30 Sep 2026 10:35:10 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 68U7Z96a014575 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="c+WV55As" Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 68U7Z7Na014567 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Wed, 30 Sep 2026 10:35:07 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 68U7Z7Na014567 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-49e6422198fso33108665e9.1 for ; Wed, 30 Sep 2026 00:35:07 -0700 (PDT) X-Gm-Message-State: AFuF++kOVAnemXC6FcpVBpxWGMgY5kc2KiF0tghA1KxAaX2OZN2h0r9x url4mx2G9ZV41gpcy3+gQLZG1RBmtb79dTFQE8JtTIUN7SbB2fFYhlypp7qub1ROPbZoD5x2OhU LiteC3Y6zyq8Tpzh8g7hovgg87h9VADAl8BPFUIg1ezhHwEh7WsN1Tw== X-Gm-Gg: AYBFou3xTz9RORu4oIN0YuoTyNm8jy/2zmMogX9m0KJqo2MBE4tUyE5nepN83PpUugV /36NLw/5aIhDTR7p6q/gQ0DyGHPOTOOQ6EhIrs3N2TD/cnIkybp9lZV6NJ/eGlTJQsQEgnm1mUh iAjkQyXXvNprJfhNUUemFNVyGFSGaF0KsJuVkCDwcRu4gKCChszFAHlkLz+K5ZjXB3A/qTfGX1y hOGbvMepsX2AMm1tjQ4Y5l8kldCOUO4B1rVgAMRPTvathUEhrFSa6j920kDGFozElDM7ZFn6qY9 RSOnMoYAYN6t120q3n12Gx3mytelZtOo6hvDWqPMT+4ZxlyGmXoJO57bhC6LNAFLZ4jPR9czuj2 Ml+QQIg2Vbpm8ltY= X-Received: by 2002:a05:600c:628b:b0:49f:fe7e:dc61 with SMTP id 5b1f17b1804b1-4a01ab4e424mr7837635e9.0.1790753707095; Wed, 30 Sep 2026 00:35:07 -0700 (PDT) X-Received: by 2002:a05:600c:628b:b0:49f:fe7e:dc61 with SMTP id 5b1f17b1804b1-4a01ab4e424mr7837065e9.0.1790753706442; Wed, 30 Sep 2026 00:35:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1790753706; cv=none; d=google.com; s=arc-20260327; b=KUo2M9cC+InfOc5sOKtUZaeM+J42eK30PV7QD0qpIboYZsOAS6Q6umASn41B6Bued8 f9YsQby2X4AIitWYOZBZCKVud0gzwITGdE4Ngvr6Rp8Sul4e/G+h/f1Tsv6I9lE6DYWj tb6h+lmxr9y6oznsGVpiaKj9s5Cqic4sHmf6WK2Ed6KsDhtgoP6urOO5onY1yzH7SzJk SQ3b0YTlmgBnxHLwB+pkzgK6b4CHX61s3SH3vcHaLkzKAxpGFGcKHOAj3U+UpJqZmJyU IV9PKJI4SBCiHwaJNuEBoZA9FRV6NIXqgAWh8/F61gQuWsgCF33W2J6WGslrkNp1ARhR it+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:dkim-signature; bh=tlZvzlx1QmWv5MdI2sfsB4dY4RGjc3CFr865+BDMy2U=; fh=6JpqpGxFeFNaDh+k4t2UfZyo3rKe/54dyQ52T8vVmSc=; b=HxG+R9IXAcCoTFGX+JSzpjSAE1p8CZTxKH5j8FrUy8AkKKtpzs/1oW0brvWA2I/8AC bj4cBF/wfw8+y4Ov4u8cns+L0w1AWbIpuuR3ld/wY0VlujnGz8LNcivWSnnxKBmIRgPf MRikEhDnlfBB2qeKW32hFkW7hfK9v3Guc5TXU2Q3ZI4Xx6YSB2LwaYDMPQZ+a5/8g0A2 elPlpIrI/I2NYiV19ykbCJc5QZfoP8d5wwJ0n9TdTDwFJ6yl0qbgZ2F2cpFQQmyW6cE5 JnxYa+ZJDPFvJsgGTkPx02LvEY2u+LrEVE27jnVTMMbNixkLkO/yMPF6eoKsqVCb076j KSBQ==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=c+WV55As; spf=pass (google.com: domain of kui.liu@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=kui.liu@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from relay.virtuozzo.com (relay.virtuozzo.com. [130.117.225.111]) by mx.google.com with ESMTPS id 5b1f17b1804b1-4a0178504f2si19306255e9.7.2026.09.30.00.35.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 30 Sep 2026 00:35:06 -0700 (PDT) Received-SPF: pass (google.com: domain of kui.liu@virtuozzo.com designates 130.117.225.111 as permitted sender) client-ip=130.117.225.111; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=c+WV55As; spf=pass (google.com: domain of kui.liu@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=kui.liu@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=Message-Id:Content-Type:MIME-Version:Subject:Date :From; bh=tlZvzlx1QmWv5MdI2sfsB4dY4RGjc3CFr865+BDMy2U=; b=c+WV55AsFXkWeTtm83d mxmYbmGjcLn45+kvaYOWmNp7rFbwMVkzQMGSv1WwQn9JoNm0kpYpL89de1UJbzojoRZ/H+3y+LEJL Hl4A1hF9k+o4T/7efuw+HX6msv07I8NPLFdnPFhD4IrtPKsasCAG8VQrUV16+n70A30VY/F9H4Crh FddTBbSEDmbow0ffWkspiWejsqjIhF5DbcAOZAJHnNl5ApKR1btEQX/VfjZcbzwmXtSM2pAspCBH6 30ecup6zJSaHP9H2eJgSbq7kamNKUVBNYNsVAuBuCp5H4iBlBIZemN6z71okbim7DjjrZXruL3ZCI 41qCJR7Wnrt9cWw==; Received: from ch-vpn.virtuozzo.com ([130.117.225.6] helo=LK-MBP.local) by relay.virtuozzo.com with esmtp (Exim 4.96) (envelope-from ) id 1xBonC-00FyU7-0V; Wed, 30 Sep 2026 09:35:05 +0200 From: Liu Kui Date: Wed, 30 Sep 2026 15:34:33 +0800 MIME-Version: 1.0 Message-Id: <20260930-sockio-refactor-8-1-v1-3-806348b9eb26@virtuozzo.com> References: <20260930-sockio-refactor-8-1-v1-0-806348b9eb26@virtuozzo.com> In-Reply-To: <20260930-sockio-refactor-8-1-v1-0-806348b9eb26@virtuozzo.com> To: Konstantin Khorenko X-Mailer: b4 0.16.0 X-OZ-Fwd: true Cc: azaitsev@virtuozzo.com, devel@openvz.org, Liu Kui Subject: [Devel] [PATCH hci-8.1 3/3] fs/fuse kio: refactor receive path in pcs_sockio_recv() X-BeenThere: devel@openvz.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: OpenVZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org The receive path consumes data one 4k page per kernel_recvmsg() call: do_recv_one_seg() extracts a single page from the iov_iter, kmaps it and receives into it, so a 1M message body costs up to 256 recvmsg calls plus a page reference and kmap/kunmap per page. Replace do_recv_one_seg() with do_sockio_recvmsg(), the receive twin of do_sockio_sendmsg(): hand the whole remaining iov_iter to sock_recvmsg() and let it drain everything available in one call. The header read goes through the same helper too, replacing do_sock_recv(), so the whole receive path now uses one recv primitive. https://virtuozzo.atlassian.net/browse/VSTOR-142167 Signed-off-by: Liu Kui --- fs/fuse/kio/pcs/pcs_sock_io.c | 80 +++++++++++-------------------------------- fs/fuse/kio/pcs/pcs_sock_io.h | 1 + 2 files changed, 21 insertions(+), 60 deletions(-) diff --git a/fs/fuse/kio/pcs/pcs_sock_io.c b/fs/fuse/kio/pcs/pcs_sock_io.c index 828c8a98cabf..2da6d51c898b 100644 --- a/fs/fuse/kio/pcs/pcs_sock_io.c +++ b/fs/fuse/kio/pcs/pcs_sock_io.c @@ -139,69 +139,24 @@ static bool pcs_should_fail_sock_io(void) } #endif -static int do_sock_recv(struct socket *sock, void *buf, size_t len) +static int do_sockio_recvmsg(struct pcs_sockio *sio, struct iov_iter *it, size_t left) { + struct msghdr sockmsg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL }; + int ret; - struct kvec iov = {buf, len}; - struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL }; - struct pcs_sockio __maybe_unused *sio; - int ret = -EIO; - - if (pcs_should_fail_sock_io()) - goto out; - - ret = kernel_recvmsg(sock, &msg, &iov, 1, len, msg.msg_flags); -out: - -#ifdef CONFIG_FUSE_KIO_DEBUG - rcu_read_lock(); - sio = rcu_dereference_sk_user_data(sock->sk); - if (sio) { - TRACE("RET: "PEER_FMT" len:%ld ret:%d\n", PEER_ARGS(sio->netio.parent), - len, ret); - } - rcu_read_unlock(); -#endif /* CONFIG_FUSE_KIO_DEBUG */ - - return ret; -} - -static int do_recv_one_seg(struct socket *sock, struct iov_iter *it, size_t left) -{ - int ret = -EINVAL; - size_t size = min(iov_iter_single_seg_count(it), left); - - if (unlikely(!size)) - return 0; - - if (iov_iter_is_kvec(it)) { - struct kvec kv; - - iov_iter_get_kvec(it, &kv); - if (kv.iov_len > size) - kv.iov_len = size; - - ret = do_sock_recv(sock, kv.iov_base, kv.iov_len); - if (ret > 0) - iov_iter_advance(it, ret); + if (unlikely(pcs_should_fail_sock_io())) + return -EIO; - } else if (iov_iter_is_bvec(it)) { - size_t offset; - ssize_t len; - struct page* page; + sockmsg.msg_iter = *it; + /* The iter may cover more than what is left of the message (trash msg) */ + iov_iter_truncate(&sockmsg.msg_iter, left); - len = iov_iter_get_pages2(it, &page, size, 1, &offset); - BUG_ON(len <=0); + ret = sock_recvmsg(sio->socket, &sockmsg, sockmsg.msg_flags); - ret = do_sock_recv(sock, kmap(page) + offset, len); - if (ret <= 0) - iov_iter_revert(it, len); - else if (ret < len) - iov_iter_revert(it, len - ret); + DTRACE("sock(%px) len:%zu ret:%d\n", sio->socket, left, ret); - kunmap(page); - put_page(page); - } + if (ret > 0) + iov_iter_advance(it, ret); return ret; } @@ -232,8 +187,13 @@ static void pcs_sockio_recv(struct pcs_sockio *sio) sio->read_offset = 0; n = 0; - if (copy) - n = do_sock_recv(sio->socket, (char *)sio_inline_buffer(sio) + sio->hdr_ptr, copy); + if (copy) { + sio->hdr_kv.iov_base = (char *)sio_inline_buffer(sio) + sio->hdr_ptr; + sio->hdr_kv.iov_len = copy; + iov_iter_kvec(it, READ, &sio->hdr_kv, 1, copy); + + n = do_sockio_recvmsg(sio, it, copy); + } if (n > 0 || n == copy /* recv return 0 when copy is 0 */) { sio->hdr_ptr += n; @@ -279,7 +239,7 @@ static void pcs_sockio_recv(struct pcs_sockio *sio) if (msg != PCS_TRASH_MSG) BUG_ON(iov_iter_count(it) > msg_size - sio->read_offset); - n = do_recv_one_seg(sio->socket, it, (size_t)(msg_size - sio->read_offset)); + n = do_sockio_recvmsg(sio, it, (size_t)(msg_size - sio->read_offset)); if (n > 0) { sio->read_offset += n; } else { diff --git a/fs/fuse/kio/pcs/pcs_sock_io.h b/fs/fuse/kio/pcs/pcs_sock_io.h index d894aebdca7f..01c99f73dc9d 100644 --- a/fs/fuse/kio/pcs/pcs_sock_io.h +++ b/fs/fuse/kio/pcs/pcs_sock_io.h @@ -151,6 +151,7 @@ struct pcs_sockio u32 current_msg_size; int read_offset; int write_offset; + struct kvec hdr_kv; /* backs read_iter for header reads */ struct iov_iter read_iter; struct iov_iter write_iter; struct mutex mutex; -- Git-155) _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel