[dpdk-stable] patch 'vhost: fix crash on port deletion' has been queued to LTS release 18.11.7

Kevin Traynor ktraynor at redhat.com
Fri Feb 14 18:03:25 CET 2020


Hi,

FYI, your patch has been queued to LTS release 18.11.7

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

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable-queue

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable-queue/commit/90b5ba739f5b9c89a6cc22f7b40c3b49c4668f5d

Thanks.

Kevin.

---
>From 90b5ba739f5b9c89a6cc22f7b40c3b49c4668f5d Mon Sep 17 00:00:00 2001
From: Zhike Wang <wangzhike at jd.com>
Date: Thu, 16 Jan 2020 10:07:37 +0800
Subject: [PATCH] vhost: fix crash on port deletion

[ upstream commit 499fd8e5b89c2ce65d57875d0a7d67f3a7f2fb6b ]

The vhost_user_read_cb() and rte_vhost_driver_unregister()
can be called at the same time by 2 threads. Eg thread1
calls vhost_user_read_cb() and removes the vsocket from
conn_list, then thread2 calls rte_vhost_driver_unregister()
and frees the vsocket since it is NOT in the conn_list.
So thread1 will access invalid memory when trying to
reconnect.

The fix is to move the "removing of vsocket from conn_list"
to end of the vhost_user_read_cb(), then avoid the race
condition.

The core trace is:
Program terminated with signal 11, Segmentation fault.

Fixes: af1475918124 ("vhost: introduce API to start a specific driver")

Signed-off-by: Zhike Wang <wangzhike at jd.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.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 ea2fdb5529..6a57b27ec0 100644
--- a/lib/librte_vhost/socket.c
+++ b/lib/librte_vhost/socket.c
@@ -311,4 +311,9 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)
 		vhost_destroy_device(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);
@@ -316,9 +321,4 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)
 
 		free(conn);
-
-		if (vsocket->reconnect) {
-			create_unix_socket(vsocket);
-			vhost_user_start_client(vsocket);
-		}
 	}
 }
-- 
2.21.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-02-14 17:02:38.791544931 +0000
+++ 0031-vhost-fix-crash-on-port-deletion.patch	2020-02-14 17:02:37.040406081 +0000
@@ -1 +1 @@
-From 499fd8e5b89c2ce65d57875d0a7d67f3a7f2fb6b Mon Sep 17 00:00:00 2001
+From 90b5ba739f5b9c89a6cc22f7b40c3b49c4668f5d Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 499fd8e5b89c2ce65d57875d0a7d67f3a7f2fb6b ]
+
@@ -22 +23,0 @@
-Cc: stable at dpdk.org
@@ -31 +32 @@
-index 9740fb3403..85c64485c2 100644
+index ea2fdb5529..6a57b27ec0 100644
@@ -34 +35 @@
-@@ -319,4 +319,9 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)
+@@ -311,4 +311,9 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)
@@ -44 +45 @@
-@@ -324,9 +329,4 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)
+@@ -316,9 +321,4 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)



More information about the stable mailing list