aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNick Piggin <npiggin@suse.de>2009-01-06 17:39:10 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-06 18:58:59 -0500
commit515f4a037fb9ab736f8bad733fcd2ffd350cf265 (patch)
tree0862eee6405297ef23a5b3d8906cfef5783c0c77
parent5a3d5c9813db56a75934eb1015367fda23a8b0b4 (diff)
mm: write_cache_pages optimise page cleaning
In write_cache_pages, if we get stuck behind another process that is cleaning pages, we will be forced to wait for them to finish, then perform our own writeout (if it was redirtied during the long wait), then wait for that. If a page under writeout is still clean, we can skip waiting for it (if we're part of a data integrity sync, we'll be waiting for all writeout pages afterwards, so we'll still be waiting for the other guy's write that's cleaned the page). Signed-off-by: Nick Piggin <npiggin@suse.de> Cc: Chris Mason <chris.mason@oracle.com> Cc: Dave Chinner <david@fromorbit.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/page-writeback.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index c3fb38b1ea43..2e8c2b01d5d5 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -945,11 +945,20 @@ continue_unlock:
945 goto continue_unlock; 945 goto continue_unlock;
946 } 946 }
947 947
948 if (wbc->sync_mode != WB_SYNC_NONE) 948 if (!PageDirty(page)) {
949 wait_on_page_writeback(page); 949 /* someone wrote it for us */
950 goto continue_unlock;
951 }
952
953 if (PageWriteback(page)) {
954 if (wbc->sync_mode != WB_SYNC_NONE)
955 wait_on_page_writeback(page);
956 else
957 goto continue_unlock;
958 }
950 959
951 if (PageWriteback(page) || 960 BUG_ON(PageWriteback(page));
952 !clear_page_dirty_for_io(page)) 961 if (!clear_page_dirty_for_io(page))
953 goto continue_unlock; 962 goto continue_unlock;
954 963
955 ret = (*writepage)(page, wbc, data); 964 ret = (*writepage)(page, wbc, data);