[dpdk-stable] patch 'vhost: fix race condition when adding fd in the fdset' has been queued to LTS release 18.11.1

Kevin Traynor ktraynor at redhat.com
Fri Jan 4 14:24:30 CET 2019


Hi,

FYI, your patch has been queued to LTS release 18.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 01/11/19. 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.

Kevin Traynor

---
>From 80a1d99db3eb06e3786223d5422bf37697ddf726 Mon Sep 17 00:00:00 2001
From: Matthias Gatto <matthias.gatto at outscale.com>
Date: Thu, 6 Dec 2018 16:00:07 +0000
Subject: [PATCH] vhost: fix race condition when adding fd in the fdset

[ upstream commit 276d63505be94bb8d5fdf754af0105707ea433c1 ]

fdset_add can call fdset_shrink_nolock which call fdset_move
concurrently to poll that is call in fdset_event_dispatch.

This patch add a mutex to protect poll from been call at the same time
fdset_add call fdset_shrink_nolock.

Fixes: 1b815b89599c ("vhost: try to shrink pfdset when fdset_add fails")

Signed-off-by: Matthias Gatto <matthias.gatto at outscale.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.com>
---
 lib/librte_vhost/fd_man.c | 4 ++++
 lib/librte_vhost/fd_man.h | 1 +
 lib/librte_vhost/socket.c | 1 +
 3 files changed, 6 insertions(+)

diff --git a/lib/librte_vhost/fd_man.c b/lib/librte_vhost/fd_man.c
index 38347ab1d..55d4856f9 100644
--- a/lib/librte_vhost/fd_man.c
+++ b/lib/librte_vhost/fd_man.c
@@ -130,5 +130,7 @@ fdset_add(struct fdset *pfdset, int fd, fd_cb rcb, fd_cb wcb, void *dat)
 	i = pfdset->num < MAX_FDS ? pfdset->num++ : -1;
 	if (i == -1) {
+		pthread_mutex_lock(&pfdset->fd_pooling_mutex);
 		fdset_shrink_nolock(pfdset);
+		pthread_mutex_unlock(&pfdset->fd_pooling_mutex);
 		i = pfdset->num < MAX_FDS ? pfdset->num++ : -1;
 		if (i == -1) {
@@ -247,5 +249,7 @@ fdset_event_dispatch(void *arg)
 		pthread_mutex_unlock(&pfdset->fd_mutex);
 
+		pthread_mutex_lock(&pfdset->fd_pooling_mutex);
 		val = poll(pfdset->rwfds, numfds, 1000 /* millisecs */);
+		pthread_mutex_unlock(&pfdset->fd_pooling_mutex);
 		if (val < 0)
 			continue;
diff --git a/lib/librte_vhost/fd_man.h b/lib/librte_vhost/fd_man.h
index 3331bcd97..3ab5cfdd6 100644
--- a/lib/librte_vhost/fd_man.h
+++ b/lib/librte_vhost/fd_man.h
@@ -25,4 +25,5 @@ struct fdset {
 	struct fdentry fd[MAX_FDS];
 	pthread_mutex_t fd_mutex;
+	pthread_mutex_t fd_pooling_mutex;
 	int num;	/* current fd number of this fdset */
 
diff --git a/lib/librte_vhost/socket.c b/lib/librte_vhost/socket.c
index 01b60ff9e..9cf34ad17 100644
--- a/lib/librte_vhost/socket.c
+++ b/lib/librte_vhost/socket.c
@@ -91,4 +91,5 @@ static struct vhost_user vhost_user = {
 		.fd = { [0 ... MAX_FDS - 1] = {-1, NULL, NULL, NULL, 0} },
 		.fd_mutex = PTHREAD_MUTEX_INITIALIZER,
+		.fd_pooling_mutex = PTHREAD_MUTEX_INITIALIZER,
 		.num = 0
 	},
-- 
2.19.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2019-01-04 13:23:08.614777750 +0000
+++ 0048-vhost-fix-race-condition-when-adding-fd-in-the-fdset.patch	2019-01-04 13:23:07.000000000 +0000
@@ -1,8 +1,10 @@
-From 276d63505be94bb8d5fdf754af0105707ea433c1 Mon Sep 17 00:00:00 2001
+From 80a1d99db3eb06e3786223d5422bf37697ddf726 Mon Sep 17 00:00:00 2001
 From: Matthias Gatto <matthias.gatto at outscale.com>
 Date: Thu, 6 Dec 2018 16:00:07 +0000
 Subject: [PATCH] vhost: fix race condition when adding fd in the fdset
 
+[ upstream commit 276d63505be94bb8d5fdf754af0105707ea433c1 ]
+
 fdset_add can call fdset_shrink_nolock which call fdset_move
 concurrently to poll that is call in fdset_event_dispatch.
 
@@ -10,7 +12,6 @@
 fdset_add call fdset_shrink_nolock.
 
 Fixes: 1b815b89599c ("vhost: try to shrink pfdset when fdset_add fails")
-Cc: stable at dpdk.org
 
 Signed-off-by: Matthias Gatto <matthias.gatto at outscale.com>
 Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.com>


More information about the stable mailing list