On Wed, Apr 4, 2018 at 2:23 PM, Michal Hocko <mhocko@xxxxxxxxxx> wrote: > On Wed 04-04-18 10:58:39, Zhaoyang Huang wrote: >> On Tue, Apr 3, 2018 at 9:56 PM, Michal Hocko <mhocko@xxxxxxxxxx> wrote: >> > On Tue 03-04-18 09:32:45, Steven Rostedt wrote: >> >> On Tue, 3 Apr 2018 14:35:14 +0200 >> >> Michal Hocko <mhocko@xxxxxxxxxx> wrote: >> > [...] >> >> > Being clever is OK if it doesn't add a tricky code. And relying on >> >> > si_mem_available is definitely tricky and obscure. >> >> >> >> Can we get the mm subsystem to provide a better method to know if an >> >> allocation will possibly succeed or not before trying it? It doesn't >> >> have to be free of races. Just "if I allocate this many pages right >> >> now, will it work?" If that changes from the time it asks to the time >> >> it allocates, that's fine. I'm not trying to prevent OOM to never >> >> trigger. I just don't want to to trigger consistently. >> > >> > How do you do that without an actuall allocation request? And more >> > fundamentally, what if your _particular_ request is just fine but it >> > will get us so close to the OOM edge that the next legit allocation >> > request simply goes OOM? There is simply no sane interface I can think >> > of that would satisfy a safe/sensible "will it cause OOM" semantic. >> > >> The point is the app which try to allocate the size over the line will escape >> the OOM and let other innocent to be sacrificed. However, the one which you >> mentioned above will be possibly selected by OOM that triggered by consequnce >> failed allocation. > > 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. But we can not call the function on behalf of the current process which maybe don't want to be killed for memory reason. It is proper to tell it ENOMEM and let it make further decision. > -- > Michal Hocko > SUSE Labs