• Oleg Nesterov's avatar
    destroy_workqueue() can livelock · 13c22168
    Oleg Nesterov authored
    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: default avatarOleg Nesterov <oleg@tv-sign.ru>
    Cc: Michal Schmidt <mschmidt@redhat.com>
    Cc: Srivatsa Vaddagiri <vatsa@in.ibm.com>
    Cc: <stable@kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    13c22168
workqueue.c 20.7 KB