From: Wu Fengguang <fengguang.wu@intel.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Chinner <david@fromorbit.com>, Jan Kara <jack@suse.cz>,
Wu Fengguang <fengguang.wu@intel.com>,
Christoph Hellwig <hch@infradead.org>, Mel Gorman <mel@csn.ul.ie>,
Chris Mason <chris.mason@oracle.com>,
Jens Axboe <jens.axboe@oracle.com>,
LKML <linux-kernel@vger.kernel.org>,
linux-fsdevel@vger.kernel.org, linux-mm@kvack.org
Subject: [PATCH 4/6] writeback: sync expired inodes first in background writeback
Date: Thu, 22 Jul 2010 13:09:32 +0800 [thread overview]
Message-ID: <20100722061822.906037624@intel.com> (raw)
In-Reply-To: <20100722050928.653312535@intel.com>
[-- Attachment #1: writeback-expired-for-background.patch --]
[-- Type: text/plain, Size: 2449 bytes --]
A background flush work may run for ever. So it's reasonable for it to
mimic the kupdate behavior of syncing old/expired inodes first.
The policy is
- enqueue all newly expired inodes at each queue_io() time
- retry with halfed expire interval until get some inodes to sync
CC: Jan Kara <jack@suse.cz>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
fs/fs-writeback.c | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
--- linux-next.orig/fs/fs-writeback.c 2010-07-22 12:56:42.000000000 +0800
+++ linux-next/fs/fs-writeback.c 2010-07-22 13:07:51.000000000 +0800
@@ -217,14 +217,14 @@ static void move_expired_inodes(struct l
struct writeback_control *wbc)
{
unsigned long expire_interval = 0;
- unsigned long older_than_this;
+ unsigned long older_than_this = 0; /* reset to kill gcc warning */
LIST_HEAD(tmp);
struct list_head *pos, *node;
struct super_block *sb = NULL;
struct inode *inode;
int do_sb_sort = 0;
- if (wbc->for_kupdate) {
+ if (wbc->for_kupdate || wbc->for_background) {
expire_interval = msecs_to_jiffies(dirty_expire_interval * 10);
older_than_this = jiffies - expire_interval;
}
@@ -232,8 +232,15 @@ static void move_expired_inodes(struct l
while (!list_empty(delaying_queue)) {
inode = list_entry(delaying_queue->prev, struct inode, i_list);
if (expire_interval &&
- inode_dirtied_after(inode, older_than_this))
- break;
+ inode_dirtied_after(inode, older_than_this)) {
+ if (wbc->for_background &&
+ list_empty(dispatch_queue) && list_empty(&tmp)) {
+ expire_interval >>= 1;
+ older_than_this = jiffies - expire_interval;
+ continue;
+ } else
+ break;
+ }
if (sb && sb != inode->i_sb)
do_sb_sort = 1;
sb = inode->i_sb;
@@ -521,7 +528,8 @@ void writeback_inodes_wb(struct bdi_writ
wbc->wb_start = jiffies; /* livelock avoidance */
spin_lock(&inode_lock);
- if (!wbc->for_kupdate || list_empty(&wb->b_io))
+
+ if (!(wbc->for_kupdate || wbc->for_background) || list_empty(&wb->b_io))
queue_io(wb, wbc);
while (!list_empty(&wb->b_io)) {
@@ -550,7 +558,7 @@ static void __writeback_inodes_sb(struct
wbc->wb_start = jiffies; /* livelock avoidance */
spin_lock(&inode_lock);
- if (!wbc->for_kupdate || list_empty(&wb->b_io))
+ if (!(wbc->for_kupdate || wbc->for_background) || list_empty(&wb->b_io))
queue_io(wb, wbc);
writeback_sb_inodes(sb, wb, wbc, true);
spin_unlock(&inode_lock);
next prev parent reply other threads:[~2010-07-22 5:09 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-22 5:09 [PATCH 0/6] [RFC] writeback: try to write older pages first Wu Fengguang
2010-07-22 5:09 ` [PATCH 1/6] writeback: pass writeback_control down to move_expired_inodes() Wu Fengguang
2010-07-23 18:16 ` Jan Kara
2010-07-26 10:44 ` Mel Gorman
2010-08-01 15:23 ` Minchan Kim
2010-07-22 5:09 ` [PATCH 2/6] writeback: the kupdate expire timestamp should be a moving target Wu Fengguang
2010-07-23 18:17 ` Jan Kara
2010-07-26 10:52 ` Mel Gorman
2010-07-26 11:32 ` Wu Fengguang
2010-08-01 15:29 ` Minchan Kim
2010-07-22 5:09 ` [PATCH 3/6] writeback: kill writeback_control.more_io Wu Fengguang
2010-07-23 18:24 ` Jan Kara
2010-07-26 10:53 ` Mel Gorman
2010-08-01 15:34 ` Minchan Kim
2010-08-05 14:50 ` Wu Fengguang
2010-08-05 14:55 ` Wu Fengguang
2010-08-05 14:56 ` Minchan Kim
2010-08-05 15:26 ` Wu Fengguang
2010-07-22 5:09 ` Wu Fengguang [this message]
2010-07-23 18:15 ` [PATCH 4/6] writeback: sync expired inodes first in background writeback Jan Kara
2010-07-26 11:51 ` Wu Fengguang
2010-07-26 12:12 ` Jan Kara
2010-07-26 12:29 ` Wu Fengguang
2010-07-26 10:57 ` Mel Gorman
2010-07-26 12:00 ` Wu Fengguang
2010-07-26 12:20 ` Jan Kara
2010-07-26 12:31 ` Wu Fengguang
2010-07-26 12:39 ` Jan Kara
2010-07-26 12:47 ` Wu Fengguang
2010-07-26 12:56 ` Wu Fengguang
2010-07-26 12:59 ` Mel Gorman
2010-07-26 13:11 ` Wu Fengguang
2010-07-27 9:45 ` Mel Gorman
2010-08-01 15:15 ` Minchan Kim
2010-07-22 5:09 ` [PATCH 5/6] writeback: try more writeback as long as something was written Wu Fengguang
2010-07-23 17:39 ` Jan Kara
2010-07-26 12:39 ` Wu Fengguang
2010-07-26 11:01 ` Mel Gorman
2010-07-26 11:39 ` Wu Fengguang
2010-07-22 5:09 ` [PATCH 6/6] writeback: introduce writeback_control.inodes_written Wu Fengguang
2010-07-26 11:04 ` Mel Gorman
2010-07-23 10:24 ` [PATCH 0/6] [RFC] writeback: try to write older pages first Mel Gorman
2010-07-26 7:18 ` Wu Fengguang
2010-07-26 10:42 ` Mel Gorman
2010-07-26 10:28 ` Itaru Kitayama
2010-07-26 11:47 ` Wu Fengguang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100722061822.906037624@intel.com \
--to=fengguang.wu@intel.com \
--cc=akpm@linux-foundation.org \
--cc=chris.mason@oracle.com \
--cc=david@fromorbit.com \
--cc=hch@infradead.org \
--cc=jack@suse.cz \
--cc=jens.axboe@oracle.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mel@csn.ul.ie \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox