• T
    workqueue: restructure pool / pool_workqueue iterations in freeze/thaw functions · 24b8a847
    Tejun Heo 提交于
    The three freeze/thaw related functions - freeze_workqueues_begin(),
    freeze_workqueues_busy() and thaw_workqueues() - need to iterate
    through all pool_workqueues of all freezable workqueues.  They did it
    by first iterating pools and then visiting all pwqs (pool_workqueues)
    of all workqueues and process it if its pwq->pool matches the current
    pool.  This is rather backwards and done this way partly because
    workqueue didn't have fitting iteration helpers and partly to avoid
    the number of lock operations on pool->lock.
    
    Workqueue now has fitting iterators and the locking operation overhead
    isn't anything to worry about - those locks are unlikely to be
    contended and the same CPU visiting the same set of locks multiple
    times isn't expensive.
    
    Restructure the three functions such that the flow better matches the
    logical steps and pwq iteration is done using for_each_pwq() inside
    workqueue iteration.
    
    * freeze_workqueues_begin(): Setting of FREEZING is moved into a
      separate for_each_pool() iteration.  pwq iteration for clearing
      max_active is updated as described above.
    
    * freeze_workqueues_busy(): pwq iteration updated as described above.
    
    * thaw_workqueues(): The single for_each_wq_cpu() iteration is broken
      into three discrete steps - clearing FREEZING, restoring max_active,
      and kicking workers.  The first and last steps use for_each_pool()
      and the second step uses pwq iteration described above.
    
    This makes the code easier to understand and removes the use of
    for_each_wq_cpu() for walking pwqs, which can't support multiple
    unbound pwqs which will be needed to implement unbound workqueues with
    custom attributes.
    
    This patch doesn't introduce any visible behavior changes.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Reviewed-by: NLai Jiangshan <laijs@cn.fujitsu.com>
    24b8a847
workqueue.c 104.2 KB