Files
erofs-linux/kernel
Oleg Nesterov 13c22168b7 destroy_workqueue() can livelock
Pointed out by Michal Schmidt <[email protected]>.

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 <[email protected]>
Cc: Michal Schmidt <[email protected]>
Cc: Srivatsa Vaddagiri <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
2007-07-17 10:23:03 -07:00
..
…
2007-07-16 09:05:47 -07:00
2007-07-16 09:05:48 -07:00
…
…
…
…
…
2007-07-16 09:05:49 -07:00
…
…
2007-07-16 09:05:50 -07:00
…
…
…
…
2007-07-16 09:05:47 -07:00
…
…
…
2007-07-17 10:23:03 -07:00
2007-07-13 14:14:28 +02:00
2007-07-16 09:05:49 -07:00
2007-07-16 09:05:49 -07:00
2007-07-16 09:05:49 -07:00
…
…
2007-07-09 18:51:58 +02:00
2007-07-16 09:05:50 -07:00
2007-07-16 09:05:43 -07:00
…
2007-07-16 09:05:50 -07:00
2007-07-17 10:23:03 -07:00
2007-07-16 09:05:48 -07:00
…
…
2007-07-16 09:05:47 -07:00
…
2007-07-17 10:23:03 -07:00