xfs
[Top] [All Lists]

Re: [PATCH] xfs: flush vmap aliases when mapping fails

To: Dave Chinner <david@xxxxxxxxxxxxx>
Subject: Re: [PATCH] xfs: flush vmap aliases when mapping fails
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Thu, 10 Mar 2011 02:37:51 -0500
Cc: xfs@xxxxxxxxxxx, npiggin@xxxxxxxxx, linux-mm@xxxxxxxxx
In-reply-to: <1299713876-7747-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1299713876-7747-1-git-send-email-david@xxxxxxxxxxxxx>
User-agent: Mutt/1.5.21 (2010-09-15)
On Thu, Mar 10, 2011 at 10:37:56AM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@xxxxxxxxxx>
> 
> On 32 bit systems, vmalloc space is limited and XFS can chew through
> it quickly as the vmalloc space is lazily freed. This can result in
> failure to map buffers, even when there is apparently large amounts
> of vmalloc space available. Hence, if we fail to map a buffer, purge
> the aliases that have not yet been freed to hopefuly free up enough
> vmalloc space to allow a retry to succeed.

IMHO this should be done by vm_map_ram internally.  If we can't get the
core code fixes we can put this in as a last resort.

> 
> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
> ---
>  fs/xfs/linux-2.6/xfs_buf.c |   14 +++++++++++---
>  1 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
> index 3cc671c..a5a260f 100644
> --- a/fs/xfs/linux-2.6/xfs_buf.c
> +++ b/fs/xfs/linux-2.6/xfs_buf.c
> @@ -455,9 +455,17 @@ _xfs_buf_map_pages(
>               bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset;
>               bp->b_flags |= XBF_MAPPED;
>       } else if (flags & XBF_MAPPED) {
> -             bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
> -                                     -1, PAGE_KERNEL);
> -             if (unlikely(bp->b_addr == NULL))
> +             int retried = 0;
> +
> +             do {
> +                     bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count,
> +                                             -1, PAGE_KERNEL);
> +                     if (bp->b_addr)
> +                             break;
> +                     vm_unmap_aliases();
> +             } while (retried++ <= 1);
> +
> +             if (!bp->b_addr)
>                       return -ENOMEM;
>               bp->b_addr += bp->b_offset;
>               bp->b_flags |= XBF_MAPPED;
> -- 
> 1.7.2.3
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs
---end quoted text---

<Prev in Thread] Current Thread [Next in Thread>