From: Wu Fengguang <fengguang.wu@intel.com>
To: Jeff Layton <jlayton@redhat.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>
Subject: Re: [PATCH] writeback: guard against jiffies wraparound on inode->dirtied_when checks (try #2)
Date: Wed, 1 Apr 2009 21:07:37 +0800 [thread overview]
Message-ID: <20090401130737.GA13729@localhost> (raw)
In-Reply-To: <20090401084843.560d89ea@barsoom.rdu.redhat.com>
On Wed, Apr 01, 2009 at 08:48:43PM +0800, Jeff Layton wrote:
> > > > --- mm.orig/fs/fs-writeback.c
> > > > +++ mm/fs/fs-writeback.c
> > > > @@ -196,7 +196,7 @@ static void redirty_tail(struct inode *i
> > > > struct inode *tail_inode;
> > > >
> > > > tail_inode = list_entry(sb->s_dirty.next, struct inode, i_list);
> > > > - if (!time_after_eq(inode->dirtied_when,
> > > > + if (time_before(inode->dirtied_when,
> > > > tail_inode->dirtied_when))
> > > > inode->dirtied_when = jiffies;
> > > > }
> > >
> > > I think we need a similar change in this function in order to maintain
> > > the list order.
> > >
> > > Consider this case:
> > >
> > > We have an s_dirty list with a head inode that appears to be in the
> > > future. We start writeback and clear out s_dirty (all of the inodes are
> > > moved to s_io). A new inode is dirtied, and goes onto the empty s_dirty
> > > list with a dirtied_when value that equals now. The inode with the
> > > dirtied_when value that looks like it's in the future is redirtied while
> > > being written and redirty_tail is called. It goes back on the list
> > > without resetting dirtied_when even though it's actually older than the
> > > inode at the tail.
> >
> > What's the difference? It _is_ the past because all 2 reference sites
> > are now taught to think so.
> >
> > So s_dirty is still in order, and the writeback process won't be blocked.
> >
>
> Sanity check -- my understanding is this:
>
> head == least-recently dirtied inode
> tail == most-recently dirtied inode
>
> ...if so, then we are violating the list order if we don't make a
> change to redirty_tail. We're putting an inode that's far in the past
> back onto the tail of the list without resetting dirtied_when. A more
> recently-dirtied inode will precede one that was dirtied less recently.
>
> Since the newly dirtied inode is closer to the head of the list, the
> older inode that's constantly being redirtied won't be written out
> until the newly dirtied one passes the older_than_this check (30s or
> so in the usual case).
If you call that out-of-order, yes it is. Sadly it cannot be improved
by playing with dirtied_when: the _physical_ order is still the same.
You know what? That's exactly the drawback of redirtying into s_dirty.
It's irrelevant to the resetting of dirtied_when. A new s_more_io_wait
is the only way to solve this problem.
> > > There is another option too that I'll throw out here...
> > >
> > > We could just make dirtied_when a 64 bit value on 32 bit machines and
> > > use jiffies_64 there. On the upside there is no "problematic
> > > window" with that. The downside is that struct inode would grow by 4
> > > bytes on 32 bit arches, and checking jiffies_64 on such an arch is
> > > more computationally intensive. We'd also have to change the size of
> > > older_than_this value in the writeback_control struct too if we want to
> > > go this route...
> >
> > Yes that could eliminate the 30s or more temporary writeback stillness.
> > The only problem is the extra costs for normal cases, especially the
> > space cost.
> >
>
> Correct. I'm not necessarily advocating that approach but it's one to
> consider...
>
> If your s_more_io_wait patchset comes to fruition though then that
> change really won't be needed, so maybe it's best not to go that route.
Sorry for the delay. But I'm still curious about the redirty
process&timing of NFS/XFS. The conflicts with Jens' per-bdi pdflush
patches are another concern...
Thanks,
Fengguang
next prev parent reply other threads:[~2009-04-01 13:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-01 0:03 [PATCH] writeback: guard against jiffies wraparound on inode->dirtied_when checks (try #2) Jeff Layton
2009-04-01 0:20 ` Andrew Morton
2009-04-01 0:50 ` Jeff Layton
2009-04-01 1:07 ` Andrew Morton
2009-04-01 6:56 ` Wu Fengguang
2009-04-01 11:53 ` Jeff Layton
2009-04-01 12:26 ` Wu Fengguang
2009-04-01 12:48 ` Jeff Layton
2009-04-01 13:07 ` Wu Fengguang [this message]
2009-04-01 14:35 ` Jeff Layton
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=20090401130737.GA13729@localhost \
--to=fengguang.wu@intel.com \
--cc=akpm@linux-foundation.org \
--cc=jlayton@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.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.