On Wed, 4 Apr 2018 16:23:29 +0200
Michal Hocko <mho...@kernel.org> wrote:

> > 
> > I tried it out, I did the following:
> > 
> >     set_current_oom_origin();
> >     for (i = 0; i < nr_pages; i++) {
> >             struct page *page;
> >             /*
> >              * __GFP_RETRY_MAYFAIL flag makes sure that the allocation fails
> >              * gracefully without invoking oom-killer and the system is not
> >              * destabilized.
> >              */
> >             bpage = kzalloc_node(ALIGN(sizeof(*bpage), cache_line_size()),
> >                                 GFP_KERNEL | __GFP_RETRY_MAYFAIL,
> >                                 cpu_to_node(cpu));
> >             if (!bpage)
> >                     goto free_pages;
> > 
> >             list_add(&bpage->list, pages);
> > 
> >             page = alloc_pages_node(cpu_to_node(cpu),
> >                                     GFP_KERNEL | __GFP_RETRY_MAYFAIL, 0);
> >             if (!page)
> >                     goto free_pages;  
> 
>               if (fatal_signal_pending())
>                       fgoto free_pages;

I originally was going to remove the RETRY_MAYFAIL, but adding this
check (at the end of the loop though) appears to have OOM consistently
kill this task.

I still like to keep RETRY_MAYFAIL, because it wont trigger OOM if
nothing comes in and tries to do an allocation, but instead will fail
nicely with -ENOMEM.

-- Steve


> 
> >             bpage->page = page_address(page);
> >             rb_init_page(bpage->page);
> >     }
> >     clear_current_oom_origin();  

Reply via email to