[dpdk-stable] patch 'ipc: stop mp control thread on cleanup' has been queued to stable release 19.11.10
christian.ehrhardt at canonical.com
christian.ehrhardt at canonical.com
Tue Aug 10 17:39:25 CEST 2021
Hi,
FYI, your patch has been queued to stable release 19.11.10
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 08/12/21. 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/cpaelzer/dpdk-stable-queue
This queued commit can be viewed at:
https://github.com/cpaelzer/dpdk-stable-queue/commit/b39b348769f1fe968957001523d57d973ee0eb3c
Thanks.
Christian Ehrhardt <christian.ehrhardt at canonical.com>
---
>From b39b348769f1fe968957001523d57d973ee0eb3c Mon Sep 17 00:00:00 2001
From: David Marchand <david.marchand at redhat.com>
Date: Wed, 7 Jul 2021 13:02:29 +0200
Subject: [PATCH] ipc: stop mp control thread on cleanup
[ upstream commit e7885281ded1dbda63dcf3f6eb3640131113a6eb ]
When calling rte_eal_cleanup, the mp channel cleanup routine only sets
mp_fd to -1 leaving the rte_mp_handle control thread running.
This control thread can spew warnings on reading on an invalid fd.
This is especially noticed with ASAN enabled.
To handle this situation, set mp_fd to -1 to signal the control thread
it should exit, but since this thread might be sleeping on the socket,
cancel the thread too.
Fixes: 85d6815fa6d0 ("eal: close multi-process socket during cleanup")
Reported-by: Owen Hilyard <ohilyard at iol.unh.edu>
Signed-off-by: David Marchand <david.marchand at redhat.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.com>
---
lib/librte_eal/common/eal_common_proc.c | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/lib/librte_eal/common/eal_common_proc.c b/lib/librte_eal/common/eal_common_proc.c
index 922569f3f5..ac2ddb01a5 100644
--- a/lib/librte_eal/common/eal_common_proc.c
+++ b/lib/librte_eal/common/eal_common_proc.c
@@ -34,6 +34,7 @@
#include "eal_internal_cfg.h"
static int mp_fd = -1;
+static pthread_t mp_handle_tid;
static char mp_filter[PATH_MAX]; /* Filter for secondary process sockets */
static char mp_dir_path[PATH_MAX]; /* The directory path for all mp sockets */
static pthread_mutex_t mp_mutex_action = PTHREAD_MUTEX_INITIALIZER;
@@ -376,7 +377,7 @@ mp_handle(void *arg __rte_unused)
struct mp_msg_internal msg;
struct sockaddr_un sa;
- while (1) {
+ while (mp_fd >= 0) {
if (read_msg(&msg, &sa) == 0)
process_msg(&msg, &sa);
}
@@ -560,14 +561,11 @@ open_socket_fd(void)
}
static void
-close_socket_fd(void)
+close_socket_fd(int fd)
{
char path[PATH_MAX];
- if (mp_fd < 0)
- return;
-
- close(mp_fd);
+ close(fd);
create_socket_path(peer_name, path, sizeof(path));
unlink(path);
}
@@ -577,7 +575,6 @@ rte_mp_channel_init(void)
{
char path[PATH_MAX];
int dir_fd;
- pthread_t mp_handle_tid;
/* in no shared files mode, we do not have secondary processes support,
* so no need to initialize IPC.
@@ -636,7 +633,16 @@ rte_mp_channel_init(void)
void
rte_mp_channel_cleanup(void)
{
- close_socket_fd();
+ int fd;
+
+ if (mp_fd < 0)
+ return;
+
+ fd = mp_fd;
+ mp_fd = -1;
+ pthread_cancel(mp_handle_tid);
+ pthread_join(mp_handle_tid, NULL);
+ close_socket_fd(fd);
}
/**
--
2.32.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2021-08-10 15:11:14.776332726 +0200
+++ 0045-ipc-stop-mp-control-thread-on-cleanup.patch 2021-08-10 15:11:13.010638042 +0200
@@ -1 +1 @@
-From e7885281ded1dbda63dcf3f6eb3640131113a6eb Mon Sep 17 00:00:00 2001
+From b39b348769f1fe968957001523d57d973ee0eb3c Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit e7885281ded1dbda63dcf3f6eb3640131113a6eb ]
+
@@ -16 +17,0 @@
-Cc: stable at dpdk.org
@@ -22 +23 @@
- lib/eal/common/eal_common_proc.c | 22 ++++++++++++++--------
+ lib/librte_eal/common/eal_common_proc.c | 22 ++++++++++++++--------
@@ -25,5 +26,5 @@
-diff --git a/lib/eal/common/eal_common_proc.c b/lib/eal/common/eal_common_proc.c
-index dc4a2efa82..ebd0f6673b 100644
---- a/lib/eal/common/eal_common_proc.c
-+++ b/lib/eal/common/eal_common_proc.c
-@@ -35,6 +35,7 @@
+diff --git a/lib/librte_eal/common/eal_common_proc.c b/lib/librte_eal/common/eal_common_proc.c
+index 922569f3f5..ac2ddb01a5 100644
+--- a/lib/librte_eal/common/eal_common_proc.c
++++ b/lib/librte_eal/common/eal_common_proc.c
+@@ -34,6 +34,7 @@
@@ -37 +38 @@
-@@ -383,7 +384,7 @@ mp_handle(void *arg __rte_unused)
+@@ -376,7 +377,7 @@ mp_handle(void *arg __rte_unused)
@@ -46 +47 @@
-@@ -567,14 +568,11 @@ open_socket_fd(void)
+@@ -560,14 +561,11 @@ open_socket_fd(void)
@@ -63 +64 @@
-@@ -584,7 +582,6 @@ rte_mp_channel_init(void)
+@@ -577,7 +575,6 @@ rte_mp_channel_init(void)
@@ -68,2 +68,0 @@
- const struct internal_config *internal_conf =
- eal_get_internal_configuration();
@@ -71 +70,3 @@
-@@ -645,7 +642,16 @@ rte_mp_channel_init(void)
+ /* in no shared files mode, we do not have secondary processes support,
+ * so no need to initialize IPC.
+@@ -636,7 +633,16 @@ rte_mp_channel_init(void)
More information about the stable
mailing list