Skip to content
  • Lai Jiangshan's avatar
    workqueue: ensure @task is valid across kthread_stop() · 4403be9e
    Lai Jiangshan authored
    
    
    commit 5bdfff96c69a4d5ab9c49e60abf9e070ecd2acbb upstream.
    
    When a kworker should die, the kworkre is notified through WORKER_DIE
    flag instead of kthread_should_stop().  This, IIRC, is primarily to
    keep the test synchronized inside worker_pool lock.  WORKER_DIE is
    first set while holding pool->lock, the lock is dropped and
    kthread_stop() is called.
    
    Unfortunately, this means that there's a slight chance that the target
    kworker may see WORKER_DIE before kthread_stop() finishes and exits
    and frees the target task before or during kthread_stop().
    
    Fix it by pinning the target task before setting WORKER_DIE and
    putting it after kthread_stop() is done.
    
    tj: Improved patch description and comment.  Moved pinning above
        WORKER_DIE for better signify what it's protecting.
    
    Signed-off-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4403be9e