public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH/RFC] workqueue: allow rescuer thread to do more work.
@ 2014-10-29  6:26 NeilBrown
  2014-10-29 14:32 ` Tejun Heo
  0 siblings, 1 reply; 26+ messages in thread
From: NeilBrown @ 2014-10-29  6:26 UTC (permalink / raw)
  To: Tejun Heo; +Cc: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2500 bytes --]


When there is serious memory pressure, all workers in a pool could be blocked,
and a new thread cannot be created because it requires memory allocation.

In this situation a WQ_MEM_RECLAIM workqueue will wake up the
rescuer thread to do some work.

The rescuer will only handle requests that are already on ->worklist.
If max_requests is 1, that means it will handle a single request.

The rescuer will be woken again in 100ms to handle another max_requests
requests.

I've seen a machine (running a 3.0 based "enterprise" kernel) with thousands
of requests queued for xfslogd, which has a max_requests of 1, and is needed
for retiring all 'xfs' write requests.  When one of the worker pools gets
into this state, it progresses extremely slowly and possibly never recovers
(only waited an hour or two).

So if, after handling everything on worklist, there is again something on
worklist (counted in nr_active), and if the queue is still congested, keep
processing instead of waiting for the next wake-up.

Signed-off-by: NeilBrown <neilb@suse.de>
---

Hi Tejun,
  I haven't tested this patch yet so this really is an 'RFC'.
In general ->nr_active should only be accessed under the pool->lock,
but a miss-read here will at most cause a very occasional 100ms delay so
shouldn't be a big problem.  The only thread likely to change ->nr_active is
this thread, so such a delay would be extremely unlikely.

Thanks,
NeilBrown


diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 09b685daee3d..d0a8b101c5d9 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -2244,16 +2244,18 @@ repeat:
 		spin_lock_irq(&pool->lock);
 		rescuer->pool = pool;
 
-		/*
-		 * Slurp in all works issued via this workqueue and
-		 * process'em.
-		 */
-		WARN_ON_ONCE(!list_empty(&rescuer->scheduled));
-		list_for_each_entry_safe(work, n, &pool->worklist, entry)
-			if (get_work_pwq(work) == pwq)
-				move_linked_works(work, scheduled, &n);
+		do {
+			/*
+			 * Slurp in all works issued via this workqueue and
+			 * process'em.
+			 */
+			WARN_ON_ONCE(!list_empty(&rescuer->scheduled));
+			list_for_each_entry_safe(work, n, &pool->worklist, entry)
+				if (get_work_pwq(work) == pwq)
+					move_linked_works(work, scheduled, &n);
 
-		process_scheduled_works(rescuer);
+			process_scheduled_works(rescuer);
+		} while (need_more_worker(pool) && pwq->nr_active);
 
 		/*
 		 * Put the reference grabbed by send_mayday().  @pool won't

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 828 bytes --]

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

end of thread, other threads:[~2014-12-08 22:47 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-29  6:26 [PATCH/RFC] workqueue: allow rescuer thread to do more work NeilBrown
2014-10-29 14:32 ` Tejun Heo
2014-10-29 23:19   ` NeilBrown
2014-11-04 14:22     ` Tejun Heo
2014-11-06 16:58       ` Dongsu Park
2014-11-07  3:03         ` Lai Jiangshan
2014-11-10  5:28           ` NeilBrown
2014-11-10  8:52             ` Jan Kara
2014-11-10 22:04               ` NeilBrown
2014-11-14 17:21                 ` Tejun Heo
2014-11-18  4:27                 ` [PATCH - v3?] " NeilBrown
2014-11-18  6:01                   ` Lai Jiangshan
2014-11-18  6:11                     ` NeilBrown
2014-12-02 20:43                   ` Tejun Heo
2014-12-03  0:40                     ` NeilBrown
2014-12-03 17:20                       ` Tejun Heo
2014-12-03 18:02                         ` Tejun Heo
2014-12-03 22:31                           ` Dongsu Park
2014-12-04  1:19                             ` NeilBrown
2014-12-04  1:01                           ` Lai Jiangshan
2014-12-04 14:57                             ` Tejun Heo
2014-12-04 15:11                           ` [PATCH workqueue/for-3.18-fixes 1/2] workqueue: invert the order between pool->lock and wq_mayday_lock Tejun Heo
2014-12-04 15:12                             ` [PATCH workqueue/for-3.18-fixes 2/2] workqueue: allow rescuer thread to do more work Tejun Heo
2014-12-08 17:40                               ` Tejun Heo
2014-12-08 22:47                                 ` NeilBrown
2014-12-05  2:09                             ` [PATCH workqueue/for-3.18-fixes 1/2] workqueue: invert the order between pool->lock and wq_mayday_lock Lai Jiangshan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox