From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id E11AA1B327 for ; Fri, 19 Jan 2018 14:46:51 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4745148E97; Fri, 19 Jan 2018 13:46:51 +0000 (UTC) Received: from localhost (ovpn-116-254.ams2.redhat.com [10.36.116.254]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8EF8265600; Fri, 19 Jan 2018 13:46:38 +0000 (UTC) From: Stefan Hajnoczi To: dev@dpdk.org Cc: maxime.coquelin@redhat.com, Yuanhan Liu , wei.w.wang@intel.com, mst@redhat.com, zhiyong.yang@intel.com, jasowang@redhat.com, Stefan Hajnoczi Date: Fri, 19 Jan 2018 13:44:32 +0000 Message-Id: <20180119134444.24927-13-stefanha@redhat.com> In-Reply-To: <20180119134444.24927-1-stefanha@redhat.com> References: <20180119134444.24927-1-stefanha@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 19 Jan 2018 13:46:51 +0000 (UTC) Subject: [dpdk-dev] [RFC 12/24] vhost: move slave_req_fd field to AF_UNIX transport X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Jan 2018 13:46:52 -0000 The slave request file descriptor is specific to the AF_UNIX transport. Move the field out of struct virtio_net and into the trans_af_unix.c private struct vhost_user_connection struct. This change will allow future transports to implement the slave request fd without relying on socket I/O. Signed-off-by: Stefan Hajnoczi --- lib/librte_vhost/vhost.h | 27 ++++++++++++++++++++++++-- lib/librte_vhost/trans_af_unix.c | 41 +++++++++++++++++++++++++++++++++++++++- lib/librte_vhost/vhost.c | 3 ++- lib/librte_vhost/vhost_user.c | 18 +----------------- 4 files changed, 68 insertions(+), 21 deletions(-) diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index ac9ceefb9..60e4d10bd 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -252,6 +252,16 @@ struct vhost_transport_ops { */ int (*socket_start)(struct vhost_user_socket *vsocket); + /** + * Free resources associated with this device. + * + * @param dev + * vhost device + * @param destroy + * 0 on device reset, 1 on full cleanup. + */ + void (*cleanup_device)(struct virtio_net *dev, int destroy); + /** * Notify the guest that used descriptors have been added to the vring. * The VRING_AVAIL_F_NO_INTERRUPT flag has already been checked so this @@ -290,6 +300,21 @@ struct vhost_transport_ops { */ int (*send_slave_req)(struct virtio_net *dev, struct VhostUserMsg *req); + + /** + * Process VHOST_USER_SET_SLAVE_REQ_FD message. After this function + * succeeds send_slave_req() may be called to submit requests to the + * master. + * + * @param dev + * vhost device + * @param msg + * message + * @return + * 0 on success, -1 on failure + */ + int (*set_slave_req_fd)(struct virtio_net *dev, + struct VhostUserMsg *msg); }; /** The traditional AF_UNIX vhost-user protocol transport. */ @@ -331,8 +356,6 @@ struct virtio_net { uint32_t nr_guest_pages; uint32_t max_guest_pages; struct guest_page *guest_pages; - - int slave_req_fd; } __rte_cache_aligned; /* diff --git a/lib/librte_vhost/trans_af_unix.c b/lib/librte_vhost/trans_af_unix.c index 9e5a5c127..7128e121e 100644 --- a/lib/librte_vhost/trans_af_unix.c +++ b/lib/librte_vhost/trans_af_unix.c @@ -57,6 +57,7 @@ struct vhost_user_connection { struct virtio_net device; /* must be the first field! */ struct vhost_user_socket *vsocket; int connfd; + int slave_req_fd; TAILQ_ENTRY(vhost_user_connection) next; }; @@ -173,10 +174,32 @@ af_unix_send_reply(struct virtio_net *dev, struct VhostUserMsg *msg) static int af_unix_send_slave_req(struct virtio_net *dev, struct VhostUserMsg *msg) { - return send_fd_message(dev->slave_req_fd, msg, + struct vhost_user_connection *conn = + container_of(dev, struct vhost_user_connection, device); + + return send_fd_message(conn->slave_req_fd, msg, VHOST_USER_HDR_SIZE + msg->size, NULL, 0); } +static int +af_unix_set_slave_req_fd(struct virtio_net *dev, struct VhostUserMsg *msg) +{ + struct vhost_user_connection *conn = + container_of(dev, struct vhost_user_connection, device); + int fd = msg->fds[0]; + + if (fd < 0) { + RTE_LOG(ERR, VHOST_CONFIG, + "Invalid file descriptor for slave channel (%d)\n", + fd); + return -1; + } + + conn->slave_req_fd = fd; + + return 0; +} + static void vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket) { @@ -194,6 +217,7 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket) conn = container_of(dev, struct vhost_user_connection, device); conn->connfd = fd; + conn->slave_req_fd = -1; conn->vsocket = vsocket; size = strnlen(vsocket->path, PATH_MAX); @@ -657,6 +681,19 @@ af_unix_socket_start(struct vhost_user_socket *vsocket) return vhost_user_start_client(vsocket); } +static void +af_unix_cleanup_device(struct virtio_net *dev __rte_unused, + int destroy __rte_unused) +{ + struct vhost_user_connection *conn = + container_of(dev, struct vhost_user_connection, device); + + if (conn->slave_req_fd >= 0) { + close(conn->slave_req_fd); + conn->slave_req_fd = -1; + } +} + static int af_unix_vring_call(struct virtio_net *dev __rte_unused, struct vhost_virtqueue *vq) @@ -672,7 +709,9 @@ const struct vhost_transport_ops af_unix_trans_ops = { .socket_init = af_unix_socket_init, .socket_cleanup = af_unix_socket_cleanup, .socket_start = af_unix_socket_start, + .cleanup_device = af_unix_cleanup_device, .vring_call = af_unix_vring_call, .send_reply = af_unix_send_reply, .send_slave_req = af_unix_send_slave_req, + .set_slave_req_fd = af_unix_set_slave_req_fd, }; diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c index 1168e137e..0d95a4b3a 100644 --- a/lib/librte_vhost/vhost.c +++ b/lib/librte_vhost/vhost.c @@ -96,6 +96,8 @@ cleanup_device(struct virtio_net *dev, int destroy) for (i = 0; i < dev->nr_vring; i++) cleanup_vq(dev->virtqueue[i], destroy); + + dev->trans_ops->cleanup_device(dev, destroy); } void @@ -286,7 +288,6 @@ vhost_new_device(const struct vhost_transport_ops *trans_ops) vhost_devices[i] = dev; dev->vid = i; - dev->slave_req_fd = -1; dev->trans_ops = trans_ops; return dev; diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index 5f89453bc..ee1b0a1a2 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -96,11 +96,6 @@ vhost_backend_cleanup(struct virtio_net *dev) munmap((void *)(uintptr_t)dev->log_addr, dev->log_size); dev->log_addr = 0; } - - if (dev->slave_req_fd >= 0) { - close(dev->slave_req_fd); - dev->slave_req_fd = -1; - } } /* @@ -1030,18 +1025,7 @@ vhost_user_net_set_mtu(struct virtio_net *dev, struct VhostUserMsg *msg) static int vhost_user_set_req_fd(struct virtio_net *dev, struct VhostUserMsg *msg) { - int fd = msg->fds[0]; - - if (fd < 0) { - RTE_LOG(ERR, VHOST_CONFIG, - "Invalid file descriptor for slave channel (%d)\n", - fd); - return -1; - } - - dev->slave_req_fd = fd; - - return 0; + return dev->trans_ops->set_slave_req_fd(dev, msg); } static int -- 2.14.3