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 4A16A1B31F for ; Fri, 19 Jan 2018 14:45:33 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AF4688B10D; Fri, 19 Jan 2018 13:45:32 +0000 (UTC) Received: from localhost (ovpn-116-254.ams2.redhat.com [10.36.116.254]) by smtp.corp.redhat.com (Postfix) with ESMTP id 315EC5D970; Fri, 19 Jan 2018 13:45:21 +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:24 +0000 Message-Id: <20180119134444.24927-5-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.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Fri, 19 Jan 2018 13:45:32 +0000 (UTC) Subject: [dpdk-dev] [RFC 04/24] vhost: move socket_fd and un sockaddr into trans_af_unix.c 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:45:33 -0000 The socket file descriptor and AF_UNIX sockaddr are specific to the AF_UNIX transport, so move them into trans_af_unix.c. In order to do this we need to begin defining the vhost_transport_ops interface that will allow librte_vhost to support multiple transports. This patch adds socket_init() and socket_cleanup() to vhost_transport_ops. Signed-off-by: Stefan Hajnoczi --- lib/librte_vhost/vhost.h | 31 +++++++++++++++++----- lib/librte_vhost/socket.c | 10 ++------ lib/librte_vhost/trans_af_unix.c | 55 ++++++++++++++++++++++++++++++++-------- 3 files changed, 72 insertions(+), 24 deletions(-) diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index e5279a572..3aefe6597 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -12,8 +12,6 @@ #include #include #include -#include -#include /* TODO remove when trans_af_unix.c refactoring is done */ #include #include @@ -205,6 +203,7 @@ struct guest_page { }; struct virtio_net; +struct vhost_user_socket; /** * A structure containing function pointers for transport-specific operations. @@ -213,6 +212,30 @@ struct vhost_transport_ops { /** Size of struct vhost_user_socket-derived per-socket state */ size_t socket_size; + /** + * Initialize a vhost-user socket that is being created by + * rte_vhost_driver_register(). This function checks that the flags + * are valid but does not establish a vhost-user connection. + * + * @param vsocket + * new socket + * @param flags + * flags argument from rte_vhost_driver_register() + * @return + * 0 on success, -1 on failure + */ + int (*socket_init)(struct vhost_user_socket *vsocket, uint64_t flags); + + /** + * Free resources associated with a socket, including any established + * connections. This function calls vhost_destroy_device() to destroy + * established connections for this socket. + * + * @param vsocket + * vhost socket + */ + void (*socket_cleanup)(struct vhost_user_socket *vsocket); + /** * 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 @@ -286,8 +309,6 @@ struct vhost_user_socket { struct vhost_user_connection_list conn_list; pthread_mutex_t conn_mutex; char *path; - int socket_fd; - struct sockaddr_un un; bool is_server; bool reconnect; bool dequeue_zero_copy; @@ -325,14 +346,12 @@ struct vhost_user { extern struct vhost_user vhost_user; -int create_unix_socket(struct vhost_user_socket *vsocket); int vhost_user_start_server(struct vhost_user_socket *vsocket); int vhost_user_start_client(struct vhost_user_socket *vsocket); extern pthread_t reconn_tid; int vhost_user_reconnect_init(void); -bool vhost_user_remove_reconnect(struct vhost_user_socket *vsocket); #define VHOST_LOG_PAGE 4096 diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index fffffc663..78f847ccc 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -191,7 +191,7 @@ rte_vhost_driver_register(const char *path, uint64_t flags) } else { vsocket->is_server = true; } - ret = create_unix_socket(vsocket); + ret = trans_ops->socket_init(vsocket, flags); if (ret < 0) { goto out_mutex; } @@ -231,13 +231,7 @@ rte_vhost_driver_unregister(const char *path) struct vhost_user_socket *vsocket = vhost_user.vsockets[i]; if (!strcmp(vsocket->path, path)) { - if (vsocket->is_server) { - fdset_del(&vhost_user.fdset, vsocket->socket_fd); - close(vsocket->socket_fd); - unlink(path); - } else if (vsocket->reconnect) { - vhost_user_remove_reconnect(vsocket); - } + vsocket->trans_ops->socket_cleanup(vsocket); pthread_mutex_lock(&vsocket->conn_mutex); for (conn = TAILQ_FIRST(&vsocket->conn_list); diff --git a/lib/librte_vhost/trans_af_unix.c b/lib/librte_vhost/trans_af_unix.c index 5e3c5ab2a..cc8d7ccdc 100644 --- a/lib/librte_vhost/trans_af_unix.c +++ b/lib/librte_vhost/trans_af_unix.c @@ -33,6 +33,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +#include +#include #include #include @@ -44,8 +46,11 @@ struct af_unix_socket { struct vhost_user_socket socket; /* must be the first field! */ + int socket_fd; + struct sockaddr_un un; }; +static int create_unix_socket(struct vhost_user_socket *vsocket); static void vhost_user_read_cb(int connfd, void *dat, int *remove); /* return bytes# of read on success or negative val on failure. */ @@ -240,11 +245,13 @@ vhost_user_read_cb(int connfd, void *dat, int *remove) } } -int +static int create_unix_socket(struct vhost_user_socket *vsocket) { + struct af_unix_socket *s = + container_of(vsocket, struct af_unix_socket, socket); int fd; - struct sockaddr_un *un = &vsocket->un; + struct sockaddr_un *un = &s->un; fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) @@ -265,18 +272,20 @@ create_unix_socket(struct vhost_user_socket *vsocket) strncpy(un->sun_path, vsocket->path, sizeof(un->sun_path)); un->sun_path[sizeof(un->sun_path) - 1] = '\0'; - vsocket->socket_fd = fd; + s->socket_fd = fd; return 0; } int vhost_user_start_server(struct vhost_user_socket *vsocket) { + struct af_unix_socket *s = + container_of(vsocket, struct af_unix_socket, socket); int ret; - int fd = vsocket->socket_fd; + int fd = s->socket_fd; const char *path = vsocket->path; - ret = bind(fd, (struct sockaddr *)&vsocket->un, sizeof(vsocket->un)); + ret = bind(fd, (struct sockaddr *)&s->un, sizeof(s->un)); if (ret < 0) { RTE_LOG(ERR, VHOST_CONFIG, "failed to bind to %s: %s; remove it and try again\n", @@ -427,13 +436,15 @@ vhost_user_reconnect_init(void) int vhost_user_start_client(struct vhost_user_socket *vsocket) { + struct af_unix_socket *s = + container_of(vsocket, struct af_unix_socket, socket); int ret; - int fd = vsocket->socket_fd; + int fd = s->socket_fd; const char *path = vsocket->path; struct vhost_user_reconnect *reconn; - ret = vhost_user_connect_nonblock(fd, (struct sockaddr *)&vsocket->un, - sizeof(vsocket->un)); + ret = vhost_user_connect_nonblock(fd, (struct sockaddr *)&s->un, + sizeof(s->un)); if (ret == 0) { vhost_user_add_connection(fd, vsocket); return 0; @@ -456,7 +467,7 @@ vhost_user_start_client(struct vhost_user_socket *vsocket) close(fd); return -1; } - reconn->un = vsocket->un; + reconn->un = s->un; reconn->fd = fd; reconn->vsocket = vsocket; pthread_mutex_lock(&reconn_list.mutex); @@ -466,7 +477,7 @@ vhost_user_start_client(struct vhost_user_socket *vsocket) return 0; } -bool +static bool vhost_user_remove_reconnect(struct vhost_user_socket *vsocket) { int found = false; @@ -490,6 +501,28 @@ vhost_user_remove_reconnect(struct vhost_user_socket *vsocket) return found; } +static int +af_unix_socket_init(struct vhost_user_socket *vsocket, + uint64_t flags __rte_unused) +{ + return create_unix_socket(vsocket); +} + +static void +af_unix_socket_cleanup(struct vhost_user_socket *vsocket) +{ + struct af_unix_socket *s = + container_of(vsocket, struct af_unix_socket, socket); + + if (vsocket->is_server) { + fdset_del(&vhost_user.fdset, s->socket_fd); + close(s->socket_fd); + unlink(vsocket->path); + } else if (vsocket->reconnect) { + vhost_user_remove_reconnect(vsocket); + } +} + static int af_unix_vring_call(struct virtio_net *dev __rte_unused, struct vhost_virtqueue *vq) @@ -501,5 +534,7 @@ af_unix_vring_call(struct virtio_net *dev __rte_unused, const struct vhost_transport_ops af_unix_trans_ops = { .socket_size = sizeof(struct af_unix_socket), + .socket_init = af_unix_socket_init, + .socket_cleanup = af_unix_socket_cleanup, .vring_call = af_unix_vring_call, }; -- 2.14.3