On Wed, 8 Jul 2020 at 22:43, Nicolas Saenz Julienne <nsaenzjulie...@suse.de> wrote: > > There is no guarantee to CMA's placement, so allocating a zone specific > atomic pool from CMA might return memory from a completely different > memory zone. So stop using it. > > Fixes: c84dc6e68a1d ("dma-pool: add additional coherent pools to map to gfp > mask")
Hi Nicolas, I see a boot regression with this commit d9765e41d8e9 "dma-pool: Do not allocate pool memory from CMA" on my Xiaomi Poco F1 (Qcom sdm845) phone running v5.8-rc6. I can't boot past the bootloader splash screen with this patch. Phone boots fine if I revert this patch. I carry only one out of tree dts patch https://lkml.org/lkml/2020/6/25/52. And since this is a stock phone, I don't have access to serial/dmesg logs until I boot to AOSP (adb) shell. Any thoughts as to what might be going wrong here? I'd be happy to help debug things. For what it's worth, I don't see this regression on other two sdm845 devices (db845c and Pixel 3) I tested on. Regards, Amit Pundir > Reported-by: Jeremy Linton <jeremy.lin...@arm.com> > Signed-off-by: Nicolas Saenz Julienne <nsaenzjulie...@suse.de> > --- > > An more costly alternative would be adding an option to > dma_alloc_from_contiguous() so it fails when the allocation doesn't fall > in a specific zone. > > kernel/dma/pool.c | 11 ++--------- > 1 file changed, 2 insertions(+), 9 deletions(-) > > diff --git a/kernel/dma/pool.c b/kernel/dma/pool.c > index 8cfa01243ed2..4bc1c46ae6ef 100644 > --- a/kernel/dma/pool.c > +++ b/kernel/dma/pool.c > @@ -6,7 +6,6 @@ > #include <linux/debugfs.h> > #include <linux/dma-direct.h> > #include <linux/dma-noncoherent.h> > -#include <linux/dma-contiguous.h> > #include <linux/init.h> > #include <linux/genalloc.h> > #include <linux/set_memory.h> > @@ -69,12 +68,7 @@ static int atomic_pool_expand(struct gen_pool *pool, > size_t pool_size, > > do { > pool_size = 1 << (PAGE_SHIFT + order); > - > - if (dev_get_cma_area(NULL)) > - page = dma_alloc_from_contiguous(NULL, 1 << order, > - order, false); > - else > - page = alloc_pages(gfp, order); > + page = alloc_pages(gfp, order); > } while (!page && order-- > 0); > if (!page) > goto out; > @@ -118,8 +112,7 @@ static int atomic_pool_expand(struct gen_pool *pool, > size_t pool_size, > dma_common_free_remap(addr, pool_size); > #endif > free_page: __maybe_unused > - if (!dma_release_from_contiguous(NULL, page, 1 << order)) > - __free_pages(page, order); > + __free_pages(page, order); > out: > return ret; > } > -- > 2.27.0 >