On Mon, 2018-02-12 at 21:42 -0600, Benjamin Marzinski wrote: > Commit 6e2423fd fixed a bug where the tur checker could cancel a > detached thread after it had exitted. However in fixing this, the new > code grabbed a mutex (to call condlog) while holding a spin_lock. To > deal with this, I've done away with the holder spin_lock completely, > and > replaced it with two atomic variables, based on a suggestion by > Martin > Wilck. > > The holder variable works exactly like before. When the checker is > initialized, it is set to 1. When a thread is created it is > incremented. > When either the thread or the checker are done with the context, they > atomically decrement the holder variable and check its value. If it > is 0, they free the context. If it is 1, they never touch the context > again. > > The other variable has changed. First, ct->running and ct->thread > have > switched uses. ct->thread is now only ever accessed by the checker, > never the thread. If it is non-NULL, a thread has started up, but > hasn't been dealt with by the checker yet. It is also obviously used > by the checker to cancel the thread. > > ct->running is now an atomic variable. When the thread is started > it is set to 1. When the checker wants to kill a thread, it > atomically > sets the value to 0 and reads the previous value. If it was 1, > the checker cancels the thread. If it was 0, the nothing needs to be > done. After the checker has dealt with the thread, it sets ct- > >thread > to NULL. > > Right before the thread finishes and pops the cleanup handler, it > atomically sets the value of ct->running to 0 and reads the previous > value. If it was 1, the thread just pops the cleanup handler and > exits. > If it was 0, then the checker is trying to cancel the thread, and so > the > thread calls pause(), which is a cancellation point. > > Cc: Martin Wilck <mwilck@xxxxxxxx> > Cc: Bart Van Assche <Bart.VanAssche@xxxxxxx> > Signed-off-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > --- Reviewed-by: Martin Wilck <mwilck@xxxxxxxx> Side note: a little voice in my head keeps whispering that it should be possible to solve this problem with just one atomic variable instead of two ("holders" and "running"). But I'm fine with the current approach for now. -- 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) -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel