Re: Bad use of highmem with buffer_migrate_page?

From: Rabin Vincent
Date: Thu Jul 05 2012 - 06:45:31 EST


On Thu, Jul 05, 2012 at 12:05:45PM +0200, Marek Szyprowski wrote:
> On Thursday, July 05, 2012 11:28 AM Rabin Vincent wrote:
> > The problem is still present on latest mainline. The filesystem layer
> > expects that the pages in the block device's mapping are not in highmem
> > (the mapping's gfp mask is set in bdget()), but CMA replaces lowmem
> > pages with highmem pages leading to the crashes.
> >
> > The above fix should work, but perhaps the following is preferable since
> > it should allow moving highmem pages to other highmem pages?
>
> > diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> > index 4403009..4a4f921 100644
> > --- a/mm/page_alloc.c
> > +++ b/mm/page_alloc.c
> > @@ -5635,7 +5635,12 @@ static struct page *
> > __alloc_contig_migrate_alloc(struct page *page, unsigned long private,
> > int **resultp)
> > {
> > - return alloc_page(GFP_HIGHUSER_MOVABLE);
> > + gfp_t gfp_mask = GFP_USER | __GFP_MOVABLE;
> > +
> > + if (PageHighMem(page))
> > + gfp_mask |= __GFP_HIGHMEM;
> > +
> > + return alloc_page(gfp_mask);
> > }
> >
> > /* [start, end) must belong to a single zone. */
>
>
> The patch looks fine and does it job well. Could you resend it as a complete
> patch with commit message and signed-off-by/reported-by lines? I will handle
> merging it to mainline then.

Thanks, here it is:

8<----