Files
twx-linux/kernel
Oleg Nesterov 0b9a58a713 destroy_workqueue() can livelock
Pointed out by Michal Schmidt <mschmidt@redhat.com>.

The bug was introduced in 2.6.22 by me.

cleanup_workqueue_thread() does flush_cpu_workqueue(cwq) in a loop until
->worklist becomes empty.  This is live-lockable, a re-niced caller can get
CPU after wake_up() and insert a new barrier before the lower-priority
cwq->thread has a chance to clear ->current_work.

Change cleanup_workqueue_thread() to do flush_cpu_workqueue(cwq) only once.
 We can rely on the fact that run_workqueue() won't return until it flushes
all works.  So it is safe to call kthread_stop() after that, the "should
stop" request won't be noticed until run_workqueue() returns.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Michal Schmidt <mschmidt@redhat.com>
Cc: Srivatsa Vaddagiri <vatsa@in.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2007-08-09 14:27:41 -07:00
..
2007-05-11 05:38:25 -04:00
2007-05-11 05:38:26 -04:00
2007-05-23 20:14:11 -07:00
2007-08-09 14:27:36 -07:00
2007-08-09 14:27:34 -07:00
2007-05-09 07:26:28 +02:00
2007-05-09 12:30:56 -07:00
2007-05-21 09:18:19 -07:00
2007-05-11 05:38:25 -04:00
2007-06-28 11:38:18 -07:00
2007-05-11 08:29:35 -07:00
2007-05-09 08:57:56 +02:00
2007-08-09 14:27:41 -07:00