On Wed 04-04-18 10:11:49, Steven Rostedt wrote: > On Wed, 4 Apr 2018 08:23:40 +0200 > Michal Hocko <mhocko@xxxxxxxxxx> wrote: > > > If you are afraid of that then you can have a look at {set,clear}_current_oom_origin() > > which will automatically select the current process as an oom victim and > > kill it. > > Would it even receive the signal? Does alloc_pages_node() even respond > to signals? Because the OOM happens while the allocation loop is > running. Well, you would need to do something like: > > 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; > bpage->page = page_address(page); > rb_init_page(bpage->page); > } > clear_current_oom_origin(); If you use __GFP_RETRY_MAYFAIL it would have to be somedy else to trigger the OOM killer and this user context would get killed. If you drop __GFP_RETRY_MAYFAIL it would be this context to trigger the OOM but it would still be the selected victim. -- Michal Hocko SUSE Labs