On Fri, May 10, 2024 at 10:01 PM <hailong.liu@xxxxxxxx> wrote: > > From: "Hailong.Liu" <hailong.liu@xxxxxxxx> > > commit a421ef303008 ("mm: allow !GFP_KERNEL allocations for kvmalloc") > includes support for __GFP_NOFAIL, but it presents a conflict with > commit dd544141b9eb ("vmalloc: back off when the current task is > OOM-killed"). A possible scenario is as follows: > > process-a > __vmalloc_node_range(GFP_KERNEL | __GFP_NOFAIL) > __vmalloc_area_node() > vm_area_alloc_pages() > --> oom-killer send SIGKILL to process-a > if (fatal_signal_pending(current)) break; > --> return NULL; > > To fix this, do not check fatal_signal_pending() in vm_area_alloc_pages() > if __GFP_NOFAIL set. > > Fixes: 9376130c390a ("mm/vmalloc: add support for __GFP_NOFAIL") > Cc: <stable@xxxxxxxxxxxxxxx> > Acked-by: Michal Hocko <mhocko@xxxxxxxx> > Suggested-by: Barry Song <21cnbao@xxxxxxxxx> > Reported-by: Oven <liyangouwen1@xxxxxxxx> > Signed-off-by: Hailong.Liu <hailong.liu@xxxxxxxx> Reviewed-by: Barry Song <baohua@xxxxxxxxxx> > --- > mm/vmalloc.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index 125427cbdb87..109272b8ee2e 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -3492,7 +3492,7 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > { > unsigned int nr_allocated = 0; > gfp_t alloc_gfp = gfp; > - bool nofail = false; > + bool nofail = gfp & __GFP_NOFAIL; > struct page *page; > int i; > > @@ -3549,12 +3549,11 @@ vm_area_alloc_pages(gfp_t gfp, int nid, > * and compaction etc. > */ > alloc_gfp &= ~__GFP_NOFAIL; > - nofail = true; > } > > /* High-order pages or fallback path if "bulk" fails. */ > while (nr_allocated < nr_pages) { > - if (fatal_signal_pending(current)) > + if (!nofail && fatal_signal_pending(current)) > break; > > if (nid == NUMA_NO_NODE) > ---