• Tejun Heo's avatar
    workqueue: Not all work insertion needs to wake up a worker · fe089f87
    Tejun Heo authored
    insert_work() always tried to wake up a worker; however, the only time it
    needs to try to wake up a worker is when a new active work item is queued.
    When a work item goes on the inactive list or queueing a flush work item,
    there's no reason to try to wake up a worker.
    
    This patch moves the worker wakeup logic out of insert_work() and places it
    in the active new work item queueing path in __queue_work().
    
    While at it:
    
    * __queue_work() is dereferencing pwq->pool repeatedly. Add local variable
      pool.
    
    * Every caller of insert_work() calls debug_work_activate(). Consolidate the
      invocations into insert_work().
    
    * In __queue_work() pool->watchdog_ts update is relocated slightly. This is
      to better accommodate future changes.
    
    This makes wakeups more precise and will help the planned change to assign
    work items to workers before waking them up. No behavior changes intended.
    
    v2: WARN_ON_ONCE(pool != last_pool) added in __queue_work() to clarify as
        suggested by Lai.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Lai Jiangshan <jiangshanlai@gmail.com>
    fe089f87
workqueue.c 183 KB