• Tejun Heo's avatar
    workqueue: convert worker_pool->worker_ida to idr and implement for_each_pool_worker() · 822d8405
    Tejun Heo authored
    Make worker_ida an idr - worker_idr and use it to implement
    for_each_pool_worker() which will be used to simplify worker rebinding
    on CPU_ONLINE.
    
    pool->worker_idr is protected by both pool->manager_mutex and
    pool->lock so that it can be iterated while holding either lock.
    
    * create_worker() allocates ID without installing worker pointer and
      installs the pointer later using idr_replace().  This is because
      worker ID is needed when creating the actual task to name it and the
      new worker shouldn't be visible to iterations before fully
      initialized.
    
    * In destroy_worker(), ID removal is moved before kthread_stop().
      This is again to guarantee that only fully working workers are
      visible to for_each_pool_worker().
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reviewed-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    822d8405
workqueue.c 123 KB