• Tejun Heo's avatar
    workqueue: implement get/put_pwq() · 8864b4e5
    Tejun Heo authored
    Add pool_workqueue->refcnt along with get/put_pwq().  Both per-cpu and
    unbound pwqs have refcnts and any work item inserted on a pwq
    increments the refcnt which is dropped when the work item finishes.
    
    For per-cpu pwqs the base ref is never dropped and destroy_workqueue()
    frees the pwqs as before.  For unbound ones, destroy_workqueue()
    simply drops the base ref on the first pwq.  When the refcnt reaches
    zero, pwq_unbound_release_workfn() is scheduled on system_wq, which
    unlinks the pwq, puts the associated pool and frees the pwq and wq as
    necessary.  This needs to be done from a work item as put_pwq() needs
    to be protected by pool->lock but release can't happen with the lock
    held - e.g. put_unbound_pool() involves blocking operations.
    
    Unbound pool->locks are marked with lockdep subclas 1 as put_pwq()
    will schedule the release work item on system_wq while holding the
    unbound pool's lock and triggers recursive locking warning spuriously.
    
    This will be used to implement dynamic creation and destruction of
    unbound pwqs.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reviewed-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    8864b4e5
workqueue.c 113 KB