From patchwork Wed Jun 19 15:14:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nikos Dragazis X-Patchwork-Id: 54958 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DDA111C3A3; Wed, 19 Jun 2019 17:15:47 +0200 (CEST) Received: from mx0.arrikto.com (mx0.arrikto.com [212.71.252.59]) by dpdk.org (Postfix) with ESMTP id ECC6E1C388 for ; Wed, 19 Jun 2019 17:15:37 +0200 (CEST) Received: from troi.prod.arr (mail.arr [10.99.0.5]) by mx0.arrikto.com (Postfix) with ESMTP id BC560182008; Wed, 19 Jun 2019 18:15:37 +0300 (EEST) Received: from localhost.localdomain (unknown [10.89.50.133]) by troi.prod.arr (Postfix) with ESMTPSA id 2350B32C; Wed, 19 Jun 2019 18:15:37 +0300 (EEST) From: Nikos Dragazis To: dev@dpdk.org Cc: Maxime Coquelin , Tiwei Bie , Zhihong Wang , Stefan Hajnoczi , Wei Wang , Stojaczyk Dariusz , Vangelis Koukis Date: Wed, 19 Jun 2019 18:14:29 +0300 Message-Id: <1560957293-17294-5-git-send-email-ndragazis@arrikto.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1560957293-17294-1-git-send-email-ndragazis@arrikto.com> References: <1560957293-17294-1-git-send-email-ndragazis@arrikto.com> Subject: [dpdk-dev] [PATCH 04/28] vhost: move socket fd and un sockaddr 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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: Nikos Dragazis Signed-off-by: Stefan Hajnoczi --- lib/librte_vhost/socket.c | 11 ++------ lib/librte_vhost/trans_af_unix.c | 55 ++++++++++++++++++++++++++++++++-------- lib/librte_vhost/vhost.h | 30 ++++++++++++++++++---- 3 files changed, 72 insertions(+), 24 deletions(-) diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index 60d3546..3b5608c 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -408,7 +408,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; } @@ -480,14 +480,7 @@ rte_vhost_driver_unregister(const char *path) } pthread_mutex_unlock(&vsocket->conn_mutex); - 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_destroy(&vsocket->conn_mutex); vhost_user_socket_mem_free(vsocket); diff --git a/lib/librte_vhost/trans_af_unix.c b/lib/librte_vhost/trans_af_unix.c index 4de2579..f23bb9c 100644 --- a/lib/librte_vhost/trans_af_unix.c +++ b/lib/librte_vhost/trans_af_unix.c @@ -4,6 +4,8 @@ * Copyright(c) 2019 Arrikto Inc. */ +#include +#include #include #include @@ -15,8 +17,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); /* @@ -244,11 +249,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 *af_vsocket = + container_of(vsocket, struct af_unix_socket, socket); int fd; - struct sockaddr_un *un = &vsocket->un; + struct sockaddr_un *un = &af_vsocket->un; fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) @@ -269,15 +276,17 @@ 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; + af_vsocket->socket_fd = fd; return 0; } int vhost_user_start_server(struct vhost_user_socket *vsocket) { + struct af_unix_socket *af_vsocket = + container_of(vsocket, struct af_unix_socket, socket); int ret; - int fd = vsocket->socket_fd; + int fd = af_vsocket->socket_fd; const char *path = vsocket->path; /* @@ -290,7 +299,7 @@ vhost_user_start_server(struct vhost_user_socket *vsocket) * The user must ensure that the socket does not exist before * registering the vhost driver in server mode. */ - ret = bind(fd, (struct sockaddr *)&vsocket->un, sizeof(vsocket->un)); + ret = bind(fd, (struct sockaddr *)&af_vsocket->un, sizeof(af_vsocket->un)); if (ret < 0) { RTE_LOG(ERR, VHOST_CONFIG, "failed to bind to %s: %s; remove it and try again\n", @@ -432,13 +441,15 @@ vhost_user_reconnect_init(void) int vhost_user_start_client(struct vhost_user_socket *vsocket) { + struct af_unix_socket *af_vsocket = + container_of(vsocket, struct af_unix_socket, socket); int ret; - int fd = vsocket->socket_fd; + int fd = af_vsocket->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 *)&af_vsocket->un, + sizeof(af_vsocket->un)); if (ret == 0) { vhost_user_add_connection(fd, vsocket); return 0; @@ -461,7 +472,7 @@ vhost_user_start_client(struct vhost_user_socket *vsocket) close(fd); return -1; } - reconn->un = vsocket->un; + reconn->un = af_vsocket->un; reconn->fd = fd; reconn->vsocket = vsocket; pthread_mutex_lock(&reconn_list.mutex); @@ -471,7 +482,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; @@ -496,6 +507,28 @@ vhost_user_remove_reconnect(struct vhost_user_socket *vsocket) } 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 *af_vsocket = + container_of(vsocket, struct af_unix_socket, socket); + + if (vsocket->is_server) { + fdset_del(&vhost_user.fdset, af_vsocket->socket_fd); + close(af_vsocket->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) { @@ -506,5 +539,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, }; diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 9615392..40b5c25 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -14,7 +14,6 @@ #include #include #include -#include /* TODO remove when trans_af_unix.c refactoring is done */ #include #include @@ -291,6 +290,7 @@ struct guest_page { }; struct virtio_net; +struct vhost_user_socket; /** * A structure containing function pointers for transport-specific operations. @@ -300,6 +300,30 @@ struct vhost_transport_ops { 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 and event idx have already been checked * so this function just needs to perform the notification. @@ -387,8 +411,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; @@ -436,14 +458,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); static __rte_always_inline bool vq_is_packed(struct virtio_net *dev)