From: Wu Fengguang <fengguang.wu@intel.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Richard Kennedy <richard@rsk.demon.co.uk>,
Andrew Morton <akpm@linux-foundation.org>,
Chris Mason <chris.mason@oracle.com>,
"Li, Shaohua" <shaohua.li@intel.com>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"jens.axboe@oracle.com" <jens.axboe@oracle.com>,
Jan Kara <jack@suse.cz>
Subject: Re: regression in page writeback
Date: Wed, 23 Sep 2009 18:30:55 +0800 [thread overview]
Message-ID: <20090923103055.GA15291@localhost> (raw)
In-Reply-To: <20090923093753.GA4579@localhost>
On Wed, Sep 23, 2009 at 05:37:53PM +0800, Wu Fengguang wrote:
> On Wed, Sep 23, 2009 at 05:23:31PM +0800, Peter Zijlstra wrote:
> > On Wed, 2009-09-23 at 10:19 +0100, Richard Kennedy wrote:
> > >
> > > I am concerned that the background writeout no longer stops when it
> > > reaches the background threshold, as balance_dirty_pages requests all
> > > dirty pages to be written. No doubt this is good for large linear writes
> > > but what about more random write workloads?
> >
> > I've not had time to look over the current code, but write-out not
> > stopping on reaching background threshold is a definite bug and needs to
> > get fixed.
>
> Yes, 2.6.31 code stops writeback when background threshold is reached.
> But new behavior in latest git is to writeback all pages.
>
> The code only checks over_bground_thresh() for kupdate works:
>
> if (args->for_kupdate && args->nr_pages <= 0 &&
> !over_bground_thresh())
> break;
>
> However the background work started by balance_dirty_pages() won't check
> over_bground_thresh(). So it will move all dirty pages.
>
> I think it's very weird to check over_bground_thresh() for kupdate
> instead of background work. Jens must intended for the latter case.
Here is the patch to fix it. Tested to work OK. This is an RFC.
Thanks,
Fengguang
---
writeback: stop background writeback when below background threshold
Treat bdi_start_writeback(0) as a special request to do background write,
and stop such work when we are below the background dirty threshold.
Also simplify the (nr_pages <= 0) checks. Since we already pass in
nr_pages=LONG_MAX for WB_SYNC_ALL and background writes, we don't
need to worry about it being decreased to zero.
Reported-by: Richard Kennedy <richard@rsk.demon.co.uk>
CC: Jan Kara <jack@suse.cz>
CC: Jens Axboe <jens.axboe@oracle.com>
CC: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
---
fs/fs-writeback.c | 28 +++++++++++++++++-----------
mm/page-writeback.c | 6 +++---
2 files changed, 20 insertions(+), 14 deletions(-)
--- linux.orig/fs/fs-writeback.c 2009-09-23 17:47:23.000000000 +0800
+++ linux/fs/fs-writeback.c 2009-09-23 18:13:36.000000000 +0800
@@ -41,8 +41,9 @@ struct wb_writeback_args {
long nr_pages;
struct super_block *sb;
enum writeback_sync_modes sync_mode;
- int for_kupdate;
- int range_cyclic;
+ int for_kupdate:1;
+ int range_cyclic:1;
+ int for_background:1;
};
/*
@@ -260,6 +261,15 @@ void bdi_start_writeback(struct backing_
.range_cyclic = 1,
};
+ /*
+ * We treat @nr_pages=0 as the special case to do background writeback,
+ * ie. to sync pages until the background dirty threshold is reached.
+ */
+ if (!nr_pages) {
+ args.nr_pages = LONG_MAX;
+ args.for_background = 1;
+ }
+
bdi_alloc_queue_work(bdi, &args);
}
@@ -723,20 +733,16 @@ static long wb_writeback(struct bdi_writ
for (;;) {
/*
- * Don't flush anything for non-integrity writeback where
- * no nr_pages was given
+ * Stop writeback when nr_pages has been consumed
*/
- if (!args->for_kupdate && args->nr_pages <= 0 &&
- args->sync_mode == WB_SYNC_NONE)
+ if (args->nr_pages <= 0)
break;
/*
- * If no specific pages were given and this is just a
- * periodic background writeout and we are below the
- * background dirty threshold, don't do anything
+ * For background writeout, stop when we are below the
+ * background dirty threshold
*/
- if (args->for_kupdate && args->nr_pages <= 0 &&
- !over_bground_thresh())
+ if (args->for_background && !over_bground_thresh())
break;
wbc.more_io = 0;
--- linux.orig/mm/page-writeback.c 2009-09-23 17:45:58.000000000 +0800
+++ linux/mm/page-writeback.c 2009-09-23 17:47:17.000000000 +0800
@@ -589,10 +589,10 @@ static void balance_dirty_pages(struct a
* background_thresh, to keep the amount of dirty memory low.
*/
if ((laptop_mode && pages_written) ||
- (!laptop_mode && ((nr_writeback = global_page_state(NR_FILE_DIRTY)
- + global_page_state(NR_UNSTABLE_NFS))
+ (!laptop_mode && ((global_page_state(NR_FILE_DIRTY)
+ + global_page_state(NR_UNSTABLE_NFS))
> background_thresh)))
- bdi_start_writeback(bdi, nr_writeback);
+ bdi_start_writeback(bdi, 0);
}
void set_page_dirty_balance(struct page *page, int page_mkwrite)
next prev parent reply other threads:[~2009-09-23 10:31 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-22 5:49 regression in page writeback Shaohua Li
2009-09-22 6:40 ` Peter Zijlstra
2009-09-22 8:05 ` Wu Fengguang
2009-09-22 8:09 ` Peter Zijlstra
2009-09-22 8:24 ` Wu Fengguang
2009-09-22 8:32 ` Peter Zijlstra
2009-09-22 8:51 ` Wu Fengguang
2009-09-22 8:52 ` Richard Kennedy
2009-09-22 9:05 ` Wu Fengguang
2009-09-22 11:41 ` Shaohua Li
2009-09-22 15:52 ` Chris Mason
2009-09-23 0:22 ` Wu Fengguang
2009-09-23 0:54 ` Andrew Morton
2009-09-23 1:17 ` Wu Fengguang
2009-09-23 1:27 ` Wu Fengguang
2009-09-23 1:28 ` Andrew Morton
2009-09-23 1:32 ` Wu Fengguang
2009-09-23 1:47 ` Andrew Morton
2009-09-23 2:01 ` Wu Fengguang
2009-09-23 2:09 ` Andrew Morton
2009-09-23 3:07 ` Wu Fengguang
2009-09-23 1:45 ` Wu Fengguang
2009-09-23 1:59 ` Andrew Morton
2009-09-23 2:26 ` Wu Fengguang
2009-09-23 2:36 ` Andrew Morton
2009-09-23 2:49 ` Wu Fengguang
2009-09-23 2:56 ` Andrew Morton
2009-09-23 3:11 ` Wu Fengguang
2009-09-23 3:10 ` Shaohua Li
2009-09-23 3:14 ` Wu Fengguang
2009-09-23 3:25 ` Wu Fengguang
2009-09-23 14:00 ` Chris Mason
2009-09-24 3:15 ` Wu Fengguang
2009-09-24 12:10 ` Chris Mason
2009-09-25 3:26 ` Wu Fengguang
2009-09-25 0:11 ` Dave Chinner
2009-09-25 0:38 ` Chris Mason
2009-09-25 5:04 ` Dave Chinner
2009-09-25 6:45 ` Wu Fengguang
2009-09-28 1:07 ` Dave Chinner
2009-09-28 7:15 ` Wu Fengguang
2009-09-28 13:08 ` Christoph Hellwig
2009-09-28 14:07 ` Theodore Tso
2009-09-30 5:26 ` Wu Fengguang
2009-09-30 5:32 ` Wu Fengguang
2009-10-01 22:17 ` Jan Kara
2009-10-02 3:27 ` Wu Fengguang
2009-10-06 12:55 ` Jan Kara
2009-10-06 13:18 ` Wu Fengguang
2009-09-30 14:11 ` Theodore Tso
2009-10-01 15:14 ` Wu Fengguang
2009-10-01 21:54 ` Theodore Tso
2009-10-02 2:55 ` Wu Fengguang
2009-10-02 8:19 ` Wu Fengguang
2009-10-02 17:26 ` Theodore Tso
2009-10-03 6:10 ` Wu Fengguang
2009-09-29 2:32 ` Wu Fengguang
2009-09-29 14:00 ` Chris Mason
2009-09-29 14:21 ` Christoph Hellwig
2009-09-29 0:15 ` Wu Fengguang
2009-09-28 14:25 ` Chris Mason
2009-09-29 23:39 ` Dave Chinner
2009-09-30 1:30 ` Wu Fengguang
2009-09-25 12:06 ` Chris Mason
2009-09-25 3:19 ` Wu Fengguang
2009-09-26 1:47 ` Dave Chinner
2009-09-26 3:02 ` Wu Fengguang
2009-09-23 9:19 ` Richard Kennedy
2009-09-23 9:23 ` Peter Zijlstra
2009-09-23 9:37 ` Wu Fengguang
2009-09-23 10:30 ` Wu Fengguang [this message]
2009-09-23 6:41 ` Shaohua Li
2009-09-22 10:49 ` Wu Fengguang
2009-09-22 11:50 ` Shaohua Li
2009-09-22 13:39 ` Wu Fengguang
2009-09-23 1:52 ` Shaohua Li
2009-09-23 4:00 ` Wu Fengguang
2009-09-25 6:14 ` 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=20090923103055.GA15291@localhost \
--to=fengguang.wu@intel.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=chris.mason@oracle.com \
--cc=jack@suse.cz \
--cc=jens.axboe@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=richard@rsk.demon.co.uk \
--cc=shaohua.li@intel.com \
/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