Re: [PATCH] MIPS: Fix DMA contiguous allocation
From: Mel Gorman
Date: Wed Dec 09 2015 - 06:36:48 EST
On Tue, Dec 08, 2015 at 02:19:39PM -0800, Andrew Morton wrote:
> On Tue, 8 Dec 2015 10:18:50 +0000 Qais Yousef <qais.yousef@xxxxxxxxxx> wrote:
> > Recent changes to how GFP_ATOMIC is defined seems to have broken the condition
> > to use mips_alloc_from_contiguous() in mips_dma_alloc_coherent().
> > I couldn't bottom out the exact change but I think it's this one
> > d0164adc89f6 (mm, page_alloc: distinguish between being unable to sleep,
> > unwilling to sleep and avoiding waking kswapd)
> > >From what I see GFP_ATOMIC has multiple bits set and the check for !(gfp
> > & GFP_ATOMIC) isn't enough. To verify if the flag is atomic we need to make
> > sure that (gfp & GFP_ATOMIC) == GFP_ATOMIC to verify that all bits rquired to
> > satisfy GFP_ATOMIC condition are set.
> > ...
> > --- a/arch/mips/mm/dma-default.c
> > +++ b/arch/mips/mm/dma-default.c
> > @@ -145,7 +145,7 @@ static void *mips_dma_alloc_coherent(struct device *dev, size_t size,
> > gfp = massage_gfp_flags(dev, gfp);
> > - if (IS_ENABLED(CONFIG_DMA_CMA) && !(gfp & GFP_ATOMIC))
> > + if (IS_ENABLED(CONFIG_DMA_CMA) && ((gfp & GFP_ATOMIC) != GFP_ATOMIC))
> > page = dma_alloc_from_contiguous(dev,
> > count, get_order(size));
> > if (!page)
> hm. It seems that the code is asking "can I do a potentially-sleeping
> memory allocation"?
> The way to do that under the new regime is
> if (IS_ENABLED(CONFIG_DMA_CMA) && gfpflags_allow_blocking(gfp))
> Mel, can you please confirm?
Yes, this is the correct way it should be checked. The full flags cover
watermark and kswapd treatment which potentially could be altered by
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/