when rte_vhost_driver_unregister delete the connection fd, the fd lock will prevent the vsocket to be freed. But when vhost_user_msg_handler return error, it will delete vsocket conn_list. And then the fd lock will become invalid. So the vsocket will be freed in rte_vhost_drivere_unregister and the vhost_user_read_cb will reconnect.
To fix this: move delete vsocket conn after reconnect Cc: sta...@dpdk.org Signed-off-by: Qiang Zhou <zhouqiang2...@gmail.com> --- lib/librte_vhost/socket.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c index d63031747..43da1c51b 100644 --- a/lib/librte_vhost/socket.c +++ b/lib/librte_vhost/socket.c @@ -293,16 +293,16 @@ vhost_user_read_cb(int connfd, void *dat, int *remove) if (vsocket->notify_ops->destroy_connection) vsocket->notify_ops->destroy_connection(conn->vid); + if (vsocket->reconnect) { + create_unix_socket(vsocket); + vhost_user_start_client(vsocket); + } + pthread_mutex_lock(&vsocket->conn_mutex); TAILQ_REMOVE(&vsocket->conn_list, conn, next); pthread_mutex_unlock(&vsocket->conn_mutex); free(conn); - - if (vsocket->reconnect) { - create_unix_socket(vsocket); - vhost_user_start_client(vsocket); - } } } -- 2.14.3 (Apple Git-98)