• Tejun Heo's avatar
    workqueue: implement attribute-based unbound worker_pool management · 29c91e99
    Tejun Heo authored
    This patch makes unbound worker_pools reference counted and
    dynamically created and destroyed as workqueues needing them come and
    go.  All unbound worker_pools are hashed on unbound_pool_hash which is
    keyed by the content of worker_pool->attrs.
    
    When an unbound workqueue is allocated, get_unbound_pool() is called
    with the attributes of the workqueue.  If there already is a matching
    worker_pool, the reference count is bumped and the pool is returned.
    If not, a new worker_pool with matching attributes is created and
    returned.
    
    When an unbound workqueue is destroyed, put_unbound_pool() is called
    which decrements the reference count of the associated worker_pool.
    If the refcnt reaches zero, the worker_pool is destroyed in sched-RCU
    safe way.
    
    Note that the standard unbound worker_pools - normal and highpri ones
    with no specific cpumask affinity - are no longer created explicitly
    during init_workqueues().  init_workqueues() only initializes
    workqueue_attrs to be used for standard unbound pools -
    unbound_std_wq_attrs[].  The pools are spawned on demand as workqueues
    are created.
    
    v2: - Comment added to init_worker_pool() explaining that @pool should
          be in a condition which can be passed to put_unbound_pool() even
          on failure.
    
        - pool->refcnt reaching zero and the pool being removed from
          unbound_pool_hash should be dynamic.  pool->refcnt is converted
          to int from atomic_t and now manipulated inside workqueue_lock.
    
        - Removed an incorrect sanity check on nr_idle in
          put_unbound_pool() which may trigger spuriously.
    
        All changes were suggested by Lai Jiangshan.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reviewed-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    29c91e99
workqueue.c 112 KB