Re: [PATCH] mm,oom: Try last second allocation before and after selecting an OOM victim.
From: Michal Hocko
Date: Tue Oct 31 2017 - 08:49:03 EST
On Tue 31-10-17 21:42:23, Tetsuo Handa wrote:
> Michal Hocko wrote:
> > On Tue 31-10-17 19:40:09, Tetsuo Handa wrote:
> > > The reason I used __alloc_pages_slowpath() in alloc_pages_before_oomkill() is
> > > to avoid duplicating code (such as checking for ALLOC_OOM and rebuilding zone
> > > list) which needs to be maintained in sync with __alloc_pages_slowpath().
> > >
> > > If you don't like calling __alloc_pages_slowpath() from
> > > alloc_pages_before_oomkill(), I'm OK with calling __alloc_pages_nodemask()
> > > (with __GFP_DIRECT_RECLAIM/__GFP_NOFAIL cleared and __GFP_NOWARN set), for
> > > direct reclaim functions can call __alloc_pages_nodemask() (with PF_MEMALLOC
> > > set in order to avoid recursion of direct reclaim).
> > >
> > > We are rebuilding zone list if selected as an OOM victim, for
> > > __gfp_pfmemalloc_flags() returns ALLOC_OOM if oom_reserves_allowed(current)
> > > is true.
> >
> > So your answer is copy&paste without a deeper understanding, righ?
>
> Right. I wanted to avoid duplicating code.
> But I had to duplicate in order to allow OOM victims to try ALLOC_OOM.
I absolutely hate this cargo cult programming!
[...]
> > While both have some merit, the first reason is mostly historical
> > because we have the explicit locking now and it is really unlikely that
> > the memory would be available right after we have given up trying.
> > Last attempt allocation makes some sense of course but considering that
> > the oom victim selection is quite an expensive operation which can take
> > a considerable amount of time it makes much more sense to retry the
> > allocation after the most expensive part rather than before. Therefore
> > move the last attempt right before we are trying to kill an oom victim
> > to rule potential races when somebody could have freed a lot of memory
> > in the meantime. This will reduce the time window for potentially
> > pre-mature OOM killing considerably.
>
> But this is about "doing last second allocation attempt after selecting
> an OOM victim". This is not about "allowing OOM victims to try ALLOC_OOM
> before selecting next OOM victim" which is the actual problem I'm trying
> to deal with.
then split it into two. First make the general case and then add a more
sophisticated on top. Dealing with multiple issues at once is what makes
all those brain cells suffer.
--
Michal Hocko
SUSE Labs