c64a48b95f
Pull in latest upstream post-tag commits * Patches 0001-0015 are from https://github.com/openSUSE/multipath-tools/tree/queue and are already queued for upstream Rename files * Previous patches 0001-0010 and now patches 0016-0025
86 lines
2.9 KiB
Diff
86 lines
2.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Martin Wilck <mwilck@suse.com>
|
|
Date: Wed, 12 May 2021 23:06:51 +0200
|
|
Subject: [PATCH] multipathd: fix compilation issue with liburcu < 0.8
|
|
|
|
To avoid race conditions with pending RCU callbacks on exit, it's
|
|
necessary to call rcu_barrier() in cleanup_rcu() (see
|
|
https://lists.lttng.org/pipermail/lttng-dev/2021-May/029958.html and
|
|
follow-ups).
|
|
|
|
rcu_barrier() is only available in User-space RCU v0.8 and newer.
|
|
Fix it by reverting 5d0dae6 ("multipathd: Fix liburcu memory leak")
|
|
if an older version of liburcu is detected.
|
|
|
|
Fixes: 5d0dae6 ("multipathd: Fix liburcu memory leak")
|
|
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
---
|
|
multipathd/Makefile | 2 ++
|
|
multipathd/main.c | 17 +++++++++++++++--
|
|
2 files changed, 17 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/multipathd/Makefile b/multipathd/Makefile
|
|
index d053c1ed..393b6cbb 100644
|
|
--- a/multipathd/Makefile
|
|
+++ b/multipathd/Makefile
|
|
@@ -16,6 +16,8 @@ LDFLAGS += $(BIN_LDFLAGS)
|
|
LIBDEPS += -L$(multipathdir) -lmultipath -L$(mpathpersistdir) -lmpathpersist \
|
|
-L$(mpathcmddir) -lmpathcmd -ludev -ldl -lurcu -lpthread \
|
|
-ldevmapper -lreadline
|
|
+CFLAGS += $(shell $(PKGCONFIG) --modversion liburcu 2>/dev/null | \
|
|
+ awk -F. '{ printf("-DURCU_VERSION=0x%06x", 256 * ( 256 * $$1 + $$2) + $$3); }')
|
|
|
|
ifdef SYSTEMD
|
|
CFLAGS += -DUSE_SYSTEMD=$(SYSTEMD)
|
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
index 102946bf..c34fd9c8 100644
|
|
--- a/multipathd/main.c
|
|
+++ b/multipathd/main.c
|
|
@@ -3031,6 +3031,10 @@ static void cleanup_threads(void)
|
|
pthread_attr_destroy(&waiter_attr);
|
|
}
|
|
|
|
+#ifndef URCU_VERSION
|
|
+# define URCU_VERSION 0
|
|
+#endif
|
|
+#if (URCU_VERSION >= 0x000800)
|
|
/*
|
|
* Use a non-default call_rcu_data for child().
|
|
*
|
|
@@ -3040,6 +3044,9 @@ static void cleanup_threads(void)
|
|
* can't be joined with pthread_join(), leaving a memory leak.
|
|
*
|
|
* Therefore we create our own, which can be destroyed and joined.
|
|
+ * The cleanup handler needs to call rcu_barrier(), which is only
|
|
+ * available in user-space RCU v0.8 and newer. See
|
|
+ * https://lists.lttng.org/pipermail/lttng-dev/2021-May/029958.html
|
|
*/
|
|
static struct call_rcu_data *setup_rcu(void)
|
|
{
|
|
@@ -3072,6 +3079,7 @@ static void cleanup_rcu(void)
|
|
}
|
|
rcu_unregister_thread();
|
|
}
|
|
+#endif /* URCU_VERSION */
|
|
|
|
static void cleanup_child(void)
|
|
{
|
|
@@ -3116,9 +3124,14 @@ child (__attribute__((unused)) void *param)
|
|
init_unwinder();
|
|
mlockall(MCL_CURRENT | MCL_FUTURE);
|
|
signal_init();
|
|
+#if (URCU_VERSION >= 0x000800)
|
|
mp_rcu_data = setup_rcu();
|
|
-
|
|
- if (atexit(cleanup_rcu) || atexit(cleanup_child))
|
|
+ if (atexit(cleanup_rcu))
|
|
+ fprintf(stderr, "failed to register RCU cleanup handler\n");
|
|
+#else
|
|
+ rcu_init();
|
|
+#endif
|
|
+ if (atexit(cleanup_child))
|
|
fprintf(stderr, "failed to register cleanup handlers\n");
|
|
|
|
setup_thread_attr(&misc_attr, 64 * 1024, 0);
|