Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp1613985pxb; Mon, 8 Mar 2021 01:52:56 -0800 (PST) X-Google-Smtp-Source: ABdhPJzibuQWVpyYWMeLfXFVqgcXkdG6DCgrvFwvCMfyYKyeSyPU1mrHtcrag10Ic18D2riz4cwv X-Received: by 2002:a17:906:1c13:: with SMTP id k19mr14336256ejg.457.1615197175911; Mon, 08 Mar 2021 01:52:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615197175; cv=none; d=google.com; s=arc-20160816; b=Le89N6qQ+GfyclnuHjP7ur3RlUZ/yli2W7qkWYEuoA9Yb4mHBHXZ4e4aKPr5+6kyK6 YR0fCbGz+mTUcmc756PJLiE+CdLyR+9CAW0FMS/XFKhJ37ZBU8qyAMkQsUKO0uq6IVwX XNzJrFMadR/cK3DmKeQTtvUyB79y/dKVoc/jrkailknB019AzlrSaCsVKpjH3zKriinE VEPlbSSG7TJ7PBkPA+hkhYHbvI96iEEhMGFhs2/NLWfZmXUOalNsunff4dzRZJE+FjEL W7rN1mxTptlxsqD2ZD+Xo/+ImR5aHANGZIq3AcaDslgAQP/Z9Pp/yv1fiKyrWWB7OlVL 5GjQ== 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=23OriOnwwClTD5+ihhqQ9/45CYxxuvgSxSbq4NQsujg=; b=LXtbABnwrFnMPvIWl3V93l4sdCIv0RFgUzN94xelxeDkCgQldVNdJ0BdfbEBvxDfka iWMvNc08rHX+3jxk7BtN+oaMl45+BV3LAu8PVBu3wJlkkMKFPGMBHjWKw48TC3lXd5DK 7oq99ctHtRy1qw5z0YH6uoIEwbE4LJnX1ZvGlr6OD11gdvgf6qWFm7AsZtt06zQ4OC8U 4fjhsXfxYRZXf0/lIctFN4nkSSORqKP6Q0QCAf/39jGx+Q9N2tMpRvaZOInCh51EBbXT Ds/r+Ml3WhCLm9iy205AyudcskTWx/4N/jthJR9TxUbXfXC8c/EcDBbXHIiJ+Qfb4k4K hLzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail202102 header.b=L5VXVNP5; 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 u19si7057182edo.410.2021.03.08.01.52.34; Mon, 08 Mar 2021 01:52:55 -0800 (PST) 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=L5VXVNP5; 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 S232544AbhCGSAM (ORCPT + 99 others); Sun, 7 Mar 2021 13:00:12 -0500 Received: from mx13.kaspersky-labs.com ([91.103.66.164]:49552 "EHLO mx13.kaspersky-labs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231866AbhCGR75 (ORCPT ); Sun, 7 Mar 2021 12:59:57 -0500 Received: from relay13.kaspersky-labs.com (unknown [127.0.0.10]) by relay13.kaspersky-labs.com (Postfix) with ESMTP id 4114052138A; Sun, 7 Mar 2021 20:59:55 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kaspersky.com; s=mail202102; t=1615139995; bh=23OriOnwwClTD5+ihhqQ9/45CYxxuvgSxSbq4NQsujg=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type; b=L5VXVNP58mdb3FU9GmmE2dg05xWKaso7cEzMTCbERNI72Wv+NjI3jIeEE7JrmNEHG GinvIyy+disbetR3V18kHYer2L3PHBp5/gS1G1bEhjn8AD2oXD+UsKaWi3ayvPss6w V91fe8BGaDvTLlxDvttKIfUe3z4NUky97SfPQGbrAbKmkcg7X4cL1H/z73HrVdtjBR kQ39nP/R4D6jDW+xwuwfaaEVuUmQ3wWTxZ1DXvq9u7OteZHmzhYnOrfXXr6zwPFusW 2KK+lf0EJe9zdnWQt2/5yRTb1Uk8K/TYjaCWxkAN+iIKFBCX8ZzW+jYoLMspIzmjcj H5ejTag1EVznA== 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 F20BC5213AA; Sun, 7 Mar 2021 20:59:54 +0300 (MSK) Received: from arseniy-pc.avp.ru (10.64.64.121) 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.2; Sun, 7 Mar 2021 20:59:54 +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 , Norbert Slusarek , Andra Paraschiv CC: , , , , , Subject: [RFC PATCH v6 04/22] af_vsock: implement SEQPACKET receive loop Date: Sun, 7 Mar 2021 20:59:45 +0300 Message-ID: <20210307175948.3464885-1-arseny.krasnov@kaspersky.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210307175722.3464068-1-arseny.krasnov@kaspersky.com> References: <20210307175722.3464068-1-arseny.krasnov@kaspersky.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.64.64.121] 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: 03/07/2021 17:45:01 X-KSE-AntiSpam-Status: KAS_STATUS_NOT_DETECTED X-KSE-AntiSpam-Method: none X-KSE-AntiSpam-Rate: 10 X-KSE-AntiSpam-Info: Lua profiles 162254 [Mar 07 2021] X-KSE-AntiSpam-Info: LuaCore: 431 431 6af1f0c9661e70e28927a654c0fea10ff13ade05 X-KSE-AntiSpam-Info: Version: 5.9.20.0 X-KSE-AntiSpam-Info: Envelope from: arseny.krasnov@kaspersky.com X-KSE-AntiSpam-Info: {Prob_from_in_msgid} X-KSE-AntiSpam-Info: {Tracking_from_domain_doesnt_match_to} X-KSE-AntiSpam-Info: {Macro_CONTENT_TYPE_ENCODING_NOT_JAPANESE} X-KSE-AntiSpam-Info: {Macro_CONTENT_TYPE_ENCODING_NOT_RUS} X-KSE-AntiSpam-Info: {Macro_CONTENT_TYPE_MISSED} X-KSE-AntiSpam-Info: {Macro_DATE_DOUBLE_SPACE} X-KSE-AntiSpam-Info: {Macro_DATE_MOSCOW} X-KSE-AntiSpam-Info: {Macro_FROM_DOUBLE_ENG_NAME} X-KSE-AntiSpam-Info: {Macro_FROM_LOWCAPS_DOUBLE_ENG_NAME_IN_EMAIL} X-KSE-AntiSpam-Info: {Macro_FROM_NOT_RU} X-KSE-AntiSpam-Info: {Macro_FROM_NOT_RUS_CHARSET} X-KSE-AntiSpam-Info: {Macro_FROM_REAL_NAME_MATCHES_ALL_USERNAME_PROB} X-KSE-AntiSpam-Info: {Macro_HEADERS_NOT_LIST} X-KSE-AntiSpam-Info: {Macro_MAILER_OTHER} X-KSE-AntiSpam-Info: {Macro_MISC_X_PRIORITY_MISSED} X-KSE-AntiSpam-Info: {Macro_NO_DKIM} X-KSE-AntiSpam-Info: {Macro_REPLY_TO_MISSED} X-KSE-AntiSpam-Info: {Macro_SUBJECT_AT_LEAST_2_WORDS} X-KSE-AntiSpam-Info: {Macro_SUBJECT_LONG_TEXT} X-KSE-AntiSpam-Info: {Macro_TO_CONTAINS_5_EMAILS} X-KSE-AntiSpam-Info: {Macro_TO_CONTAINS_SEVERAL_EMAILS} 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: 03/07/2021 17:47: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: 07.03.2021 15:50: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/03/07 17:11:00 X-KLMS-AntiVirus: Kaspersky Security for Linux Mail Server, version 8.0.3.30, bases: 2021/03/07 15:50:00 #16360637 X-KLMS-AntiVirus-Status: Clean, skipped Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds receive loop for SEQPACKET. It looks like receive loop for STREAM, but there is a little bit difference: 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 --- include/net/af_vsock.h | 5 +++ net/vmw_vsock/af_vsock.c | 95 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 99 insertions(+), 1 deletion(-) diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h index b1c717286993..5ad7ee7f78fd 100644 --- a/include/net/af_vsock.h +++ b/include/net/af_vsock.h @@ -135,6 +135,11 @@ struct vsock_transport { bool (*stream_is_active)(struct vsock_sock *); bool (*stream_allow)(u32 cid, u32 port); + /* SEQ_PACKET. */ + size_t (*seqpacket_seq_get_len)(struct vsock_sock *vsk); + int (*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 0bc661e54262..ac2f69362f2e 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -1973,6 +1973,96 @@ 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; + const struct iovec *orig_iov; + unsigned long orig_nr_segs; + bool msg_ready; + struct vsock_sock *vsk; + size_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); + orig_nr_segs = msg->msg_iter.nr_segs; + orig_iov = msg->msg_iter.iov; + msg_ready = false; + record_len = 0; + + while (1) { + err = vsock_wait_data(sk, &wait, timeout, NULL, 0); + + if (err <= 0) { + /* In case of any loop break(timeout, signal + * interrupt or shutdown), we report user that + * nothing was copied. + */ + err = 0; + break; + } + + if (record_len == 0) { + record_len = + transport->seqpacket_seq_get_len(vsk); + + if (record_len == 0) + continue; + } + + err = transport->seqpacket_dequeue(vsk, msg, flags, &msg_ready); + if (err < 0) { + if (err == -EAGAIN) { + iov_iter_init(&msg->msg_iter, READ, + orig_iov, orig_nr_segs, + len); + /* Clear 'MSG_EOR' here, because dequeue + * callback above set it again if it was + * set by sender. This 'MSG_EOR' is from + * dropped record. + */ + msg->msg_flags &= ~MSG_EOR; + record_len = 0; + continue; + } + + err = -ENOMEM; + break; + } + + if (msg_ready) + break; + } + + if (sk->sk_err) + err = -sk->sk_err; + else if (sk->sk_shutdown & RCV_SHUTDOWN) + err = 0; + + if (msg_ready) { + /* User sets MSG_TRUNC, so return real length of + * packet. + */ + if (flags & MSG_TRUNC) + err = record_len; + else + err = len - msg->msg_iter.count; + + /* 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) @@ -2028,7 +2118,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