On Tue Apr 8, 2025 at 1:11 AM AEST, Alexander Gordeev wrote: > apply_to_page_range() enters lazy MMU mode and then invokes > kasan_populate_vmalloc_pte() callback on each page table walk > iteration. The lazy MMU mode may only be entered only under > protection of the page table lock. However, the callback can > go into sleep when trying to allocate a single page. > > Change __get_free_page() allocation mode from GFP_KERNEL to > GFP_ATOMIC to avoid scheduling out while in atomic context.
It's a bit unfortunate to make this use atomic allocs for archs that don't need it. Could you make it depend on __HAVE_ARCH_ENTER_LAZY_MMU_MODE or is that overkill? I wanted to remove ppc64's per-CPU page array and replace it with on stack or dynaimc alloc array in the thread... but cost/benefit of working on ppc64 hash MMU code is not high :( Fix itself for ppc64's requirement at least looks right to me so for that, Reviewed-by: Nicholas Piggin <npig...@gmail.com> > > Signed-off-by: Alexander Gordeev <agord...@linux.ibm.com> > --- > mm/kasan/shadow.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/mm/kasan/shadow.c b/mm/kasan/shadow.c > index 88d1c9dcb507..edfa77959474 100644 > --- a/mm/kasan/shadow.c > +++ b/mm/kasan/shadow.c > @@ -301,7 +301,7 @@ static int kasan_populate_vmalloc_pte(pte_t *ptep, > unsigned long addr, > if (likely(!pte_none(ptep_get(ptep)))) > return 0; > > - page = __get_free_page(GFP_KERNEL); > + page = __get_free_page(GFP_ATOMIC); > if (!page) > return -ENOMEM; >