• Tejun Heo's avatar
    workqueue: implement apply_workqueue_attrs() · 9e8cd2f5
    Tejun Heo authored
    Implement apply_workqueue_attrs() which applies workqueue_attrs to the
    specified unbound workqueue by creating a new pwq (pool_workqueue)
    linked to worker_pool with the specified attributes.
    
    A new pwq is linked at the head of wq->pwqs instead of tail and
    __queue_work() verifies that the first unbound pwq has positive refcnt
    before choosing it for the actual queueing.  This is to cover the case
    where creation of a new pwq races with queueing.  As base ref on a pwq
    won't be dropped without making another pwq the first one,
    __queue_work() is guaranteed to make progress and not add work item to
    a dead pwq.
    
    init_and_link_pwq() is updated to return the last first pwq the new
    pwq replaced, which is put by apply_workqueue_attrs().
    
    Note that apply_workqueue_attrs() is almost identical to unbound pwq
    part of alloc_and_link_pwqs().  The only difference is that there is
    no previous first pwq.  apply_workqueue_attrs() is implemented to
    handle such cases and replaces unbound pwq handling in
    alloc_and_link_pwqs().
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reviewed-by: default avatarLai Jiangshan <laijs@cn.fujitsu.com>
    9e8cd2f5
workqueue.h 15.5 KB