From: Stefano Garzarella <sgarzare@redhat.com>
To: netdev@vger.kernel.org
Cc: linux-hyperv@vger.kernel.org,
"K. Y. Srinivasan" <kys@microsoft.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Sasha Levin <sashal@kernel.org>,
linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
"David S. Miller" <davem@davemloft.net>,
virtualization@lists.linux-foundation.org,
Stephen Hemminger <sthemmin@microsoft.com>,
Jason Wang <jasowang@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Haiyang Zhang <haiyangz@microsoft.com>,
Dexuan Cui <decui@microsoft.com>,
Jorgen Hansen <jhansen@vmware.com>
Subject: [RFC PATCH 11/13] vsock: add 'transport_hg' to handle g2h\h2g transports
Date: Fri, 27 Sep 2019 13:27:01 +0200 [thread overview]
Message-ID: <20190927112703.17745-12-sgarzare@redhat.com> (raw)
In-Reply-To: <20190927112703.17745-1-sgarzare@redhat.com>
VMCI transport provides both g2h and h2g behaviors in a single
transport.
We are able to set (or not) the g2h behavior, detecting if we
are in a VMware guest (or not), but the h2g feature is always set.
This prevents to load other h2g transports while we are in a
VMware guest.
This patch adds a new 'transport_hg' to handle this case, reducing
the priority of transports that provide both g2h and h2g
behaviors. A transport that has g2h and h2g features, can be
bypassed by a transport that has only the h2g feature.
Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
---
net/vmw_vsock/af_vsock.c | 29 ++++++++++++++++++++++++-----
1 file changed, 24 insertions(+), 5 deletions(-)
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
index c52203fe52c4..c5f46b8242ce 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -134,6 +134,8 @@ static struct proto vsock_proto = {
static const struct vsock_transport *transport_h2g;
/* Transport used for guest->host communication */
static const struct vsock_transport *transport_g2h;
+/* Transport used for both host->guest and guest->host communication */
+static const struct vsock_transport *transport_hg;
/* Transport used for DGRAM communication */
static const struct vsock_transport *transport_dgram;
static DEFINE_MUTEX(vsock_register_mutex);
@@ -402,10 +404,13 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
vsk->transport = transport_dgram;
break;
case SOCK_STREAM:
- if (vsk->remote_addr.svm_cid > VMADDR_CID_HOST)
+ if (vsk->remote_addr.svm_cid > VMADDR_CID_HOST) {
vsk->transport = transport_h2g;
- else
+ if (!vsk->transport)
+ vsk->transport = transport_hg;
+ } else {
vsk->transport = transport_g2h;
+ }
break;
default:
return -ESOCKTNOSUPPORT;
@@ -423,7 +428,7 @@ static bool vsock_find_cid(unsigned int cid)
if (transport_g2h && cid == transport_g2h->get_local_cid())
return true;
- if (transport_h2g && cid == VMADDR_CID_HOST)
+ if ((transport_h2g || transport_hg) && cid == VMADDR_CID_HOST)
return true;
return false;
@@ -1997,6 +2002,8 @@ static long vsock_dev_do_ioctl(struct file *filp,
cid = transport_g2h->get_local_cid();
else if (transport_h2g)
cid = transport_h2g->get_local_cid();
+ else if (transport_hg)
+ cid = transport_hg->get_local_cid();
if (put_user(cid, p) != 0)
retval = -EFAULT;
@@ -2093,13 +2100,14 @@ EXPORT_SYMBOL_GPL(vsock_core_get_transport);
int vsock_core_register(const struct vsock_transport *t)
{
- const struct vsock_transport *t_h2g, *t_g2h, *t_dgram;
+ const struct vsock_transport *t_h2g, *t_hg, *t_g2h, *t_dgram;
int err = mutex_lock_interruptible(&vsock_register_mutex);
if (err)
return err;
t_h2g = transport_h2g;
+ t_hg = transport_hg;
t_g2h = transport_g2h;
t_dgram = transport_dgram;
@@ -2107,7 +2115,14 @@ int vsock_core_register(const struct vsock_transport *t)
* same transport. We are able to set the G2H feature only if we are
* in a VMware guest, but we are not able to do the same for the host.
*/
- if (t->features & VSOCK_TRANSPORT_F_H2G) {
+ if ((t->features & VSOCK_TRANSPORT_F_H2G) &&
+ (t->features & VSOCK_TRANSPORT_F_G2H)) {
+ if (t_hg) {
+ err = -EBUSY;
+ goto err_busy;
+ }
+ t_hg = t;
+ } else if (t->features & VSOCK_TRANSPORT_F_H2G) {
if (t_h2g) {
err = -EBUSY;
goto err_busy;
@@ -2132,6 +2147,7 @@ int vsock_core_register(const struct vsock_transport *t)
}
transport_h2g = t_h2g;
+ transport_hg = t_hg;
transport_g2h = t_g2h;
transport_dgram = t_dgram;
@@ -2151,6 +2167,9 @@ void vsock_core_unregister(const struct vsock_transport *t)
if (transport_h2g == t)
transport_h2g = NULL;
+ if (transport_hg == t)
+ transport_hg = NULL;
+
if (transport_g2h == t)
transport_g2h = NULL;
--
2.21.0
next prev parent reply other threads:[~2019-09-27 11:28 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-27 11:26 [RFC PATCH 00/13] vsock: add multi-transports support Stefano Garzarella
2019-09-27 11:26 ` [RFC PATCH 01/13] vsock/vmci: remove unused VSOCK_DEFAULT_CONNECT_TIMEOUT Stefano Garzarella
2019-10-09 11:41 ` Stefan Hajnoczi
2019-09-27 11:26 ` [RFC PATCH 02/13] vsock: remove vm_sockets_get_local_cid() Stefano Garzarella
2019-10-09 11:42 ` Stefan Hajnoczi
2019-09-27 11:26 ` [RFC PATCH 03/13] vsock: remove include/linux/vm_sockets.h file Stefano Garzarella
2019-10-09 11:43 ` Stefan Hajnoczi
2019-09-27 11:26 ` [RFC PATCH 04/13] vsock: add 'transport' member in the struct vsock_sock Stefano Garzarella
2019-10-09 11:46 ` Stefan Hajnoczi
2019-09-27 11:26 ` [RFC PATCH 05/13] vsock/virtio: add transport parameter to the virtio_transport_reset_no_sock() Stefano Garzarella
2019-10-09 11:52 ` Stefan Hajnoczi
2019-09-27 11:26 ` [RFC PATCH 06/13] vsock: add 'struct vsock_sock *' param to vsock_core_get_transport() Stefano Garzarella
2019-10-09 11:54 ` Stefan Hajnoczi
2019-10-10 8:50 ` Stefano Garzarella
2019-09-27 11:26 ` [RFC PATCH 07/13] vsock: handle buffer_size sockopts in the core Stefano Garzarella
2019-10-03 20:11 ` Dexuan Cui
2019-10-09 12:30 ` Stefan Hajnoczi
2019-10-10 9:32 ` Stefano Garzarella
2019-10-11 8:27 ` Stefan Hajnoczi
2019-10-11 8:51 ` Stefano Garzarella
2019-09-27 11:26 ` [RFC PATCH 08/13] vsock: move vsock_insert_unbound() in the vsock_create() Stefano Garzarella
2019-10-03 20:17 ` Dexuan Cui
2019-10-09 12:34 ` Stefan Hajnoczi
2019-10-10 9:52 ` Stefano Garzarella
2019-09-27 11:26 ` [RFC PATCH 09/13] hv_sock: set VMADDR_CID_HOST in the hvs_remote_addr_init() Stefano Garzarella
2019-10-03 19:36 ` Dexuan Cui
2019-10-09 12:35 ` Stefan Hajnoczi
2019-09-27 11:27 ` [RFC PATCH 10/13] vsock: add multi-transports support Stefano Garzarella
2019-10-09 13:11 ` Stefan Hajnoczi
2019-10-10 12:55 ` Stefano Garzarella
2019-09-27 11:27 ` Stefano Garzarella [this message]
2019-10-09 9:44 ` [RFC PATCH 11/13] vsock: add 'transport_hg' to handle g2h\h2g transports Stefano Garzarella
2019-10-09 13:16 ` Stefan Hajnoczi
2019-10-10 13:04 ` Stefano Garzarella
2019-09-27 11:27 ` [RFC PATCH 12/13] vsock: prevent transport modules unloading Stefano Garzarella
2019-10-09 13:28 ` Stefan Hajnoczi
2019-09-27 11:27 ` [RFC PATCH 13/13] vsock: fix bind() behaviour taking care of CID Stefano Garzarella
2019-10-09 13:29 ` Stefan Hajnoczi
2019-10-04 0:04 ` [RFC PATCH 00/13] vsock: add multi-transports support Dexuan Cui
2019-10-04 9:16 ` Stefano Garzarella
2019-10-09 13:29 ` Stefan Hajnoczi
2019-10-10 8:45 ` Stefano Garzarella
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190927112703.17745-12-sgarzare@redhat.com \
--to=sgarzare@redhat.com \
--cc=davem@davemloft.net \
--cc=decui@microsoft.com \
--cc=haiyangz@microsoft.com \
--cc=jasowang@redhat.com \
--cc=jhansen@vmware.com \
--cc=kvm@vger.kernel.org \
--cc=kys@microsoft.com \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=sashal@kernel.org \
--cc=stefanha@redhat.com \
--cc=sthemmin@microsoft.com \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).