From: Dave Chinner <david@fromorbit.com>
To: Wu Fengguang <fengguang.wu@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Christoph Hellwig <hch@infradead.org>,
Martin Bligh <mbligh@google.com>,
Michael Rubin <mrubin@google.com>,
Peter Zijlstra <peterz@infradead.org>, Jan Kara <jack@suse.cz>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
Linux Memory Management List <linux-mm@kvack.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 6/6] writeback: merge for_kupdate and !for_kupdate cases
Date: Tue, 13 Jul 2010 08:06:54 +1000 [thread overview]
Message-ID: <20100712220654.GH25335@dastard> (raw)
In-Reply-To: <20100712155239.GC30222@localhost>
On Mon, Jul 12, 2010 at 11:52:39PM +0800, Wu Fengguang wrote:
> On Mon, Jul 12, 2010 at 10:08:42AM +0800, Dave Chinner wrote:
> > On Sun, Jul 11, 2010 at 10:07:02AM +0800, Wu Fengguang wrote:
> > > - /*
> > > - * akpm: if the caller was the kupdate function we put
> > > - * this inode at the head of b_dirty so it gets first
> > > - * consideration. Otherwise, move it to the tail, for
> > > - * the reasons described there. I'm not really sure
> > > - * how much sense this makes. Presumably I had a good
> > > - * reasons for doing it this way, and I'd rather not
> > > - * muck with it at present.
> > > - */
> > > - if (wbc->for_kupdate) {
> > > + inode->i_state |= I_DIRTY_PAGES;
> > > + if (wbc->nr_to_write <= 0) {
> > > /*
> > > - * For the kupdate function we move the inode
> > > - * to b_more_io so it will get more writeout as
> > > - * soon as the queue becomes uncongested.
> > > + * slice used up: queue for next turn
> > > */
> > > - inode->i_state |= I_DIRTY_PAGES;
> > > - if (wbc->nr_to_write <= 0) {
> > > - /*
> > > - * slice used up: queue for next turn
> > > - */
> > > - requeue_io(inode);
> > > - } else {
> > > - /*
> > > - * somehow blocked: retry later
> > > - */
> > > - redirty_tail(inode);
> > > - }
> > > + requeue_io(inode);
> > > } else {
> > > /*
> > > - * Otherwise fully redirty the inode so that
> > > - * other inodes on this superblock will get some
> > > - * writeout. Otherwise heavy writing to one
> > > - * file would indefinitely suspend writeout of
> > > - * all the other files.
> > > + * somehow blocked: retry later
> > > */
> > > - inode->i_state |= I_DIRTY_PAGES;
> > > redirty_tail(inode);
> > > }
> >
> > This means that congestion will always trigger redirty_tail(). Is
> > that really what we want for that case?
>
> This patch actually converts some redirty_tail() cases to use
> requeue_io(), so are reducing the use of redirty_tail(). Also
> recent kernels are blocked _inside_ get_request() on congestion
> instead of returning to writeback_single_inode() on congestion.
> So the "somehow blocked" comment for redirty_tail() no longer includes
> the congestion case.
Shouldn't some of this be in the comment explain why the tail is
redirtied rather than requeued?
> > Also, I'd prefer that the
> > comments remain somewhat more descriptive of the circumstances that
> > we are operating under. Comments like "retry later to avoid blocking
> > writeback of other inodes" is far, far better than "retry later"
> > because it has "why" component that explains the reason for the
> > logic. You may remember why, but I sure won't in a few months time....
>
> Ah yes the comment is too simple. However the redirty_tail() is not to
> avoid blocking writeback of other inodes, but to avoid eating 100% CPU
> on busy retrying a dirty inode/page that cannot perform writeback for
> a while. (In theory redirty_tail() can still busy retry though, when
> there is only one single dirty inode.) So how about
>
> /*
> * somehow blocked: avoid busy retrying
> */
IMO, no better than "somehow blocked: retry later" because it
desont' include any of the explanation for the code you just gave
me. The comment needs to tell us _why_ we are calling
redirty_tail, not what redirty_tail does. Perhaps something like:
/*
* Writeback blocked by something other than congestion.
* Redirty the inode to avoid spinning on the CPU retrying
* writeback of the dirty page/inode that cannot be
* performed immediately. This allows writeback of other
* inodes until the blocking condition clears.
*/
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
WARNING: multiple messages have this Message-ID (diff)
From: Dave Chinner <david@fromorbit.com>
To: Wu Fengguang <fengguang.wu@intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Christoph Hellwig <hch@infradead.org>,
Martin Bligh <mbligh@google.com>,
Michael Rubin <mrubin@google.com>,
Peter Zijlstra <peterz@infradead.org>, Jan Kara <jack@suse.cz>,
Peter Zijlstra <a.p.zijlstra@chello.nl>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
Linux Memory Management List <linux-mm@kvack.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 6/6] writeback: merge for_kupdate and !for_kupdate cases
Date: Tue, 13 Jul 2010 08:06:54 +1000 [thread overview]
Message-ID: <20100712220654.GH25335@dastard> (raw)
In-Reply-To: <20100712155239.GC30222@localhost>
On Mon, Jul 12, 2010 at 11:52:39PM +0800, Wu Fengguang wrote:
> On Mon, Jul 12, 2010 at 10:08:42AM +0800, Dave Chinner wrote:
> > On Sun, Jul 11, 2010 at 10:07:02AM +0800, Wu Fengguang wrote:
> > > - /*
> > > - * akpm: if the caller was the kupdate function we put
> > > - * this inode at the head of b_dirty so it gets first
> > > - * consideration. Otherwise, move it to the tail, for
> > > - * the reasons described there. I'm not really sure
> > > - * how much sense this makes. Presumably I had a good
> > > - * reasons for doing it this way, and I'd rather not
> > > - * muck with it at present.
> > > - */
> > > - if (wbc->for_kupdate) {
> > > + inode->i_state |= I_DIRTY_PAGES;
> > > + if (wbc->nr_to_write <= 0) {
> > > /*
> > > - * For the kupdate function we move the inode
> > > - * to b_more_io so it will get more writeout as
> > > - * soon as the queue becomes uncongested.
> > > + * slice used up: queue for next turn
> > > */
> > > - inode->i_state |= I_DIRTY_PAGES;
> > > - if (wbc->nr_to_write <= 0) {
> > > - /*
> > > - * slice used up: queue for next turn
> > > - */
> > > - requeue_io(inode);
> > > - } else {
> > > - /*
> > > - * somehow blocked: retry later
> > > - */
> > > - redirty_tail(inode);
> > > - }
> > > + requeue_io(inode);
> > > } else {
> > > /*
> > > - * Otherwise fully redirty the inode so that
> > > - * other inodes on this superblock will get some
> > > - * writeout. Otherwise heavy writing to one
> > > - * file would indefinitely suspend writeout of
> > > - * all the other files.
> > > + * somehow blocked: retry later
> > > */
> > > - inode->i_state |= I_DIRTY_PAGES;
> > > redirty_tail(inode);
> > > }
> >
> > This means that congestion will always trigger redirty_tail(). Is
> > that really what we want for that case?
>
> This patch actually converts some redirty_tail() cases to use
> requeue_io(), so are reducing the use of redirty_tail(). Also
> recent kernels are blocked _inside_ get_request() on congestion
> instead of returning to writeback_single_inode() on congestion.
> So the "somehow blocked" comment for redirty_tail() no longer includes
> the congestion case.
Shouldn't some of this be in the comment explain why the tail is
redirtied rather than requeued?
> > Also, I'd prefer that the
> > comments remain somewhat more descriptive of the circumstances that
> > we are operating under. Comments like "retry later to avoid blocking
> > writeback of other inodes" is far, far better than "retry later"
> > because it has "why" component that explains the reason for the
> > logic. You may remember why, but I sure won't in a few months time....
>
> Ah yes the comment is too simple. However the redirty_tail() is not to
> avoid blocking writeback of other inodes, but to avoid eating 100% CPU
> on busy retrying a dirty inode/page that cannot perform writeback for
> a while. (In theory redirty_tail() can still busy retry though, when
> there is only one single dirty inode.) So how about
>
> /*
> * somehow blocked: avoid busy retrying
> */
IMO, no better than "somehow blocked: retry later" because it
desont' include any of the explanation for the code you just gave
me. The comment needs to tell us _why_ we are calling
redirty_tail, not what redirty_tail does. Perhaps something like:
/*
* Writeback blocked by something other than congestion.
* Redirty the inode to avoid spinning on the CPU retrying
* writeback of the dirty page/inode that cannot be
* performed immediately. This allows writeback of other
* inodes until the blocking condition clears.
*/
Cheers,
Dave.
--
Dave Chinner
david@fromorbit.com
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-07-12 22:07 UTC|newest]
Thread overview: 81+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-11 2:06 [PATCH 0/6] writeback cleanups and trivial fixes Wu Fengguang
2010-07-11 2:06 ` Wu Fengguang
2010-07-11 2:06 ` Wu Fengguang
2010-07-11 2:06 ` [PATCH 1/6] writeback: take account of NR_WRITEBACK_TEMP in balance_dirty_pages() Wu Fengguang
2010-07-11 2:06 ` Wu Fengguang
2010-07-12 21:52 ` Andrew Morton
2010-07-12 21:52 ` Andrew Morton
2010-07-12 21:52 ` Andrew Morton
2010-07-13 8:58 ` Miklos Szeredi
2010-07-13 8:58 ` Miklos Szeredi
2010-07-15 14:50 ` Wu Fengguang
2010-07-15 14:50 ` Wu Fengguang
2010-07-11 2:06 ` [PATCH 2/6] writeback: reduce calls to global_page_state " Wu Fengguang
2010-07-11 2:06 ` Wu Fengguang
2010-07-11 2:06 ` Wu Fengguang
2010-07-26 15:19 ` Jan Kara
2010-07-26 15:19 ` Jan Kara
2010-07-27 3:59 ` Wu Fengguang
2010-07-27 3:59 ` Wu Fengguang
2010-07-27 9:12 ` Jan Kara
2010-07-27 9:12 ` Jan Kara
2010-07-28 2:04 ` Wu Fengguang
2010-07-28 2:04 ` Wu Fengguang
2010-08-03 14:55 ` Peter Zijlstra
2010-08-03 14:55 ` Peter Zijlstra
2010-07-11 2:06 ` [PATCH 3/6] writeback: avoid unnecessary calculation of bdi dirty thresholds Wu Fengguang
2010-07-11 2:06 ` Wu Fengguang
2010-07-11 2:06 ` Wu Fengguang
2010-07-12 21:56 ` Andrew Morton
2010-07-12 21:56 ` Andrew Morton
2010-07-12 21:56 ` Andrew Morton
2010-07-15 14:55 ` Wu Fengguang
2010-07-15 14:55 ` Wu Fengguang
2010-07-19 21:35 ` Andrew Morton
2010-07-19 21:35 ` Andrew Morton
2010-07-19 21:35 ` Andrew Morton
2010-07-20 3:34 ` Wu Fengguang
2010-07-20 3:34 ` Wu Fengguang
2010-07-20 3:34 ` Wu Fengguang
2010-07-20 4:14 ` Andrew Morton
2010-07-20 4:14 ` Andrew Morton
2010-08-03 15:03 ` Peter Zijlstra
2010-08-03 15:03 ` Peter Zijlstra
2010-08-03 15:10 ` Wu Fengguang
2010-08-03 15:10 ` Wu Fengguang
2010-08-04 16:41 ` Wu Fengguang
2010-08-04 16:41 ` Wu Fengguang
2010-08-04 17:10 ` Peter Zijlstra
2010-08-04 17:10 ` Peter Zijlstra
2010-07-11 2:07 ` [PATCH 4/6] writeback: dont redirty tail an inode with dirty pages Wu Fengguang
2010-07-11 2:07 ` Wu Fengguang
2010-07-12 2:01 ` Dave Chinner
2010-07-12 2:01 ` Dave Chinner
2010-07-12 15:31 ` Wu Fengguang
2010-07-12 15:31 ` Wu Fengguang
2010-07-12 22:13 ` Andrew Morton
2010-07-12 22:13 ` Andrew Morton
2010-07-15 15:35 ` Wu Fengguang
2010-07-15 15:35 ` Wu Fengguang
2010-07-11 2:07 ` [PATCH 5/6] writeback: fix queue_io() ordering Wu Fengguang
2010-07-11 2:07 ` Wu Fengguang
2010-07-11 2:07 ` Wu Fengguang
2010-07-12 22:15 ` Andrew Morton
2010-07-12 22:15 ` Andrew Morton
2010-07-12 22:15 ` Andrew Morton
2010-07-11 2:07 ` [PATCH 6/6] writeback: merge for_kupdate and !for_kupdate cases Wu Fengguang
2010-07-11 2:07 ` Wu Fengguang
2010-07-12 2:08 ` Dave Chinner
2010-07-12 2:08 ` Dave Chinner
2010-07-12 15:52 ` Wu Fengguang
2010-07-12 15:52 ` Wu Fengguang
2010-07-12 22:06 ` Dave Chinner [this message]
2010-07-12 22:06 ` Dave Chinner
2010-07-12 22:22 ` Andrew Morton
2010-07-12 22:22 ` Andrew Morton
2010-08-05 16:01 ` Wu Fengguang
2010-08-05 16:01 ` Wu Fengguang
2010-07-11 2:44 ` [PATCH 0/6] writeback cleanups and trivial fixes Christoph Hellwig
2010-07-11 2:44 ` Christoph Hellwig
2010-07-11 2:50 ` Wu Fengguang
2010-07-11 2:50 ` 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=20100712220654.GH25335@dastard \
--to=david@fromorbit.com \
--cc=a.p.zijlstra@chello.nl \
--cc=akpm@linux-foundation.org \
--cc=fengguang.wu@intel.com \
--cc=hch@infradead.org \
--cc=jack@suse.cz \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mbligh@google.com \
--cc=mrubin@google.com \
--cc=peterz@infradead.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.