[PATCH] writeback: avoid possible balance_dirty_pages() lockup on a light-load bdi

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Chuck Ebbert <cebbert@...>
Cc: Greg KH <gregkh@...>, Chakri n <chakriin5@...>, Peter Zijlstra <a.p.zijlstra@...>, Krzysztof Oledzki <olel@...>, <akpm@...>, linux-pm <linux-pm@...>, lkml <linux-kernel@...>, richard kennedy <richard@...>
Date: Monday, October 1, 2007 - 10:00 pm

On Mon, Oct 01, 2007 at 11:57:34AM -0400, Chuck Ebbert wrote:
[...] 

(expecting real world confirmations...)

Here is a new safer version.  It's more ugly though.

---
writeback: avoid possible balance_dirty_pages() lockup on a light-load bdi

On a busy-writing system, a writer could be hold up infinitely on a
light-load device. It will be trying to sync more than available dirty data.

The problem case:

0. sda/nr_dirty >= dirty_limit;
   sdb/nr_dirty == 0
1. dd writes 32 pages on sdb
2. balance_dirty_pages() blocks dd, and tries to write 6MB.
3. it never gets there: there's only 128KB dirty data.
4. dd may be blocked for a loooong time

Fix it by returning on 'zero dirty inodes' in the current bdi.
(In fact there are slight differences between 'dirty inodes' and 'dirty pages'.
But there is no available counters for 'dirty pages'.)

But the newly introduced 'break' could make the nr_writeback drift away
above the dirty limit. The workaround is to limit the error under 1MB.

Cc: Chuck Ebbert <cebbert@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Fengguang Wu <wfg@mail.ustc.edu.cn>
---
 mm/page-writeback.c |    5 +++++
 1 file changed, 5 insertions(+)

--- linux-2.6.22.orig/mm/page-writeback.c
+++ linux-2.6.22/mm/page-writeback.c
@@ -250,6 +250,11 @@ static void balance_dirty_pages(struct a
 			pages_written += write_chunk - wbc.nr_to_write;
 			if (pages_written >= write_chunk)
 				break;		/* We've done our duty */
+			if (list_empty(&mapping->host->i_sb->s_dirty) &&
+			    list_empty(&mapping->host->i_sb->s_io) &&
+			    nr_reclaimable + global_page_state(NR_WRITEBACK) <=
+				    dirty_thresh + (1 << (20-PAGE_CACHE_SHIFT)))
+				break;
 		}
 		congestion_wait(WRITE, HZ/10);
 	}

-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] writeback: avoid possible balance_dirty_pages() lock..., Fengguang Wu, (Mon Oct 1, 10:00 pm)
KDB?, Daniel Phillips, (Fri Sep 28, 9:51 pm)
[PATCH] lockstat: documentation, Peter Zijlstra, (Wed Oct 3, 5:28 am)
Re: [PATCH] lockstat: documentation, Ingo Molnar, (Wed Oct 3, 5:35 am)