Messages in this thread | | | Date | Wed, 4 Apr 2018 16:23:29 +0200 | From | Michal Hocko <> | Subject | Re: [PATCH v1] kernel/trace:check the val against the available mem |
| |
On Wed 04-04-18 10:11:49, Steven Rostedt wrote: > On Wed, 4 Apr 2018 08:23:40 +0200 > Michal Hocko <mhocko@kernel.org> 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
| |