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

luca.boccassi at gmail.com luca.boccassi at gmail.com
Tue Feb 11 12:22:02 CET 2020


Hi,

FYI, your patch has been queued to stable release 19.11.1

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/13/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.

Thanks.

Luca Boccassi

---
>From a8e274db1b0a8cf241d8a95f4e87174e56eb7ea5 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 785cea46e5..26b9bb5534 100644
--- a/lib/librte_vhost/socket.c
+++ b/lib/librte_vhost/socket.c
@@ -318,16 +318,16 @@ 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);
 		pthread_mutex_unlock(&vsocket->conn_mutex);
 
 		free(conn);
-
-		if (vsocket->reconnect) {
-			create_unix_socket(vsocket);
-			vhost_user_start_client(vsocket);
-		}
 	}
 }
 
-- 
2.20.1

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-02-11 11:17:44.687407231 +0000
+++ 0176-vhost-fix-crash-on-port-deletion.patch	2020-02-11 11:17:38.820009200 +0000
@@ -1,8 +1,10 @@
-From 499fd8e5b89c2ce65d57875d0a7d67f3a7f2fb6b Mon Sep 17 00:00:00 2001
+From a8e274db1b0a8cf241d8a95f4e87174e56eb7ea5 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
@@ -19,7 +21,6 @@
 Program terminated with signal 11, Segmentation fault.
 
 Fixes: af1475918124 ("vhost: introduce API to start a specific driver")
-Cc: stable at dpdk.org
 
 Signed-off-by: Zhike Wang <wangzhike at jd.com>
 Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.com>
@@ -28,7 +29,7 @@
  1 file changed, 5 insertions(+), 5 deletions(-)
 
 diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c
-index 9740fb3403..85c64485c2 100644
+index 785cea46e5..26b9bb5534 100644
 --- a/lib/librte_vhost/socket.c
 +++ b/lib/librte_vhost/socket.c
 @@ -318,16 +318,16 @@ vhost_user_read_cb(int connfd, void *dat, int *remove)


More information about the stable mailing list