Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp1172313pxj; Sat, 8 May 2021 09:37:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwdBFDEN5R6cJM3l9e38j1zFEp/NaiAhbCMox4171l6W26Rn6QvWhXZZ1ShZsaTNVBbk42E X-Received: by 2002:a17:906:cf82:: with SMTP id um2mr16505832ejb.322.1620491842539; Sat, 08 May 2021 09:37:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620491842; cv=none; d=google.com; s=arc-20160816; b=jTDolJs1ke4HBPjnB6J0V6wUqEdizF7S6QQqc8LuXdP/8QeaLne7VFNPdhNzyYN6bd cPm2TmBhuFNYnKhjy60bbkdXlFu+rAJfxbmeRJ56qVa4ImrlU7ggjTUFkkIgEnVEQxG7 FCN7immBnxLCkHY7Ce8QxcaMJMCZXjzsZw5cjsrxG43wqZE6dEbcnThjgG/hGGybflVh LhW5/Fw9gvLSMBzacxQ4Hm75cEAI9k5YC1bBD+/qUbb5fNOnRjnmTRlbupQQnqZnah5d 61esBK1ZaQ6B6s5phluf58lI2zNFpHZuo5OcNw99E6EX9J1R2WqoSvL+kCkgCjU17/8M 1r6A== 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=2Y2niApHyPHcT7i4OgWRwvAui8VIbHAecO7yLRMX4QQ=; b=vrCobCzT8otg3cVIuwUozMfoAVM2Zs+v9na7lBvwDGaS+xDw7QEVO5f5sArh1J0TqF JFmrGwzv5MzuuqLhfUXS4jdKQ5pA56oGdlZd7DauYSnRNMJvndfHDvtR3suwj1S3pYzg enfTZusm5e98N2FhXlq1Ez+m8bFIGG5J44lMaAu6pZFcvb1fm3+G3dvzgBMZTKdXH0K8 ayjRX3UJVIVEKdsA0lhHpbje9KwWTBdo4Svnv2Z6aVcvOmeAP1/jFPdTqc+rQa1rtOGq D5dnNZ8xiJGDTGNQgTCYGBh8FUu6LsYGwjvOm+CgAdd8AYvhwbd2m+r6QXFOjeQ7Z/i8 4vMA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kaspersky.com header.s=mail202102 header.b=Kmp4YCmF; 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 h19si6403531ejq.26.2021.05.08.09.36.59; Sat, 08 May 2021 09:37:22 -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=Kmp4YCmF; 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 S230009AbhEHQgr (ORCPT + 99 others); Sat, 8 May 2021 12:36:47 -0400 Received: from mx12.kaspersky-labs.com ([91.103.66.155]:45033 "EHLO mx12.kaspersky-labs.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230035AbhEHQgn (ORCPT ); Sat, 8 May 2021 12:36:43 -0400 Received: from relay12.kaspersky-labs.com (unknown [127.0.0.10]) by relay12.kaspersky-labs.com (Postfix) with ESMTP id BD35276F14; Sat, 8 May 2021 19:35:34 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kaspersky.com; s=mail202102; t=1620491734; bh=2Y2niApHyPHcT7i4OgWRwvAui8VIbHAecO7yLRMX4QQ=; h=From:To:Subject:Date:Message-ID:MIME-Version:Content-Type; b=Kmp4YCmFsNAyvdMUnL6CW6kf7o9HCR21EaYOOiYTA80zfeNsMrLhpJVFD/UMLzB4w +cp+CsTBj1JtvQYg4VwoBPfZVI12mn1IR/oQZlNZLNCuNQDzmsEpRaeV7g72H2/66S 7HS9BVyDWN/to57utxWvGhQJxd+XYmWyM6GDPSXhvckIqEZrJAhr50Zz9ZtjmM2Abf sHorMVihs+iq89FvyGEOWRNs9kzNgzYZGfvNrNooSptws0sCOZGqtzouXB06qC3CkV atYrjQoeIfh52FupSPGocvvg89cDIq2Z90evbbeQVr5I7sakEg3EVXT5GuFnUR6WPh s5x98aWAm0GPg== 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 mailhub12.kaspersky-labs.com (Postfix) with ESMTPS id 855B276F01; Sat, 8 May 2021 19:35:34 +0300 (MSK) Received: from arseniy-pc.avp.ru (10.64.68.128) 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; Sat, 8 May 2021 19:35:34 +0300 From: Arseny Krasnov To: Stefan Hajnoczi , Stefano Garzarella , "Michael S. Tsirkin" , Jason Wang , "David S. Miller" , Jakub Kicinski , Arseny Krasnov , Jorgen Hansen , Andra Paraschiv , Colin Ian King , Norbert Slusarek CC: , , , , , Subject: [RFC PATCH v9 11/19] virtio/vsock: dequeue callback for SOCK_SEQPACKET Date: Sat, 8 May 2021 19:35:20 +0300 Message-ID: <20210508163523.3431999-1-arseny.krasnov@kaspersky.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210508163027.3430238-1-arseny.krasnov@kaspersky.com> References: <20210508163027.3430238-1-arseny.krasnov@kaspersky.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.64.68.128] X-ClientProxiedBy: hqmailmbx1.avp.ru (10.64.67.241) 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/08/2021 16:27:11 X-KSE-AntiSpam-Status: KAS_STATUS_NOT_DETECTED X-KSE-AntiSpam-Method: none X-KSE-AntiSpam-Rate: 10 X-KSE-AntiSpam-Info: Lua profiles 163552 [May 08 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: 445 445 d5f7ae5578b0f01c45f955a2a751ac25953290c9 X-KSE-AntiSpam-Info: {Prob_from_in_msgid} X-KSE-AntiSpam-Info: {Tracking_from_domain_doesnt_match_to} X-KSE-AntiSpam-Info: 127.0.0.199:7.1.2;d41d8cd98f00b204e9800998ecf8427e.com:7.1.1;arseniy-pc.avp.ru:7.1.1;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/08/2021 16:29: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: 08.05.2021 12:32: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/08 15:50:00 X-KLMS-AntiVirus: Kaspersky Security for Linux Mail Server, version 8.0.3.30, bases: 2021/05/08 12:32:00 #16600610 X-KLMS-AntiVirus-Status: Clean, skipped Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds transport callback and it's logic for SEQPACKET dequeue. Callback fetches RW packets from rx queue of socket until whole record is copied(if user's buffer is full, user is not woken up). This is done to not stall sender, because if we wake up user and it leaves syscall, nobody will send credit update for rest of record, and sender will wait for next enter of read syscall at receiver's side. So if user buffer is full, we just send credit update and drop data. Signed-off-by: Arseny Krasnov --- v8 -> v9: 1) Check for RW packet type is removed from loop(all packet now considered RW). 2) Locking in loop is fixed. 3) cpu_to_le32()/le32_to_cpu() now used. 4) MSG_TRUNC handling removed from transport. include/linux/virtio_vsock.h | 5 ++ net/vmw_vsock/virtio_transport_common.c | 64 +++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h index dc636b727179..02acf6e9ae04 100644 --- a/include/linux/virtio_vsock.h +++ b/include/linux/virtio_vsock.h @@ -80,6 +80,11 @@ virtio_transport_dgram_dequeue(struct vsock_sock *vsk, struct msghdr *msg, size_t len, int flags); +ssize_t +virtio_transport_seqpacket_dequeue(struct vsock_sock *vsk, + struct msghdr *msg, + int flags, + bool *msg_ready); s64 virtio_transport_stream_has_data(struct vsock_sock *vsk); s64 virtio_transport_stream_has_space(struct vsock_sock *vsk); diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index ad0d34d41444..f649a21dd23b 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c @@ -393,6 +393,58 @@ virtio_transport_stream_do_dequeue(struct vsock_sock *vsk, return err; } +static int virtio_transport_seqpacket_do_dequeue(struct vsock_sock *vsk, + struct msghdr *msg, + int flags, + bool *msg_ready) +{ + struct virtio_vsock_sock *vvs = vsk->trans; + struct virtio_vsock_pkt *pkt; + int err = 0; + size_t user_buf_len = msg->msg_iter.count; + + *msg_ready = false; + spin_lock_bh(&vvs->rx_lock); + + while (!*msg_ready && !list_empty(&vvs->rx_queue) && err >= 0) { + size_t bytes_to_copy; + size_t pkt_len; + + pkt = list_first_entry(&vvs->rx_queue, struct virtio_vsock_pkt, list); + pkt_len = (size_t)le32_to_cpu(pkt->hdr.len); + bytes_to_copy = min(user_buf_len, pkt_len); + + if (bytes_to_copy) { + /* sk_lock is held by caller so no one else can dequeue. + * Unlock rx_lock since memcpy_to_msg() may sleep. + */ + spin_unlock_bh(&vvs->rx_lock); + + if (memcpy_to_msg(msg, pkt->buf, bytes_to_copy)) { + err = -EINVAL; + } else { + err += pkt_len; + user_buf_len -= bytes_to_copy; + } + + spin_lock_bh(&vvs->rx_lock); + } + + if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOR) + *msg_ready = true; + + virtio_transport_dec_rx_pkt(vvs, pkt); + list_del(&pkt->list); + virtio_transport_free_pkt(pkt); + } + + spin_unlock_bh(&vvs->rx_lock); + + virtio_transport_send_credit_update(vsk); + + return err; +} + ssize_t virtio_transport_stream_dequeue(struct vsock_sock *vsk, struct msghdr *msg, @@ -405,6 +457,18 @@ virtio_transport_stream_dequeue(struct vsock_sock *vsk, } EXPORT_SYMBOL_GPL(virtio_transport_stream_dequeue); +ssize_t +virtio_transport_seqpacket_dequeue(struct vsock_sock *vsk, + struct msghdr *msg, + int flags, bool *msg_ready) +{ + if (flags & MSG_PEEK) + return -EOPNOTSUPP; + + return virtio_transport_seqpacket_do_dequeue(vsk, msg, flags, msg_ready); +} +EXPORT_SYMBOL_GPL(virtio_transport_seqpacket_dequeue); + int virtio_transport_dgram_dequeue(struct vsock_sock *vsk, struct msghdr *msg, -- 2.25.1