All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chuck Lever <chuck.lever@oracle.com>
To: Andrew Morton <akpm@osdl.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Nick Piggin <nickpiggin@yahoo.com.au>,
	Trond Myklebust <Trond.Myklebust@netapp.com>,
	Steve Dickson <steved@redhat.com>,
	linux-mm@kvack.org
Subject: Re: Checking page_count(page) in invalidate_complete_page
Date: Fri, 29 Sep 2006 17:48:23 -0400	[thread overview]
Message-ID: <451D94A7.9060905@oracle.com> (raw)
In-Reply-To: <20060929144421.48f9f1bd.akpm@osdl.org>

Andrew Morton wrote:
> buggerit, let's do this.  It'll fix NFS, yes?

It looks right to me.  I'll discuss a patch with Trond that adds a 
warning in nfs_revalidate_mapping() and perhaps a performance counter to 
see how many times we hit this in practice.

> From: Andrew Morton <akpm@osdl.org>
> 
> The recent fix to invalidate_inode_pages() (git commit 016eb4a) managed to
> unfix invalidate_inode_pages2().
> 
> The problem is that various bits of code in the kernel can take transient refs
> on pages: the page scanner will do this when inspecting a batch of pages, and
> the lru_cache_add() batching pagevecs also hold a ref.
> 
> Net result is transient failures in invalidate_inode_pages2().  This affects
> NFS directory invalidation (observed) and presumably also block-backed
> direct-io (not yet reported).
> 
> Fix it by reverting invalidate_inode_pages2() back to the old version which
> ignores the page refcounts.
> 
> We may come up with something more clever later, but for now we need a 2.6.18
> fix for NFS.
> 
> Cc: Chuck Lever <cel@citi.umich.edu>
> Cc: Nick Piggin <nickpiggin@yahoo.com.au>
> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
> Cc: <stable@kernel.org>
> Signed-off-by: Andrew Morton <akpm@osdl.org>
> ---
> 
>  mm/truncate.c |   34 ++++++++++++++++++++++++++++++++--
>  1 files changed, 32 insertions(+), 2 deletions(-)
> 
> diff -puN mm/truncate.c~invalidate_inode_pages2-ignore-page-refcounts mm/truncate.c
> --- a/mm/truncate.c~invalidate_inode_pages2-ignore-page-refcounts
> +++ a/mm/truncate.c
> @@ -261,9 +261,39 @@ unsigned long invalidate_inode_pages(str
>  {
>  	return invalidate_mapping_pages(mapping, 0, ~0UL);
>  }
> -
>  EXPORT_SYMBOL(invalidate_inode_pages);
>  
> +/*
> + * This is like invalidate_complete_page(), except it ignores the page's
> + * refcount.  We do this because invalidate_indoe_pages2() needs stronger
> + * invalidation guarantees, and cannot afford to leave pages behind because
> + * shrink_list() has a temp ref on them, or because they're transiently sitting
> + * in the lru_cache_add() pagevecs.
> + */
> +static int
> +invalidate_complete_page2(struct address_space *mapping, struct page *page)
> +{
> +	if (page->mapping != mapping)
> +		return 0;
> +
> +	if (PagePrivate(page) && !try_to_release_page(page, 0))
> +		return 0;
> +
> +	write_lock_irq(&mapping->tree_lock);
> +	if (PageDirty(page))
> +		goto failed;
> +
> +	BUG_ON(PagePrivate(page));
> +	__remove_from_page_cache(page);
> +	write_unlock_irq(&mapping->tree_lock);
> +	ClearPageUptodate(page);
> +	page_cache_release(page);	/* pagecache ref */
> +	return 1;
> +failed:
> +	write_unlock_irq(&mapping->tree_lock);
> +	return 0;
> +}
> +
>  /**
>   * invalidate_inode_pages2_range - remove range of pages from an address_space
>   * @mapping: the address_space
> @@ -330,7 +360,7 @@ int invalidate_inode_pages2_range(struct
>  				}
>  			}
>  			was_dirty = test_clear_page_dirty(page);
> -			if (!invalidate_complete_page(mapping, page)) {
> +			if (!invalidate_complete_page2(mapping, page)) {
>  				if (was_dirty)
>  					set_page_dirty(page);
>  				ret = -EIO;
> _
> 

--
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>

  reply	other threads:[~2006-09-29 21:48 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <4518333E.2060101@oracle.com>
2006-09-25 21:10 ` Checking page_count(page) in invalidate_complete_page Andrew Morton
2006-09-25 22:30   ` Chuck Lever
2006-09-25 22:53     ` Andrew Morton
2006-09-25 22:57     ` Steve Dickson
2006-09-25 23:14       ` Nick Piggin
2006-09-25 22:40   ` Chuck Lever
2006-09-25 23:02     ` Andrew Morton
2006-09-25 22:50   ` Steve Dickson
2006-09-25 22:51   ` Nick Piggin
2006-09-25 23:14     ` Chuck Lever
2006-09-25 23:21       ` Nick Piggin
2006-09-26  0:01         ` Chuck Lever
2006-09-26  0:13           ` Nick Piggin
2006-09-26  1:33             ` Chuck Lever
2006-09-26  1:48               ` Nick Piggin
2006-09-28 16:26                 ` Chuck Lever
2006-09-28 16:36                   ` Andrew Morton
2006-09-28 16:40                     ` Andrew Morton
2006-09-28 16:42                       ` Chuck Lever
2006-09-28 17:03                         ` Andrew Morton
2006-09-28 17:09                           ` Chuck Lever
2006-09-29  0:37                             ` Nick Piggin
2006-09-29 20:34                               ` Chuck Lever
2006-09-29 20:45                                 ` Peter Zijlstra
2006-09-29 21:02                                   ` Chuck Lever
2006-09-29 21:17                                     ` Peter Zijlstra
2006-09-29 21:44                                       ` Andrew Morton
2006-09-29 21:48                                         ` Chuck Lever [this message]
2006-09-29 22:29                                           ` Andrew Morton
2006-09-29 23:05                                             ` Chuck Lever
2006-10-01  4:21                                             ` Chuck Lever
2006-10-02 12:01                                               ` Steve Dickson
2006-10-02 13:25                                                 ` Trond Myklebust
2006-10-02 16:57                                                   ` Andrew Morton
2006-10-02 17:02                                                     ` Steve Dickson
2006-10-02 18:20                                                       ` Andrew Morton
2006-10-02 19:02                                                         ` Steve Dickson
2006-10-03  2:14                                                           ` Chuck Lever
2006-10-03  4:18                                                             ` Trond Myklebust
2006-10-03  4:24                                                               ` Andrew Morton
2006-10-03 18:50                                                               ` Chuck Lever
2006-10-03 19:10                                                                 ` Trond Myklebust
2006-10-03 19:21                                                                   ` Chuck Lever
2006-10-03 21:37                                                                   ` Andrew Morton
2006-10-04 19:29                                                                     ` Chuck Lever
2006-10-04 19:43                                                                       ` Andrew Morton
2006-10-04 19:53                                                                         ` Steve Dickson
2006-09-28 16:41                     ` Chuck Lever
2006-09-26  6:25               ` Nick Piggin
2006-09-26 13:12                 ` Chuck Lever
2006-09-27  4:47                   ` Nick Piggin
2006-09-27  8:25                     ` Andrew Morton
2006-09-27  8:39                       ` Nick Piggin
2006-09-27 16:03                         ` Andrew Morton
2006-09-27 15:54                     ` Chuck Lever
2006-09-25 22:56   ` Chuck Lever

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=451D94A7.9060905@oracle.com \
    --to=chuck.lever@oracle.com \
    --cc=Trond.Myklebust@netapp.com \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@osdl.org \
    --cc=linux-mm@kvack.org \
    --cc=nickpiggin@yahoo.com.au \
    --cc=steved@redhat.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 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.