All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V3 0/7] workqueue: Factor the way to assign rescuer work
@ 2025-11-21 14:57 Lai Jiangshan
  2025-11-21 14:57 ` [PATCH V3 1/7] workqueue: Factor out assign_rescuer_work() Lai Jiangshan
                   ` (7 more replies)
  0 siblings, 8 replies; 17+ messages in thread
From: Lai Jiangshan @ 2025-11-21 14:57 UTC (permalink / raw)
  To: linux-kernel; +Cc: Tejun Heo, ying chen, Lai Jiangshan

From: Lai Jiangshan <jiangshan.ljs@antgroup.com>

Previously, the rescuer scanned for all matching work items at once and
processed them within a single rescuer thread, which could cause one
blocking work item to stall all others.

Make the rescuer process work items one-by-one instead of slurping all
matches in a single pass.

Break the rescuer loop after finding and processing the first matching
work item, then restart the search to pick up the next. This gives
normal worker threads a chance to process other items which gives them
the opportinity to be processed instead of waiting on the rescuer's
queue and prevents a blocking work item from stalling the rest once
memory pressure is relieved.

Introduce a dummy cursor  work item to avoid potentially O(N^2)
rescans of the work list.  The marker records the resume position for
the next scan, eliminating redundant traversals.


Change from v2:

 Renames.

 Change WARN_ON_ONCE() conditions in assign_work().

 Remove the check whether the cursor is on the list in send_mayday()
 which has the benefit of enabling the ability to only process a
 limit number of work items per run and still allow the cursor in
 worklist between runs.

 Also remove the insertion of the cursor in send_mayday() and contain
 the code of handling the cursor in assign[_rescuer]_work().

 Split patch.

V2: https://lore.kernel.org/lkml/20251118093832.81920-1-jiangshanlai@gmail.com/

Changed from v1:

Insert the marker and use it purely as iteration marker as Tejun
request.
  It is hard to maintain the proper state of it, expecially maintaining
  it only in pool->worklist which also requires an unlikely path in the
  worker_thread() path.

Add an unlikely path in the worker_thread() path(in assign_work()).

Add other code in other place to make it not be treated like a work
item.  I'm sure all the paths have been covered now, but I still feel
a bit nevous about it for future changes.

Extra the code to assign work in the rescuer_thread() out as
assign_rescue_work().

V1: https://lore.kernel.org/lkml/20251113163426.2950-1-jiangshanlai@gmail.com/

Lai Jiangshan (7):
  workqueue: Factor out assign_rescuer_work()
  workqueue: Only assign rescuer work when really needed
  workqueue: Don't rely on wq->rescuer to stop rescuer
  workqueue: Loop over in rescuer until all its work is done
  workqueue: Process rescuer work items one-by-one using a cursor
  workqueue: Limit number of processed works in rescuer per turn
  workqueue: Process extra works in rescuer when there are no more to
    rescue

 kernel/workqueue.c | 146 ++++++++++++++++++++++++++++++++-------------
 1 file changed, 103 insertions(+), 43 deletions(-)

-- 
2.19.1.6.gb485710b


^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2025-11-22 14:31 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-21 14:57 [PATCH V3 0/7] workqueue: Factor the way to assign rescuer work Lai Jiangshan
2025-11-21 14:57 ` [PATCH V3 1/7] workqueue: Factor out assign_rescuer_work() Lai Jiangshan
2025-11-21 14:57 ` [PATCH V3 2/7] workqueue: Only assign rescuer work when really needed Lai Jiangshan
2025-11-21 14:57 ` [PATCH V3 3/7] workqueue: Don't rely on wq->rescuer to stop rescuer Lai Jiangshan
2025-11-21 14:57 ` [PATCH V3 4/7] workqueue: Loop over in rescuer until all its work is done Lai Jiangshan
2025-11-21 19:30   ` Tejun Heo
2025-11-21 14:57 ` [PATCH V3 5/7] workqueue: Process rescuer work items one-by-one using a cursor Lai Jiangshan
2025-11-21 19:05   ` Tejun Heo
2025-11-21 14:57 ` [PATCH V3 6/7] workqueue: Limit number of processed works in rescuer per turn Lai Jiangshan
2025-11-21 19:28   ` Tejun Heo
2025-11-22  6:22     ` Lai Jiangshan
2025-11-22 14:26       ` Tejun Heo
2025-11-21 14:57 ` [PATCH V3 7/7] workqueue: Process extra works in rescuer when there are no more to rescue Lai Jiangshan
2025-11-21 19:29   ` Tejun Heo
2025-11-22  7:07     ` Lai Jiangshan
2025-11-22 14:31       ` Tejun Heo
2025-11-21 19:57 ` [PATCH V3 0/7] workqueue: Factor the way to assign rescuer work Tejun Heo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.