Commit c0ab017d authored by Tejun Heo's avatar Tejun Heo

workqueue: Cleanups around process_scheduled_works()

* Drop the trivial optimization in worker_thread() where it bypasses calling
  process_scheduled_works() if the first work item isn't linked. This is a
  mostly pointless micro optimization and gets in the way of improving the
  work processing path.

* Consolidate pool->watchdog_ts updates in the two callers into
  process_scheduled_works().
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent bc8b50c2
...@@ -2652,9 +2652,15 @@ __acquires(&pool->lock) ...@@ -2652,9 +2652,15 @@ __acquires(&pool->lock)
*/ */
static void process_scheduled_works(struct worker *worker) static void process_scheduled_works(struct worker *worker)
{ {
while (!list_empty(&worker->scheduled)) { struct work_struct *work;
struct work_struct *work = list_first_entry(&worker->scheduled, bool first = true;
struct work_struct, entry);
while ((work = list_first_entry_or_null(&worker->scheduled,
struct work_struct, entry))) {
if (first) {
worker->pool->watchdog_ts = jiffies;
first = false;
}
process_one_work(worker, work); process_one_work(worker, work);
} }
} }
...@@ -2735,17 +2741,8 @@ static int worker_thread(void *__worker) ...@@ -2735,17 +2741,8 @@ static int worker_thread(void *__worker)
list_first_entry(&pool->worklist, list_first_entry(&pool->worklist,
struct work_struct, entry); struct work_struct, entry);
pool->watchdog_ts = jiffies; move_linked_works(work, &worker->scheduled, NULL);
process_scheduled_works(worker);
if (likely(!(*work_data_bits(work) & WORK_STRUCT_LINKED))) {
/* optimization path, not strictly necessary */
process_one_work(worker, work);
if (unlikely(!list_empty(&worker->scheduled)))
process_scheduled_works(worker);
} else {
move_linked_works(work, &worker->scheduled, NULL);
process_scheduled_works(worker);
}
} while (keep_working(pool)); } while (keep_working(pool));
worker_set_flags(worker, WORKER_PREP); worker_set_flags(worker, WORKER_PREP);
...@@ -2820,7 +2817,6 @@ static int rescuer_thread(void *__rescuer) ...@@ -2820,7 +2817,6 @@ static int rescuer_thread(void *__rescuer)
struct pool_workqueue, mayday_node); struct pool_workqueue, mayday_node);
struct worker_pool *pool = pwq->pool; struct worker_pool *pool = pwq->pool;
struct work_struct *work, *n; struct work_struct *work, *n;
bool first = true;
__set_current_state(TASK_RUNNING); __set_current_state(TASK_RUNNING);
list_del_init(&pwq->mayday_node); list_del_init(&pwq->mayday_node);
...@@ -2838,12 +2834,9 @@ static int rescuer_thread(void *__rescuer) ...@@ -2838,12 +2834,9 @@ static int rescuer_thread(void *__rescuer)
WARN_ON_ONCE(!list_empty(scheduled)); WARN_ON_ONCE(!list_empty(scheduled));
list_for_each_entry_safe(work, n, &pool->worklist, entry) { list_for_each_entry_safe(work, n, &pool->worklist, entry) {
if (get_work_pwq(work) == pwq) { if (get_work_pwq(work) == pwq) {
if (first)
pool->watchdog_ts = jiffies;
move_linked_works(work, scheduled, &n); move_linked_works(work, scheduled, &n);
pwq->stats[PWQ_STAT_RESCUED]++; pwq->stats[PWQ_STAT_RESCUED]++;
} }
first = false;
} }
if (!list_empty(scheduled)) { if (!list_empty(scheduled)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment