All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
@ 2013-03-14 13:30 Jan Kara
  2013-03-14 20:21 ` Carlos Maiolino
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Jan Kara @ 2013-03-14 13:30 UTC (permalink / raw)
  To: xfs; +Cc: Jan Kara

When a dirty page is truncated from a file but reclaim gets to it before
truncate_inode_pages(), we hit WARN_ON(delalloc) in
xfs_vm_releasepage(). This is because reclaim tries to write the page,
xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
thinks it can continue and calls xfs_vm_releasepage() on page with dirty
buffers.

Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
reclaim stop reclaiming the page and also logically it keeps page in a
more consistent state where page with dirty buffers has PageDirty set.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/xfs/xfs_aops.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
index 5f707e5..3244c98 100644
--- a/fs/xfs/xfs_aops.c
+++ b/fs/xfs/xfs_aops.c
@@ -953,13 +953,13 @@ xfs_vm_writepage(
 		unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1);
 
 		/*
-		 * Just skip the page if it is fully outside i_size, e.g. due
-		 * to a truncate operation that is in progress.
+		 * Skip the page if it is fully outside i_size, e.g. due to a
+		 * truncate operation that is in progress. We must redirty the
+		 * page so that reclaim stops reclaiming it. Otherwise
+		 * xfs_vm_releasepage() is called on it and gets confused.
 		 */
-		if (page->index >= end_index + 1 || offset_into_page == 0) {
-			unlock_page(page);
-			return 0;
-		}
+		if (page->index >= end_index + 1 || offset_into_page == 0)
+			goto redirty;
 
 		/*
 		 * The page straddles i_size.  It must be zeroed out on each
-- 
1.7.1

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-14 13:30 [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage() Jan Kara
@ 2013-03-14 20:21 ` Carlos Maiolino
  2013-03-15 20:52 ` Ben Myers
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: Carlos Maiolino @ 2013-03-14 20:21 UTC (permalink / raw)
  To: Jan Kara; +Cc: xfs

On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> When a dirty page is truncated from a file but reclaim gets to it before
> truncate_inode_pages(), we hit WARN_ON(delalloc) in
> xfs_vm_releasepage(). This is because reclaim tries to write the page,
> xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> buffers.
> 
> Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> reclaim stop reclaiming the page and also logically it keeps page in a
> more consistent state where page with dirty buffers has PageDirty set.
> 
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
>  fs/xfs/xfs_aops.c |   12 ++++++------
>  1 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c
> index 5f707e5..3244c98 100644
> --- a/fs/xfs/xfs_aops.c
> +++ b/fs/xfs/xfs_aops.c
> @@ -953,13 +953,13 @@ xfs_vm_writepage(
>  		unsigned offset_into_page = offset & (PAGE_CACHE_SIZE - 1);
>  
>  		/*
> -		 * Just skip the page if it is fully outside i_size, e.g. due
> -		 * to a truncate operation that is in progress.
> +		 * Skip the page if it is fully outside i_size, e.g. due to a
> +		 * truncate operation that is in progress. We must redirty the
> +		 * page so that reclaim stops reclaiming it. Otherwise
> +		 * xfs_vm_releasepage() is called on it and gets confused.
>  		 */
> -		if (page->index >= end_index + 1 || offset_into_page == 0) {
> -			unlock_page(page);
> -			return 0;
> -		}
> +		if (page->index >= end_index + 1 || offset_into_page == 0)
> +			goto redirty;
>  
>  		/*
>  		 * The page straddles i_size.  It must be zeroed out on each
> -- 
> 1.7.1
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs

Looks Good,
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

-- 
Carlos

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-14 13:30 [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage() Jan Kara
  2013-03-14 20:21 ` Carlos Maiolino
@ 2013-03-15 20:52 ` Ben Myers
  2013-03-18 16:05   ` Jan Kara
  2013-03-21  1:37   ` Dave Chinner
  2013-03-16  7:35 ` Dave Chinner
  2013-03-22 23:18 ` Ben Myers
  3 siblings, 2 replies; 10+ messages in thread
From: Ben Myers @ 2013-03-15 20:52 UTC (permalink / raw)
  To: Jan Kara; +Cc: xfs

Hi Jan,

On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> When a dirty page is truncated from a file but reclaim gets to it before
> truncate_inode_pages(), we hit WARN_ON(delalloc) in
> xfs_vm_releasepage(). This is because reclaim tries to write the page,
> xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> buffers.
> 
> Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> reclaim stop reclaiming the page and also logically it keeps page in a
> more consistent state where page with dirty buffers has PageDirty set.

Was there an easy way to reproduce this?  I'm testing and reviewing this now
and it might help.

Thanks much,
       Ben

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-14 13:30 [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage() Jan Kara
  2013-03-14 20:21 ` Carlos Maiolino
  2013-03-15 20:52 ` Ben Myers
@ 2013-03-16  7:35 ` Dave Chinner
  2013-03-22 23:18 ` Ben Myers
  3 siblings, 0 replies; 10+ messages in thread
From: Dave Chinner @ 2013-03-16  7:35 UTC (permalink / raw)
  To: Jan Kara; +Cc: xfs

On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> When a dirty page is truncated from a file but reclaim gets to it before
> truncate_inode_pages(), we hit WARN_ON(delalloc) in
> xfs_vm_releasepage(). This is because reclaim tries to write the page,
> xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> buffers.
> 
> Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> reclaim stop reclaiming the page and also logically it keeps page in a
> more consistent state where page with dirty buffers has PageDirty set.
> 
> Signed-off-by: Jan Kara <jack@suse.cz>

Definitely look s like a problem taht needs fixing, and it seems to
me to be the correct fix.

I got a bug report recently about this warning being triggered,
but the total report was the warning and a workload description
of "XFS produced a warning at some point during a 28 hour long DB
benchmark." Not particularly helpful, but this looks like a
potential cause. Thanks!

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-15 20:52 ` Ben Myers
@ 2013-03-18 16:05   ` Jan Kara
  2013-03-19  3:47     ` Dave Chinner
  2013-03-21  1:37   ` Dave Chinner
  1 sibling, 1 reply; 10+ messages in thread
From: Jan Kara @ 2013-03-18 16:05 UTC (permalink / raw)
  To: Ben Myers; +Cc: Jan Kara, xfs

[-- Attachment #1: Type: text/plain, Size: 1141 bytes --]

On Fri 15-03-13 15:52:14, Ben Myers wrote:
> Hi Jan,
> 
> On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> > When a dirty page is truncated from a file but reclaim gets to it before
> > truncate_inode_pages(), we hit WARN_ON(delalloc) in
> > xfs_vm_releasepage(). This is because reclaim tries to write the page,
> > xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> > thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> > buffers.
> > 
> > Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> > reclaim stop reclaiming the page and also logically it keeps page in a
> > more consistent state where page with dirty buffers has PageDirty set.
> 
> Was there an easy way to reproduce this?  I'm testing and reviewing this now
> and it might help.
  I used scripts/run-bash-shared-mapping.sh from the attached tarball - it
fires up several processes beating a file with mmap accesses while
truncating the file and memory stressing the machine. I presume fsx with
some memhog could trigger the issue as well.

									Honza
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

[-- Attachment #2: ext3-tools.tar.gz --]
[-- Type: application/x-compressed-tar, Size: 96501 bytes --]

[-- Attachment #3: Type: text/plain, Size: 121 bytes --]

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-18 16:05   ` Jan Kara
@ 2013-03-19  3:47     ` Dave Chinner
  2013-03-19 15:42       ` Jan Kara
  0 siblings, 1 reply; 10+ messages in thread
From: Dave Chinner @ 2013-03-19  3:47 UTC (permalink / raw)
  To: Jan Kara; +Cc: Ben Myers, xfs

On Mon, Mar 18, 2013 at 05:05:52PM +0100, Jan Kara wrote:
> On Fri 15-03-13 15:52:14, Ben Myers wrote:
> > Hi Jan,
> > 
> > On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> > > When a dirty page is truncated from a file but reclaim gets to it before
> > > truncate_inode_pages(), we hit WARN_ON(delalloc) in
> > > xfs_vm_releasepage(). This is because reclaim tries to write the page,
> > > xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> > > thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> > > buffers.
> > > 
> > > Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> > > reclaim stop reclaiming the page and also logically it keeps page in a
> > > more consistent state where page with dirty buffers has PageDirty set.
> > 
> > Was there an easy way to reproduce this?  I'm testing and reviewing this now
> > and it might help.
>   I used scripts/run-bash-shared-mapping.sh from the attached tarball - it
> fires up several processes beating a file with mmap accesses while
> truncating the file and memory stressing the machine. I presume fsx with
> some memhog could trigger the issue as well.

I have seen fsx trip this occasionally. The problem is that it was
never reliable because of the fact that other memory pressure had to
be generated at the same time....

Is the above script something you could turn into an xfstest (I
haven't looked at the script yet)?

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-19  3:47     ` Dave Chinner
@ 2013-03-19 15:42       ` Jan Kara
  0 siblings, 0 replies; 10+ messages in thread
From: Jan Kara @ 2013-03-19 15:42 UTC (permalink / raw)
  To: Dave Chinner; +Cc: Ben Myers, Jan Kara, xfs

On Tue 19-03-13 14:47:59, Dave Chinner wrote:
> On Mon, Mar 18, 2013 at 05:05:52PM +0100, Jan Kara wrote:
> > On Fri 15-03-13 15:52:14, Ben Myers wrote:
> > > Hi Jan,
> > > 
> > > On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> > > > When a dirty page is truncated from a file but reclaim gets to it before
> > > > truncate_inode_pages(), we hit WARN_ON(delalloc) in
> > > > xfs_vm_releasepage(). This is because reclaim tries to write the page,
> > > > xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> > > > thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> > > > buffers.
> > > > 
> > > > Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> > > > reclaim stop reclaiming the page and also logically it keeps page in a
> > > > more consistent state where page with dirty buffers has PageDirty set.
> > > 
> > > Was there an easy way to reproduce this?  I'm testing and reviewing this now
> > > and it might help.
> >   I used scripts/run-bash-shared-mapping.sh from the attached tarball - it
> > fires up several processes beating a file with mmap accesses while
> > truncating the file and memory stressing the machine. I presume fsx with
> > some memhog could trigger the issue as well.
> 
> I have seen fsx trip this occasionally. The problem is that it was
> never reliable because of the fact that other memory pressure had to
> be generated at the same time....
> 
> Is the above script something you could turn into an xfstest (I
> haven't looked at the script yet)?
  Yes, that should be doable. I'll try combining fsx and usemem whether
that will be enough to trigger the race.

								Honza
-- 
Jan Kara <jack@suse.cz>
SUSE Labs, CR

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-15 20:52 ` Ben Myers
  2013-03-18 16:05   ` Jan Kara
@ 2013-03-21  1:37   ` Dave Chinner
  2013-03-22 21:12     ` Ben Myers
  1 sibling, 1 reply; 10+ messages in thread
From: Dave Chinner @ 2013-03-21  1:37 UTC (permalink / raw)
  To: Ben Myers; +Cc: Jan Kara, xfs

On Fri, Mar 15, 2013 at 03:52:14PM -0500, Ben Myers wrote:
> Hi Jan,
> 
> On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> > When a dirty page is truncated from a file but reclaim gets to it before
> > truncate_inode_pages(), we hit WARN_ON(delalloc) in
> > xfs_vm_releasepage(). This is because reclaim tries to write the page,
> > xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> > thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> > buffers.
> > 
> > Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> > reclaim stop reclaiming the page and also logically it keeps page in a
> > more consistent state where page with dirty buffers has PageDirty set.
> 
> Was there an easy way to reproduce this?  I'm testing and reviewing this now
> and it might help.

This patch has been confirmed to fix the report generated by
the DB workload I mentioned in another part of the thread. Hence I
think it should be good to go.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-21  1:37   ` Dave Chinner
@ 2013-03-22 21:12     ` Ben Myers
  0 siblings, 0 replies; 10+ messages in thread
From: Ben Myers @ 2013-03-22 21:12 UTC (permalink / raw)
  To: Dave Chinner; +Cc: Jan Kara, xfs

On Thu, Mar 21, 2013 at 12:37:33PM +1100, Dave Chinner wrote:
> On Fri, Mar 15, 2013 at 03:52:14PM -0500, Ben Myers wrote:
> > Hi Jan,
> > 
> > On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> > > When a dirty page is truncated from a file but reclaim gets to it before
> > > truncate_inode_pages(), we hit WARN_ON(delalloc) in
> > > xfs_vm_releasepage(). This is because reclaim tries to write the page,
> > > xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> > > thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> > > buffers.
> > > 
> > > Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> > > reclaim stop reclaiming the page and also logically it keeps page in a
> > > more consistent state where page with dirty buffers has PageDirty set.
> > 
> > Was there an easy way to reproduce this?  I'm testing and reviewing this now
> > and it might help.
> 
> This patch has been confirmed to fix the report generated by
> the DB workload I mentioned in another part of the thread. Hence I
> think it should be good to go.

Agreed, Thanks.

-Ben

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage()
  2013-03-14 13:30 [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage() Jan Kara
                   ` (2 preceding siblings ...)
  2013-03-16  7:35 ` Dave Chinner
@ 2013-03-22 23:18 ` Ben Myers
  3 siblings, 0 replies; 10+ messages in thread
From: Ben Myers @ 2013-03-22 23:18 UTC (permalink / raw)
  To: Jan Kara; +Cc: xfs

On Thu, Mar 14, 2013 at 02:30:54PM +0100, Jan Kara wrote:
> When a dirty page is truncated from a file but reclaim gets to it before
> truncate_inode_pages(), we hit WARN_ON(delalloc) in
> xfs_vm_releasepage(). This is because reclaim tries to write the page,
> xfs_vm_writepage() just bails out (leaving page clean) and thus reclaim
> thinks it can continue and calls xfs_vm_releasepage() on page with dirty
> buffers.
> 
> Fix the issue by redirtying the page in xfs_vm_writepage(). This makes
> reclaim stop reclaiming the page and also logically it keeps page in a
> more consistent state where page with dirty buffers has PageDirty set.
> 
> Signed-off-by: Jan Kara <jack@suse.cz>

Applied.

Regards,
	Ben

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-03-22 23:18 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-14 13:30 [PATCH] xfs: Fix WARN_ON(delalloc) in xfs_vm_releasepage() Jan Kara
2013-03-14 20:21 ` Carlos Maiolino
2013-03-15 20:52 ` Ben Myers
2013-03-18 16:05   ` Jan Kara
2013-03-19  3:47     ` Dave Chinner
2013-03-19 15:42       ` Jan Kara
2013-03-21  1:37   ` Dave Chinner
2013-03-22 21:12     ` Ben Myers
2013-03-16  7:35 ` Dave Chinner
2013-03-22 23:18 ` Ben Myers

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.