Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp852208pxj; Fri, 21 May 2021 00:09:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwCf4wjdj4jMHvxL1owyVMlU3evKAmn/CClWN9gRDRe3A5Zen+KdT2jgr/VStK2Nw20i5d0 X-Received: by 2002:a50:ab5e:: with SMTP id t30mr9679904edc.50.1621580957146; Fri, 21 May 2021 00:09:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621580957; cv=none; d=google.com; s=arc-20160816; b=ZoJtMBN7Dl1KA5Hde3Ca0M12p1hxVDzEW/pLvQoeUMgHRvdRax4vewwtDv+PEtEAsZ by4WKuPWQEAfFiIBIiSOlUXJFnU8Vhfw0wLSXY3zVE7z/m4cstj4SY+KMQREa7MARyRO NTLhsUtXrl/lNb+jUOMeDobnEJJ3WolktgioKuziomOXR9fwCIQhOl40pO3DULDB13hM TOzVdoX5tJtkyNnJ0PqE/k9GJGydnCsyz6fxfvMBKd418uIaKqC6L6lI2ogwbYJnC/W3 1aMvYpgtxfgFGyUzs5o0w1ds5i8QIg+1UjyS7GTOqqgaTNeNsbnQ21MCKrVGveC1R6SU /3FQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ktI7zuP5tqQq2OwwujvZf0jJQ13/fF8fLsGWEJXiAeY=; b=oBYEepPgrqoDosF5YCMY/iAQL1dXIBs+N146HKFuPgJE0GXPGS6E74gj5raXjZawPA Pv7EeAnryP01AGb0KmQtP6K1/q+0MnK78KUKu5ws4lXt8PKBMzGGavkv235XnGa2fmeV Cf/zz6yqPrvpAUV2OfimZn5INtRx393XIAr2LZ1TWPhtzlzDZxA6JO5ncxANVqsVgIyV P3TqXkyHmIV9mkGm2ip6okLYYfoz7sBLWUEp99LX93ADuNMgqhNaRjbnn1whzAxs39FJ C6xnR9qq5G1sBX8NVnD4mlIeiI5qt6cjMmYuGLJCGcwUYbIE1h1lpY/X10vobfN/0rt6 xtUQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail202102 header.b=0TYvRyZ+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=kaspersky.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e18si4671599edz.330.2021.05.21.00.08.53; Fri, 21 May 2021 00:09:17 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail202102 header.b=0TYvRyZ+; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=kaspersky.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238336AbhETTSG (ORCPT + 99 others); Thu, 20 May 2021 15:18:06 -0400 Received: from mx13.kaspersky-labs.com ([91.103.66.164]:28627 "EHLO mx13.kaspersky-labs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237265AbhETTR5 (ORCPT ); Thu, 20 May 2021 15:17:57 -0400 Received: from relay13.kaspersky-labs.com (unknown [127.0.0.10]) by relay13.kaspersky-labs.com (Postfix) with ESMTP id 86B3352142D; Thu, 20 May 2021 22:16:32 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kaspersky.com; s=mail202102; t=1621538192; bh=ktI7zuP5tqQq2OwwujvZf0jJQ13/fF8fLsGWEJXiAeY=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type; b=0TYvRyZ+YsujHv/E68E5BbRFPwoWf5nAKrAJlr8zs9tdRY4zMltGlH8okurALAnTA deH+XkLZsFqzD3+7ezgvLL3QZQr+HnuFlPm984mq6IDQtfaj3kryCbAz86JHqGWatu dm+UTwMMj5e4PJVX/M9/T49k4/GtBU0/deXyIYt9/dbSYJtRJXvF4WPTzD5K7qzcKW /xqcFM5tmecr+ETuEU7WBZR8KGqnZmtRMpJjZcpVVOcI88mlyZb0K0X4h2l1of5AxX b+pI8n6ANRkQC4Yyl5JsxCXO4vbyCYPXiLnkDllqa+v/jWR8NyL8o+3TgrMSEXoQ7K eDV7ePxxX0ONw== Received: from mail-hq2.kaspersky.com (unknown [91.103.66.206]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (Client CN "mail-hq2.kaspersky.com", Issuer "Kaspersky MailRelays CA G3" (verified OK)) by mailhub13.kaspersky-labs.com (Postfix) with ESMTPS id F2C18521145; Thu, 20 May 2021 22:16:31 +0300 (MSK) Received: from arseniy-pc.avp.ru (10.64.68.129) by hqmailmbx3.avp.ru (10.64.67.243) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.14; Thu, 20 May 2021 22:16:16 +0300 From: Arseny Krasnov To: Stefan Hajnoczi , Stefano Garzarella , "Michael S. Tsirkin" , Jason Wang , "David S. Miller" , Jakub Kicinski , Arseny Krasnov , Jorgen Hansen , Colin Ian King , Andra Paraschiv , Norbert Slusarek CC: , , , , Subject: [PATCH v10 04/18] af_vsock: implement SEQPACKET receive loop Date: Thu, 20 May 2021 22:16:08 +0300 Message-ID: <20210520191611.1271204-1-arseny.krasnov@kaspersky.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210520191357.1270473-1-arseny.krasnov@kaspersky.com> References: <20210520191357.1270473-1-arseny.krasnov@kaspersky.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.64.68.129] X-ClientProxiedBy: hqmailmbx3.avp.ru (10.64.67.243) To hqmailmbx3.avp.ru (10.64.67.243) X-KSE-ServerInfo: hqmailmbx3.avp.ru, 9 X-KSE-AntiSpam-Interceptor-Info: scan successful X-KSE-AntiSpam-Version: 5.9.20, Database issued on: 05/20/2021 18:58:27 X-KSE-AntiSpam-Status: KAS_STATUS_NOT_DETECTED X-KSE-AntiSpam-Method: none X-KSE-AntiSpam-Rate: 10 X-KSE-AntiSpam-Info: Lua profiles 163818 [May 20 2021] X-KSE-AntiSpam-Info: Version: 5.9.20.0 X-KSE-AntiSpam-Info: Envelope from: arseny.krasnov@kaspersky.com X-KSE-AntiSpam-Info: LuaCore: 446 446 0309aa129ce7cd9d810f87a68320917ac2eba541 X-KSE-AntiSpam-Info: {Prob_from_in_msgid} X-KSE-AntiSpam-Info: {Tracking_from_domain_doesnt_match_to} X-KSE-AntiSpam-Info: arseniy-pc.avp.ru:7.1.1;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1;127.0.0.199:7.1.2;kaspersky.com:7.1.1 X-KSE-AntiSpam-Info: Rate: 10 X-KSE-AntiSpam-Info: Status: not_detected X-KSE-AntiSpam-Info: Method: none X-KSE-Antiphishing-Info: Clean X-KSE-Antiphishing-ScanningType: Deterministic X-KSE-Antiphishing-Method: None X-KSE-Antiphishing-Bases: 05/20/2021 19:01:00 X-KSE-AttachmentFiltering-Interceptor-Info: no applicable attachment filtering rules found X-KSE-Antivirus-Interceptor-Info: scan successful X-KSE-Antivirus-Info: Clean, bases: 20.05.2021 14:47:00 X-KSE-BulkMessagesFiltering-Scan-Result: InTheLimit X-KSE-AttachmentFiltering-Interceptor-Info: no applicable attachment filtering rules found X-KSE-BulkMessagesFiltering-Scan-Result: InTheLimit X-KLMS-Rule-ID: 52 X-KLMS-Message-Action: clean X-KLMS-AntiSpam-Status: not scanned, disabled by settings X-KLMS-AntiSpam-Interceptor-Info: not scanned X-KLMS-AntiPhishing: Clean, bases: 2021/05/20 17:27:00 X-KLMS-AntiVirus: Kaspersky Security for Linux Mail Server, version 8.0.3.30, bases: 2021/05/20 14:47:00 #16622423 X-KLMS-AntiVirus-Status: Clean, skipped Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add receive loop for SEQPACKET. It looks like receive loop for STREAM, but there are differences: 1) It doesn't call notify callbacks. 2) It doesn't care about 'SO_SNDLOWAT' and 'SO_RCVLOWAT' values, because there is no sense for these values in SEQPACKET case. 3) It waits until whole record is received or error is found during receiving. 4) It processes and sets 'MSG_TRUNC' flag. So to avoid extra conditions for two types of socket inside one loop, two independent functions were created. Signed-off-by: Arseny Krasnov --- v9 -> v10: 1) Use 'msg_data_left()' instead of direct access to 'msg_hdr'. include/net/af_vsock.h | 4 +++ net/vmw_vsock/af_vsock.c | 72 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h index b1c717286993..5175f5a52ce1 100644 --- a/include/net/af_vsock.h +++ b/include/net/af_vsock.h @@ -135,6 +135,10 @@ struct vsock_transport { bool (*stream_is_active)(struct vsock_sock *); bool (*stream_allow)(u32 cid, u32 port); + /* SEQ_PACKET. */ + ssize_t (*seqpacket_dequeue)(struct vsock_sock *vsk, struct msghdr *msg, + int flags, bool *msg_ready); + /* Notification. */ int (*notify_poll_in)(struct vsock_sock *, size_t, bool *); int (*notify_poll_out)(struct vsock_sock *, size_t, bool *); diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index c4f6bfa1e381..aede474343d1 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -1974,6 +1974,73 @@ static int __vsock_stream_recvmsg(struct sock *sk, struct msghdr *msg, return err; } +static int __vsock_seqpacket_recvmsg(struct sock *sk, struct msghdr *msg, + size_t len, int flags) +{ + const struct vsock_transport *transport; + bool msg_ready; + struct vsock_sock *vsk; + ssize_t record_len; + long timeout; + int err = 0; + DEFINE_WAIT(wait); + + vsk = vsock_sk(sk); + transport = vsk->transport; + + timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); + msg_ready = false; + record_len = 0; + + while (1) { + ssize_t fragment_len; + + if (vsock_wait_data(sk, &wait, timeout, NULL, 0) <= 0) { + /* In case of any loop break(timeout, signal + * interrupt or shutdown), we report user that + * nothing was copied. + */ + err = 0; + break; + } + + fragment_len = transport->seqpacket_dequeue(vsk, msg, flags, &msg_ready); + + if (fragment_len < 0) { + err = -ENOMEM; + break; + } + + record_len += fragment_len; + + if (msg_ready) + break; + } + + if (sk->sk_err) + err = -sk->sk_err; + else if (sk->sk_shutdown & RCV_SHUTDOWN) + err = 0; + + if (msg_ready && err == 0) { + /* User sets MSG_TRUNC, so return real length of + * packet. + */ + if (flags & MSG_TRUNC) + err = record_len; + else + err = len - msg_data_left(msg); + + /* Always set MSG_TRUNC if real length of packet is + * bigger than user's buffer. + */ + if (record_len > len) + msg->msg_flags |= MSG_TRUNC; + } + + return err; +} + static int vsock_connectible_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, int flags) @@ -2029,7 +2096,10 @@ vsock_connectible_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, goto out; } - err = __vsock_stream_recvmsg(sk, msg, len, flags); + if (sk->sk_type == SOCK_STREAM) + err = __vsock_stream_recvmsg(sk, msg, len, flags); + else + err = __vsock_seqpacket_recvmsg(sk, msg, len, flags); out: release_sock(sk); -- 2.25.1