patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Yuanhan Liu <yuanhan.liu@linux.intel.com>
To: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Cc: Ilya Maximets <i.maximets@samsung.com>, dpdk stable <stable@dpdk.org>
Subject: [dpdk-stable] patch 'vhost: fix fd leaks for vhost-user server mode' has been queued to LTS release 16.11.2
Date: Fri,  7 Apr 2017 16:11:57 +0800	[thread overview]
Message-ID: <1491552724-3034-40-git-send-email-yuanhan.liu@linux.intel.com> (raw)
In-Reply-To: <1491552724-3034-1-git-send-email-yuanhan.liu@linux.intel.com>

Hi,

FYI, your patch has been queued to LTS release 16.11.2

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable
yet. It will be pushed if I get no objections before 04/11/17.
So please shout if anyone has objections.

Thanks.

	--yliu

---
>From 62c9de08e2969c996ecae47954741004db1de3ae Mon Sep 17 00:00:00 2001
From: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Date: Mon, 27 Mar 2017 16:52:15 +0800
Subject: [PATCH] vhost: fix fd leaks for vhost-user server mode

[ upstream commit 65388b43f592e16497af48db69ad5063d6824daf ]

A vhost-user server socket could have many connections, thus many connfd.
However, we currently just use one single int var to store it. Meaning,
it will get overwritten every time a new connection is created.

While this will not create fatal issue as it sounds (since the correct
connfd is closured to the event loop thread by fdset_add), it may cause
fd leaks if a user invokes rte_vhost_driver_unregister before shutting
down all connections: it just closes the recent connfd.

A simple example that should be able to reproduce this leaks issues is,
del the ovs vhost-user port while the connected VMs are still alive. (Note
that it's suggested to use one socket for one VM, which makes the issue
not that fatal as it sounds again).

Since we already use a struct "vhost_user_connection" to track all info
about one connection, it's obvious that we should put the connfd there.
Then we could build a connection list inside the vhost_user_socket struct,
to represent all connections belong that socket file.

Fixes: 164fd396788d ("vhost: fix unregistering in client mode")
Cc: Ilya Maximets <i.maximets@samsung.com>

Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
---
 lib/librte_vhost/socket.c | 43 +++++++++++++++++++++++++++++++++----------
 1 file changed, 33 insertions(+), 10 deletions(-)

diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c
index 6a30a31..2afde98 100644
--- a/lib/librte_vhost/socket.c
+++ b/lib/librte_vhost/socket.c
@@ -52,14 +52,18 @@
 #include "vhost.h"
 #include "vhost_user.h"
 
+
+TAILQ_HEAD(vhost_user_connection_list, vhost_user_connection);
+
 /*
  * Every time rte_vhost_driver_register() is invoked, an associated
  * vhost_user_socket struct will be created.
  */
 struct vhost_user_socket {
+	struct vhost_user_connection_list conn_list;
+	pthread_mutex_t conn_mutex;
 	char *path;
 	int listenfd;
-	int connfd;
 	bool is_server;
 	bool reconnect;
 	bool dequeue_zero_copy;
@@ -67,7 +71,10 @@ struct vhost_user_socket {
 
 struct vhost_user_connection {
 	struct vhost_user_socket *vsocket;
+	int connfd;
 	int vid;
+
+	TAILQ_ENTRY(vhost_user_connection) next;
 };
 
 #define MAX_VHOST_SOCKET 1024
@@ -209,19 +216,23 @@ vhost_user_add_connection(int fd, struct vhost_user_socket *vsocket)
 
 	RTE_LOG(INFO, VHOST_CONFIG, "new device, handle is %d\n", vid);
 
-	vsocket->connfd = fd;
+	conn->connfd = fd;
 	conn->vsocket = vsocket;
 	conn->vid = vid;
 	ret = fdset_add(&vhost_user.fdset, fd, vhost_user_read_cb,
 			NULL, conn);
 	if (ret < 0) {
-		vsocket->connfd = -1;
+		conn->connfd = -1;
 		free(conn);
 		close(fd);
 		RTE_LOG(ERR, VHOST_CONFIG,
 			"failed to add fd %d into vhost server fdset\n",
 			fd);
 	}
+
+	pthread_mutex_lock(&vsocket->conn_mutex);
+	TAILQ_INSERT_TAIL(&vsocket->conn_list, conn, next);
+	pthread_mutex_unlock(&vsocket->conn_mutex);
 }
 
 /* call back when there is new vhost-user connection from client  */
@@ -247,10 +258,14 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)
 
 	ret = vhost_user_msg_handler(conn->vid, connfd);
 	if (ret < 0) {
-		vsocket->connfd = -1;
 		close(connfd);
 		*remove = 1;
 		vhost_destroy_device(conn->vid);
+
+		pthread_mutex_lock(&vsocket->conn_mutex);
+		TAILQ_REMOVE(&vsocket->conn_list, conn, next);
+		pthread_mutex_unlock(&vsocket->conn_mutex);
+
 		free(conn);
 
 		if (vsocket->reconnect)
@@ -502,7 +517,8 @@ rte_vhost_driver_register(const char *path, uint64_t flags)
 		goto out;
 	memset(vsocket, 0, sizeof(struct vhost_user_socket));
 	vsocket->path = strdup(path);
-	vsocket->connfd = -1;
+	TAILQ_INIT(&vsocket->conn_list);
+	pthread_mutex_init(&vsocket->conn_mutex, NULL);
 	vsocket->dequeue_zero_copy = flags & RTE_VHOST_USER_DEQUEUE_ZERO_COPY;
 
 	if ((flags & RTE_VHOST_USER_CLIENT) != 0) {
@@ -565,7 +581,7 @@ rte_vhost_driver_unregister(const char *path)
 {
 	int i;
 	int count;
-	struct vhost_user_connection *conn;
+	struct vhost_user_connection *conn, *next;
 
 	pthread_mutex_lock(&vhost_user.mutex);
 
@@ -581,15 +597,22 @@ rte_vhost_driver_unregister(const char *path)
 				vhost_user_remove_reconnect(vsocket);
 			}
 
-			conn = fdset_del(&vhost_user.fdset, vsocket->connfd);
-			if (conn) {
+			pthread_mutex_lock(&vsocket->conn_mutex);
+			for (conn = TAILQ_FIRST(&vsocket->conn_list);
+			     conn != NULL;
+			     conn = next) {
+				next = TAILQ_NEXT(conn, next);
+
+				fdset_del(&vhost_user.fdset, conn->connfd);
 				RTE_LOG(INFO, VHOST_CONFIG,
 					"free connfd = %d for device '%s'\n",
-					vsocket->connfd, path);
-				close(vsocket->connfd);
+					conn->connfd, path);
+				close(conn->connfd);
 				vhost_destroy_device(conn->vid);
+				TAILQ_REMOVE(&vsocket->conn_list, conn, next);
 				free(conn);
 			}
+			pthread_mutex_unlock(&vsocket->conn_mutex);
 
 			free(vsocket->path);
 			free(vsocket);
-- 
1.9.0

  parent reply	other threads:[~2017-04-07  8:15 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-07  8:11 [dpdk-stable] patch 'pci: fix device registration on FreeBSD' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'kni: fix build with kernel 4.11' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'vfio: fix disabling INTx' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'vfio: fix secondary process start' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'nic_uio: fix device binding at boot' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'eal/linux: fix build with glibc 2.25' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'examples/ip_fragmentation: fix check of packet type' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'kni: fix build on Suse 12 SP3' " Yuanhan Liu
2017-04-10 10:01   ` Nirmoy Das
2017-04-11 12:38     ` Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/i40e: fix TC bitmap of VEB' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/mlx5: fix VLAN stripping indication' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/i40e: fix compile error' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/bnx2x: fix transmit queue free threshold' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/e1000/base: fix multicast setting in VF' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/mlx5: fix supported packets types' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/ixgbe/base: fix build error' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/ixgbe: fix Rx queue blocking issue' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/ixgbe: fix all queues drop setting of DCB' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/ixgbe: fix multi-queue mode check in SRIOV mode' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'app/testpmd: fix init config for multi-queue " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'app/testpmd: fix TC mapping in DCB init config' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/i40e: fix incorrect packet index reference' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/ixgbevf: set xstats id values' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/pcap: fix using mbuf after freeing it' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/ena: fix return of hash control flushing' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/thunderx: fix 32-bit build' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/thunderx: fix build on FreeBSD' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/mlx4: update link status upon probing with LSC' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/i40e/base: fix potential out of bound array access' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/mlx5: fix reusing Rx/Tx queues' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/ixgbe: fix TC bandwidth setting' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/mlx4: fix returned values upon failed probing' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/mlx5: " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/fm10k: fix pointer cast' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/qede: fix missing UDP protocol in RSS offload types' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'net/mlx5: fix Tx when first segment size is too short' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'vhost: change log levels in client mode' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'vhost: fix multiple queue not enabled for old kernels' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'vhost: fix max queues' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'vhost: fix false sharing' " Yuanhan Liu
2017-04-07  8:11 ` Yuanhan Liu [this message]
2017-04-07  8:11 ` [dpdk-stable] patch 'net/mlx5: fix an uninitialized variable' " Yuanhan Liu
2017-04-07  8:11 ` [dpdk-stable] patch 'mk: fix shell errors when building with clang' " Yuanhan Liu
2017-04-07  8:12 ` [dpdk-stable] patch 'mk: fix lib filtering when linking app' " Yuanhan Liu
2017-04-07  8:12 ` [dpdk-stable] patch 'examples/quota_watermark: fix requirement for 2M pages' " Yuanhan Liu
2017-04-07  8:12 ` [dpdk-stable] patch 'net/vmxnet3: fix queue size changes' " Yuanhan Liu
2017-04-07  8:12 ` [dpdk-stable] patch 'net/virtio-user: fix overflow' " Yuanhan Liu
2017-04-07  8:12 ` [dpdk-stable] patch 'net/virtio: disable LSC interrupt if MSIX not enabled' " Yuanhan Liu

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=1491552724-3034-40-git-send-email-yuanhan.liu@linux.intel.com \
    --to=yuanhan.liu@linux.intel.com \
    --cc=i.maximets@samsung.com \
    --cc=stable@dpdk.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).