Re: [PATCH 2/2] mm/madvise: add process_madvise MADV_DONTNEER support
From: Jann Horn <jannh@google.com>
Date: 2020-12-08 23:41:47
Also in:
linux-mm, lkml
On Tue, Nov 24, 2020 at 6:50 AM Suren Baghdasaryan [off-list ref] wrote:
In modern systems it's not unusual to have a system component monitoring memory conditions of the system and tasked with keeping system memory pressure under control. One way to accomplish that is to kill non-essential processes to free up memory for more important ones. Examples of this are Facebook's OOM killer daemon called oomd and Android's low memory killer daemon called lmkd. For such system component it's important to be able to free memory quickly and efficiently. Unfortunately the time process takes to free up its memory after receiving a SIGKILL might vary based on the state of the process (uninterruptible sleep), size and OPP level of the core the process is running. In such situation it is desirable to be able to free up the memory of the process being killed in a more controlled way. Enable MADV_DONTNEED to be used with process_madvise when applied to a dying process to reclaim its memory. This would allow userspace system components like oomd and lmkd to free memory of the target process in a more predictable way. Signed-off-by: Suren Baghdasaryan <surenb@google.com>
[...]
quoted hunk ↗ jump to hunk
@@ -1239,6 +1256,23 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec, goto release_task; } + if (madvise_destructive(behavior)) { + /* Allow destructive madvise only on a dying processes */ + if (!signal_group_exit(task->signal)) { + ret = -EINVAL; + goto release_mm; + }
Technically Linux allows processes to share mm_struct without being in the same thread group, so I'm not sure whether this check is good enough? AFAICS the normal OOM killer deals with this case by letting __oom_kill_process() always kill all tasks that share the mm_struct.