62 lines
1.8 KiB
Diff
62 lines
1.8 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Martin Wilck <mwilck@suse.com>
|
||
|
Date: Fri, 4 Jan 2019 17:10:25 +0100
|
||
|
Subject: [PATCH] multipathd: cancel threads early during shutdown
|
||
|
|
||
|
Cancel the other threads before taking vecs->lock. This avoids
|
||
|
delays during shutdown caused e.g. by the checker thread holding
|
||
|
the vecs lock.
|
||
|
|
||
|
Note: this makes it possible that cancelled threads leak memory,
|
||
|
because they can now be cancelled before having released the vecs
|
||
|
lock. I believe this is acceptable, as only threads are affected
|
||
|
that are cancelled during multipathd shutdown.
|
||
|
|
||
|
Cc: Chongyun Wu <wu.chongyun@h3c.com>
|
||
|
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||
|
---
|
||
|
multipathd/main.c | 17 +++++++++--------
|
||
|
1 file changed, 9 insertions(+), 8 deletions(-)
|
||
|
|
||
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
||
|
index 39aea4ad..d1f8cc1b 100644
|
||
|
--- a/multipathd/main.c
|
||
|
+++ b/multipathd/main.c
|
||
|
@@ -3073,23 +3073,24 @@ child (__attribute__((unused)) void *param)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
- lock(&vecs->lock);
|
||
|
+ pthread_cancel(check_thr);
|
||
|
+ pthread_cancel(uevent_thr);
|
||
|
+ pthread_cancel(uxlsnr_thr);
|
||
|
+ pthread_cancel(uevq_thr);
|
||
|
+ if (poll_dmevents)
|
||
|
+ pthread_cancel(dmevent_thr);
|
||
|
+
|
||
|
conf = get_multipath_config();
|
||
|
queue_without_daemon = conf->queue_without_daemon;
|
||
|
put_multipath_config(conf);
|
||
|
+
|
||
|
+ lock(&vecs->lock);
|
||
|
if (queue_without_daemon == QUE_NO_DAEMON_OFF)
|
||
|
vector_foreach_slot(vecs->mpvec, mpp, i)
|
||
|
dm_queue_if_no_path(mpp->alias, 0);
|
||
|
remove_maps_and_stop_waiters(vecs);
|
||
|
unlock(&vecs->lock);
|
||
|
|
||
|
- pthread_cancel(check_thr);
|
||
|
- pthread_cancel(uevent_thr);
|
||
|
- pthread_cancel(uxlsnr_thr);
|
||
|
- pthread_cancel(uevq_thr);
|
||
|
- if (poll_dmevents)
|
||
|
- pthread_cancel(dmevent_thr);
|
||
|
-
|
||
|
pthread_join(check_thr, NULL);
|
||
|
pthread_join(uevent_thr, NULL);
|
||
|
pthread_join(uxlsnr_thr, NULL);
|
||
|
--
|
||
|
2.17.2
|
||
|
|