• Tejun Heo's avatar
    workqueue: separate out pool and workqueue locking into wq_mutex · 5bcab335
    Tejun Heo authored
    Currently, workqueue_lock protects most shared workqueue resources -
    the pools, workqueues, pool_workqueues, draining, ID assignments,
    mayday handling and so on.  The coverage has grown organically and
    there is no identified bottleneck coming from workqueue_lock, but it
    has grown a bit too much and scheduled rebinding changes need the
    pools and workqueues to be protected by a mutex instead of a spinlock.
    
    This patch breaks out pool and workqueue synchronization from
    workqueue_lock into a new mutex - wq_mutex.  The followings are
    protected by wq_mutex.
    
    * worker_pool_idr and unbound_pool_hash
    * pool->refcnt
    * workqueues list
    * workqueue->flags, ->nr_drainers
    
    Most changes are mostly straight-forward.  workqueue_lock is replaced
    with wq_mutex where applicable and workqueue_lock lock/unlocks are
    added where wq_mutex conversion leaves data structures not protected
    by wq_mutex without locking.  irq / preemption flippings were added
    where the conversion affects them.  Things worth noting are
    
    * New WQ and WR locking lables added along with
      assert_rcu_or_wq_mutex().
    
    * worker_pool_assign_id() now expects to be called under wq_mutex.
    
    * create_mutex is removed from get_unbound_pool().  It now just holds
      wq_mutex.
    
    This patch shouldn't introduce any visible behavior changes.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    5bcab335
workqueue.c 122 KB