All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails
@ 2017-01-26  3:53 Darrick J. Wong
  2017-01-26  4:14 ` Eric Sandeen
  2017-01-28 22:55 ` Dave Chinner
  0 siblings, 2 replies; 7+ messages in thread
From: Darrick J. Wong @ 2017-01-26  3:53 UTC (permalink / raw)
  To: Eric Sandeen; +Cc: linux-xfs

If we try to allocate memory pages to back an xfs_buf that we're trying
to read, it's possible that we'll be so short on memory that the page
allocation fails.  For a blocking read we'll just wait, but for
readahead we simply dump all the pages we've collected so far.

Unfortunately, after dumping the pages we neglect to clear the
_XBF_PAGES state, which means that the subsequent call to xfs_buf_free
thinks that b_pages still points to pages we own.  It then double-frees
the b_pages pages.

This results in screaming about negative page refcounts from the memory
manager, which xfs oughtn't be triggering.  To reproduce this case,
mount a filesystem where the size of the inodes far outweighs the
availalble memory (a ~500M inode filesystem on a VM with 300MB memory
did the trick here) and run bulkstat in parallel with other memory
eating processes to put a huge load on the system.  The "check summary"
phase of xfs_scrub also works for this purpose.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
 fs/xfs/xfs_buf.c |    1 +
 1 file changed, 1 insertion(+)

diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
index 7f0a01f..ac3b4db 100644
--- a/fs/xfs/xfs_buf.c
+++ b/fs/xfs/xfs_buf.c
@@ -422,6 +422,7 @@ xfs_buf_allocate_memory(
 out_free_pages:
 	for (i = 0; i < bp->b_page_count; i++)
 		__free_page(bp->b_pages[i]);
+	bp->b_flags &= ~_XBF_PAGES;
 	return error;
 }
 

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

* Re: [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails
  2017-01-26  3:53 [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails Darrick J. Wong
@ 2017-01-26  4:14 ` Eric Sandeen
  2017-01-28 22:55 ` Dave Chinner
  1 sibling, 0 replies; 7+ messages in thread
From: Eric Sandeen @ 2017-01-26  4:14 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: linux-xfs

On 1/25/17 9:53 PM, Darrick J. Wong wrote:
> If we try to allocate memory pages to back an xfs_buf that we're trying
> to read, it's possible that we'll be so short on memory that the page
> allocation fails.  For a blocking read we'll just wait, but for
> readahead we simply dump all the pages we've collected so far.
> 
> Unfortunately, after dumping the pages we neglect to clear the
> _XBF_PAGES state, which means that the subsequent call to xfs_buf_free
> thinks that b_pages still points to pages we own.  It then double-frees
> the b_pages pages.
> 
> This results in screaming about negative page refcounts from the memory
> manager, which xfs oughtn't be triggering.  To reproduce this case,
> mount a filesystem where the size of the inodes far outweighs the
> availalble memory (a ~500M inode filesystem on a VM with 300MB memory
> did the trick here) and run bulkstat in parallel with other memory
> eating processes to put a huge load on the system.  The "check summary"
> phase of xfs_scrub also works for this purpose.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Thanks for the updated changelog, looks good.

Reviewed-by: Eric Sandeen <sandeen@redhat.com>

> ---
>  fs/xfs/xfs_buf.c |    1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index 7f0a01f..ac3b4db 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -422,6 +422,7 @@ xfs_buf_allocate_memory(
>  out_free_pages:
>  	for (i = 0; i < bp->b_page_count; i++)
>  		__free_page(bp->b_pages[i]);
> +	bp->b_flags &= ~_XBF_PAGES;
>  	return error;
>  }
>  
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

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

* Re: [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails
  2017-01-26  3:53 [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails Darrick J. Wong
  2017-01-26  4:14 ` Eric Sandeen
@ 2017-01-28 22:55 ` Dave Chinner
  2017-01-30 23:35   ` Darrick J. Wong
  1 sibling, 1 reply; 7+ messages in thread
From: Dave Chinner @ 2017-01-28 22:55 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: Eric Sandeen, linux-xfs

On Wed, Jan 25, 2017 at 07:53:30PM -0800, Darrick J. Wong wrote:
> If we try to allocate memory pages to back an xfs_buf that we're trying
> to read, it's possible that we'll be so short on memory that the page
> allocation fails.  For a blocking read we'll just wait, but for
> readahead we simply dump all the pages we've collected so far.
> 
> Unfortunately, after dumping the pages we neglect to clear the
> _XBF_PAGES state, which means that the subsequent call to xfs_buf_free
> thinks that b_pages still points to pages we own.  It then double-frees
> the b_pages pages.
> 
> This results in screaming about negative page refcounts from the memory
> manager, which xfs oughtn't be triggering.  To reproduce this case,
> mount a filesystem where the size of the inodes far outweighs the
> availalble memory (a ~500M inode filesystem on a VM with 300MB memory
> did the trick here) and run bulkstat in parallel with other memory
> eating processes to put a huge load on the system.  The "check summary"
> phase of xfs_scrub also works for this purpose.
> 
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>

Can you rename the patch "prevent double free of buffer pages on
readahead failure"? That way people looking for commits to backport
are going to see it clearly and easily....

And I think it also needs a stable cc....

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

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

* Re: [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails
  2017-01-28 22:55 ` Dave Chinner
@ 2017-01-30 23:35   ` Darrick J. Wong
  2017-01-30 23:44     ` Darrick J. Wong
  0 siblings, 1 reply; 7+ messages in thread
From: Darrick J. Wong @ 2017-01-30 23:35 UTC (permalink / raw)
  To: Dave Chinner; +Cc: Eric Sandeen, linux-xfs

On Sun, Jan 29, 2017 at 09:55:17AM +1100, Dave Chinner wrote:
> On Wed, Jan 25, 2017 at 07:53:30PM -0800, Darrick J. Wong wrote:
> > If we try to allocate memory pages to back an xfs_buf that we're trying
> > to read, it's possible that we'll be so short on memory that the page
> > allocation fails.  For a blocking read we'll just wait, but for
> > readahead we simply dump all the pages we've collected so far.
> > 
> > Unfortunately, after dumping the pages we neglect to clear the
> > _XBF_PAGES state, which means that the subsequent call to xfs_buf_free
> > thinks that b_pages still points to pages we own.  It then double-frees
> > the b_pages pages.
> > 
> > This results in screaming about negative page refcounts from the memory
> > manager, which xfs oughtn't be triggering.  To reproduce this case,
> > mount a filesystem where the size of the inodes far outweighs the
> > availalble memory (a ~500M inode filesystem on a VM with 300MB memory
> > did the trick here) and run bulkstat in parallel with other memory
> > eating processes to put a huge load on the system.  The "check summary"
> > phase of xfs_scrub also works for this purpose.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Can you rename the patch "prevent double free of buffer pages on
> readahead failure"? That way people looking for commits to backport
> are going to see it clearly and easily....

Uh... this patch was already in Linus' tree by the time I received this reply,
so I don't think I can change it.

> And I think it also needs a stable cc....

Will send it to the stable list.

--D

> 
> Cheers,
> 
> Dave.
> -- 
> Dave Chinner
> david@fromorbit.com

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

* Re: [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails
  2017-01-30 23:35   ` Darrick J. Wong
@ 2017-01-30 23:44     ` Darrick J. Wong
  2017-01-31  7:31       ` Christoph Hellwig
  0 siblings, 1 reply; 7+ messages in thread
From: Darrick J. Wong @ 2017-01-30 23:44 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Dave Chinner, Eric Sandeen, linux-xfs

[add hch to the thread]

On Mon, Jan 30, 2017 at 03:35:57PM -0800, Darrick J. Wong wrote:
> On Sun, Jan 29, 2017 at 09:55:17AM +1100, Dave Chinner wrote:
> > On Wed, Jan 25, 2017 at 07:53:30PM -0800, Darrick J. Wong wrote:
> > > If we try to allocate memory pages to back an xfs_buf that we're trying
> > > to read, it's possible that we'll be so short on memory that the page
> > > allocation fails.  For a blocking read we'll just wait, but for
> > > readahead we simply dump all the pages we've collected so far.
> > > 
> > > Unfortunately, after dumping the pages we neglect to clear the
> > > _XBF_PAGES state, which means that the subsequent call to xfs_buf_free
> > > thinks that b_pages still points to pages we own.  It then double-frees
> > > the b_pages pages.
> > > 
> > > This results in screaming about negative page refcounts from the memory
> > > manager, which xfs oughtn't be triggering.  To reproduce this case,
> > > mount a filesystem where the size of the inodes far outweighs the
> > > availalble memory (a ~500M inode filesystem on a VM with 300MB memory
> > > did the trick here) and run bulkstat in parallel with other memory
> > > eating processes to put a huge load on the system.  The "check summary"
> > > phase of xfs_scrub also works for this purpose.
> > > 
> > > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > 
> > Can you rename the patch "prevent double free of buffer pages on
> > readahead failure"? That way people looking for commits to backport
> > are going to see it clearly and easily....
> 
> Uh... this patch was already in Linus' tree by the time I received this reply,
> so I don't think I can change it.
> 
> > And I think it also needs a stable cc....
> 
> Will send it to the stable list.

Actually -- Christoph, are you planning to send another batch of XFS
fixes for 4.9?

--D

> 
> --D
> 
> > 
> > Cheers,
> > 
> > Dave.
> > -- 
> > Dave Chinner
> > david@fromorbit.com
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails
  2017-01-30 23:44     ` Darrick J. Wong
@ 2017-01-31  7:31       ` Christoph Hellwig
  2017-01-31  7:41         ` Darrick J. Wong
  0 siblings, 1 reply; 7+ messages in thread
From: Christoph Hellwig @ 2017-01-31  7:31 UTC (permalink / raw)
  To: Darrick J. Wong; +Cc: Christoph Hellwig, Dave Chinner, Eric Sandeen, linux-xfs

On Mon, Jan 30, 2017 at 03:44:15PM -0800, Darrick J. Wong wrote:
> Actually -- Christoph, are you planning to send another batch of XFS
> fixes for 4.9?

Yes, it is on my todo list for this week.

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

* Re: [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails
  2017-01-31  7:31       ` Christoph Hellwig
@ 2017-01-31  7:41         ` Darrick J. Wong
  0 siblings, 0 replies; 7+ messages in thread
From: Darrick J. Wong @ 2017-01-31  7:41 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: Dave Chinner, Eric Sandeen, linux-xfs

On Mon, Jan 30, 2017 at 11:31:47PM -0800, Christoph Hellwig wrote:
> On Mon, Jan 30, 2017 at 03:44:15PM -0800, Darrick J. Wong wrote:
> > Actually -- Christoph, are you planning to send another batch of XFS
> > fixes for 4.9?
> 
> Yes, it is on my todo list for this week.

Ok, thanks!

--D

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

end of thread, other threads:[~2017-01-31  7:43 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-26  3:53 [PATCH v2] xfs: clear _XBF_PAGES from buffers when readahead page allocation fails Darrick J. Wong
2017-01-26  4:14 ` Eric Sandeen
2017-01-28 22:55 ` Dave Chinner
2017-01-30 23:35   ` Darrick J. Wong
2017-01-30 23:44     ` Darrick J. Wong
2017-01-31  7:31       ` Christoph Hellwig
2017-01-31  7:41         ` Darrick J. Wong

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.