From nobody Thu May 2 20:49:47 2024 Delivered-To: importer2@patchew.org Received-SPF: pass (zohomail.com: domain of vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; envelope-from=linux-kernel-owner@vger.kernel.org; helo=vger.kernel.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail(p=none dis=none) header.from=bytedance.com ARC-Seal: i=1; a=rsa-sha256; t=1617733942; cv=none; d=zohomail.com; s=zohoarc; b=jgDtNU3Ebw+ba4+ot8vUoM26WDLHTqgCFittvlphJK6cdwwzJohB4ZMJ/+mDqDdnEXLsIJMOzUdEXyUNUciZVTAfVT5AKaw0+HdTxkanWMZ3fh2u/XiAeRL63BqgzgXRZ+A+qW1svUAJnYiAtSQTdA1yTlXhLaauGCfbBRoFH1I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1617733942; h=Cc:Date:From:List-Id:Message-ID:Subject:To; bh=wJYY7GheEfi4pAlAAImgP5+fKrfCF1HoyhnRAbs6anc=; b=byhA8IkMaSf8adArKKe+emODY8GR7HVIRYUV0rZ+T4v1Vt6alV/XGg+18CbZXnfVfHy+FSuXcGD4LaBnZYjnw9B0LyCyVfDLqWwwzq5icgesMWljeKFD7oW/4QbaOewM7W8uN4HK3cAtM2D/NDvUYDYjwMYPX1hN1Vvo3W4A7hk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mx.zohomail.com with SMTP id 161773394207574.52705216391155; Tue, 6 Apr 2021 11:32:22 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237573AbhDFSc3 (ORCPT ); Tue, 6 Apr 2021 14:32:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40488 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233806AbhDFSc1 (ORCPT ); Tue, 6 Apr 2021 14:32:27 -0400 Received: from mail-pf1-x433.google.com (mail-pf1-x433.google.com [IPv6:2607:f8b0:4864:20::433]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 28352C06174A for ; Tue, 6 Apr 2021 11:32:19 -0700 (PDT) Received: by mail-pf1-x433.google.com with SMTP id g15so11066978pfq.3 for ; Tue, 06 Apr 2021 11:32:19 -0700 (PDT) Received: from n124-121-013.byted.org (ec2-54-241-92-238.us-west-1.compute.amazonaws.com. [54.241.92.238]) by smtp.gmail.com with ESMTPSA id h21sm18475139pgi.60.2021.04.06.11.32.17 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 06 Apr 2021 11:32:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=wJYY7GheEfi4pAlAAImgP5+fKrfCF1HoyhnRAbs6anc=; b=AsPYSFuJ/MxoZ8nLlETL64Sw3kAei32+x1lou6DFVApI4YThP4BinxUGubF9lIOmh9 hXNBgWR9accVSmIdjgZ/xCqWWiWUBlijowOOfOWO0BkbaW6jGwiJWts2DvWqPuKVjvC0 ENpX3l/xQkxTPmMMWpRMz/rBBadj+2Or5W1N7CDyISi4PNG8rsMrM13GXA6oEELoF90A YHEq3g/sFQSrdx2BK0cGT87UgC1HZlUawoT37sEc9mSTASaU5GrgqqYgWeHvk7kpbogr QM08+bTmNSE5TSI4ePWZKLYcUf864ZVuTIyQHRjf4qkFcuRMUi3fLvlSd63Q7ZIr7poB Q5Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=wJYY7GheEfi4pAlAAImgP5+fKrfCF1HoyhnRAbs6anc=; b=nzYEIpyW6J3zGJDc2988mTq55bhk64OmVs1ANovtcAPkBoMnp8ubbmngYaENgwoRk1 V3P4zskFfwCjkSIwY8a5vnwgrAS+JUX5lvFTOr8ym+wvnuBcsIHhsBvjaDpWXXMSOwEn C3iqmDI2ltemcMPQO8P8oxC/VLJMzULkIAym4kFBkRrATwhSzi9k1Eb3L4YuDzdkxUyw 6rMvwOEZyDXpJ84ygnozzIwOhblyDLA6DAmhqN1hXL1HqP2aQPANpGxzertAlZ/9/wAX fne3rQXN0Wx/RvXfIBBAqCmdreBsiIih+obOPYC4c7tbm0cELGOObZxnTnbLhMxYD9e3 YWSQ== X-Gm-Message-State: AOAM531M5NJFpSOrtZLx17ZZY6Vsws1UyEb93CeIpLdQds/G8fMuedd2 AmdssIECQ8X6jdRC/Mr0Y/GaNQ== X-Google-Smtp-Source: ABdhPJy4OUn/0jt7U5Nws0G79lY7PqciaCZKw7vcPHC++mlJ+DjJEWqE40lZK/2ll7bJy9zyx2xRYA== X-Received: by 2002:a62:8f4a:0:b029:20a:448e:7018 with SMTP id n71-20020a628f4a0000b029020a448e7018mr28602340pfd.62.1617733938703; Tue, 06 Apr 2021 11:32:18 -0700 (PDT) From: Jiang Wang Cc: virtualization@lists.linux-foundation.org, stefanha@redhat.com, cong.wang@bytedance.com, duanxiongchun@bytedance.com, xieyongji@bytedance.com, "jiang.wang" , "David S. Miller" , Jakub Kicinski , Stefano Garzarella , Jorgen Hansen , Colin Ian King , Norbert Slusarek , Andra Paraschiv , Alexander Popov , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC] vsock: add multiple transports support for dgram Date: Tue, 6 Apr 2021 18:31:09 +0000 Message-Id: <20210406183112.1150657-1-jiang.wang@bytedance.com> X-Mailer: git-send-email 2.11.0 To: unlisted-recipients:; (no To-header on input) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-ZohoMail-DKIM: fail (Header signature does not verify) Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: "jiang.wang" Currently, only VMCI supports dgram sockets. To supported nested VM use case, this patch removes transport_dgram and uses transport_g2h and transport_h2g for dgram too. The transport is assgined when sending every packet and receiving every packet on dgram sockets. Signed-off-by: Jiang Wang --- This patch is not tested. I don't have a VMWare testing environment. Could someone help me to test it?=20 include/net/af_vsock.h | 2 -- net/vmw_vsock/af_vsock.c | 63 +++++++++++++++++++++-----------------= ---- net/vmw_vsock/vmci_transport.c | 20 +++++++++----- 3 files changed, 45 insertions(+), 40 deletions(-) diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h index b1c717286993..aba241e0d202 100644 --- a/include/net/af_vsock.h +++ b/include/net/af_vsock.h @@ -96,8 +96,6 @@ struct vsock_transport_send_notify_data { #define VSOCK_TRANSPORT_F_H2G 0x00000001 /* Transport provides guest->host communication */ #define VSOCK_TRANSPORT_F_G2H 0x00000002 -/* Transport provides DGRAM communication */ -#define VSOCK_TRANSPORT_F_DGRAM 0x00000004 /* Transport provides local (loopback) communication */ #define VSOCK_TRANSPORT_F_LOCAL 0x00000008 =20 diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 92a72f0e0d94..7739ab2521a1 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c @@ -449,8 +449,6 @@ int vsock_assign_transport(struct vsock_sock *vsk, stru= ct vsock_sock *psk) =20 switch (sk->sk_type) { case SOCK_DGRAM: - new_transport =3D transport_dgram; - break; case SOCK_STREAM: if (vsock_use_local_transport(remote_cid)) new_transport =3D transport_local; @@ -1096,7 +1094,6 @@ static int vsock_dgram_sendmsg(struct socket *sock, s= truct msghdr *msg, struct sock *sk; struct vsock_sock *vsk; struct sockaddr_vm *remote_addr; - const struct vsock_transport *transport; =20 if (msg->msg_flags & MSG_OOB) return -EOPNOTSUPP; @@ -1108,25 +1105,30 @@ static int vsock_dgram_sendmsg(struct socket *sock,= struct msghdr *msg, =20 lock_sock(sk); =20 - transport =3D vsk->transport; - err =3D vsock_auto_bind(vsk); if (err) goto out; =20 - /* If the provided message contains an address, use that. Otherwise * fall back on the socket's remote handle (if it has been connected). */ if (msg->msg_name && vsock_addr_cast(msg->msg_name, msg->msg_namelen, &remote_addr) =3D=3D 0) { + vsock_addr_init(&vsk->remote_addr, remote_addr->svm_cid, + remote_addr->svm_port); + + err =3D vsock_assign_transport(vsk, NULL); + if (err) { + err =3D -EINVAL; + goto out; + } + /* Ensure this address is of the right type and is a valid * destination. */ - if (remote_addr->svm_cid =3D=3D VMADDR_CID_ANY) - remote_addr->svm_cid =3D transport->get_local_cid(); + remote_addr->svm_cid =3D vsk->transport->get_local_cid(); =20 if (!vsock_addr_bound(remote_addr)) { err =3D -EINVAL; @@ -1136,7 +1138,7 @@ static int vsock_dgram_sendmsg(struct socket *sock, s= truct msghdr *msg, remote_addr =3D &vsk->remote_addr; =20 if (remote_addr->svm_cid =3D=3D VMADDR_CID_ANY) - remote_addr->svm_cid =3D transport->get_local_cid(); + remote_addr->svm_cid =3D vsk->transport->get_local_cid(); =20 /* XXX Should connect() or this function ensure remote_addr is * bound? @@ -1150,13 +1152,13 @@ static int vsock_dgram_sendmsg(struct socket *sock,= struct msghdr *msg, goto out; } =20 - if (!transport->dgram_allow(remote_addr->svm_cid, + if (!vsk->transport->dgram_allow(remote_addr->svm_cid, remote_addr->svm_port)) { err =3D -EINVAL; goto out; } =20 - err =3D transport->dgram_enqueue(vsk, remote_addr, msg, len); + err =3D vsk->transport->dgram_enqueue(vsk, remote_addr, msg, len); =20 out: release_sock(sk); @@ -1191,13 +1193,20 @@ static int vsock_dgram_connect(struct socket *sock, if (err) goto out; =20 + memcpy(&vsk->remote_addr, remote_addr, sizeof(vsk->remote_addr)); + + err =3D vsock_assign_transport(vsk, NULL); + if (err) { + err =3D -EINVAL; + goto out; + } + if (!vsk->transport->dgram_allow(remote_addr->svm_cid, remote_addr->svm_port)) { err =3D -EINVAL; goto out; } =20 - memcpy(&vsk->remote_addr, remote_addr, sizeof(vsk->remote_addr)); sock->state =3D SS_CONNECTED; =20 out: @@ -1209,6 +1218,16 @@ static int vsock_dgram_recvmsg(struct socket *sock, = struct msghdr *msg, size_t len, int flags) { struct vsock_sock *vsk =3D vsock_sk(sock->sk); + long timeo; + + timeo =3D sock_rcvtimeo(sock->sk, flags & MSG_DONTWAIT); + do { + if (vsk->transport) + break; + } while (timeo && !vsk->transport); + + if (!vsk->transport) + return -EAGAIN; =20 return vsk->transport->dgram_dequeue(vsk, msg, len, flags); } @@ -2055,14 +2074,6 @@ static int vsock_create(struct net *net, struct sock= et *sock, =20 vsk =3D vsock_sk(sk); =20 - if (sock->type =3D=3D SOCK_DGRAM) { - ret =3D vsock_assign_transport(vsk, NULL); - if (ret < 0) { - sock_put(sk); - return ret; - } - } - vsock_insert_unbound(vsk); =20 return 0; @@ -2182,7 +2193,7 @@ EXPORT_SYMBOL_GPL(vsock_core_get_transport); =20 int vsock_core_register(const struct vsock_transport *t, int features) { - const struct vsock_transport *t_h2g, *t_g2h, *t_dgram, *t_local; + const struct vsock_transport *t_h2g, *t_g2h, *t_local; int err =3D mutex_lock_interruptible(&vsock_register_mutex); =20 if (err) @@ -2190,7 +2201,6 @@ int vsock_core_register(const struct vsock_transport = *t, int features) =20 t_h2g =3D transport_h2g; t_g2h =3D transport_g2h; - t_dgram =3D transport_dgram; t_local =3D transport_local; =20 if (features & VSOCK_TRANSPORT_F_H2G) { @@ -2209,14 +2219,6 @@ int vsock_core_register(const struct vsock_transport= *t, int features) t_g2h =3D t; } =20 - if (features & VSOCK_TRANSPORT_F_DGRAM) { - if (t_dgram) { - err =3D -EBUSY; - goto err_busy; - } - t_dgram =3D t; - } - if (features & VSOCK_TRANSPORT_F_LOCAL) { if (t_local) { err =3D -EBUSY; @@ -2227,7 +2229,6 @@ int vsock_core_register(const struct vsock_transport = *t, int features) =20 transport_h2g =3D t_h2g; transport_g2h =3D t_g2h; - transport_dgram =3D t_dgram; transport_local =3D t_local; =20 err_busy: diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index 8b65323207db..42ea2a1c92ce 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c @@ -613,6 +613,7 @@ static int vmci_transport_recv_dgram_cb(void *data, str= uct vmci_datagram *dg) size_t size; struct sk_buff *skb; struct vsock_sock *vsk; + int err; =20 sk =3D (struct sock *)data; =20 @@ -629,6 +630,17 @@ static int vmci_transport_recv_dgram_cb(void *data, st= ruct vmci_datagram *dg) if (!vmci_transport_allow_dgram(vsk, dg->src.context)) return VMCI_ERROR_NO_ACCESS; =20 + vsock_addr_init(&vsk->remote_addr, dg->src.context, + dg->src.resource); + + bh_lock_sock(sk); + if (!sock_owned_by_user(sk)) { + err =3D vsock_assign_transport(vsk, NULL); + if (err) + return err; + } + bh_unlock_sock(sk); + size =3D VMCI_DG_SIZE(dg); =20 /* Attach the packet to the socket's receive queue as an sk_buff. */ @@ -2093,13 +2105,7 @@ static int __init vmci_transport_init(void) goto err_destroy_stream_handle; } =20 - /* Register only with dgram feature, other features (H2G, G2H) will be - * registered when the first host or guest becomes active. - */ - err =3D vsock_core_register(&vmci_transport, VSOCK_TRANSPORT_F_DGRAM); - if (err < 0) - goto err_unsubscribe; - + /* H2G, G2H will be registered when the first host or guest becomes activ= e. */ err =3D vmci_register_vsock_callback(vmci_vsock_transport_cb); if (err < 0) goto err_unregister; --=20 2.11.0