On Sat, 2018-02-10 at 00:28 +0100, Martin Wilck wrote: > Maybe it's easier than we thought. Attached is a patch on top of > yours that I think might work, please have a look. > That one didn't even compile. This one is better. Martin -- Dr. Martin Wilck <mwilck@xxxxxxxx>, Tel. +49 (0)911 74053 2107 SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg)
From afb9c7de3658d49c4f28f6b9ee618a87b806ecdd Mon Sep 17 00:00:00 2001 From: Martin Wilck <mwilck@xxxxxxxx> Date: Sat, 10 Feb 2018 00:22:17 +0100 Subject: [PATCH] tur checker: make sure pthread_cancel isn't called for exited thread If we enter the cleanup function as the result of a pthread_cancel by another thread, we don't need to wait for a cancellation any more. If we exit regularly, just tell the other thread not to try to cancel us. --- libmultipath/checkers/tur.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libmultipath/checkers/tur.c b/libmultipath/checkers/tur.c index 894ad41c89c3..5d2b36bfa883 100644 --- a/libmultipath/checkers/tur.c +++ b/libmultipath/checkers/tur.c @@ -214,15 +214,13 @@ retry: static void cleanup_func(void *data) { - int running, holders; + int holders; struct tur_checker_context *ct = data; - running = uatomic_xchg(&ct->running, 0); + uatomic_set(&ct->running, 0); holders = uatomic_sub_return(&ct->holders, 1); if (!holders) cleanup_context(ct); - if (!running) - pause(); } static int tur_running(struct tur_checker_context *ct) @@ -266,6 +264,9 @@ static void *tur_thread(void *ctx) pthread_cond_signal(&ct->active); pthread_mutex_unlock(&ct->lock); + /* Tell main checker thread not to cancel us, as we exit anyway */ + uatomic_set(&ct->running, 0); + condlog(3, "%s: tur checker finished, state %s", tur_devt(devt, sizeof(devt), ct), checker_state_name(state)); tur_thread_cleanup_pop(ct); -- 2.16.1
-- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel