ANDROID: mm: oom_kill: reap memory of a task that receives SIGKILL

Free the pages parallely for a task that receives SIGKILL, from ULMK
process, using the oom_reaper. This freeing of pages will help to give
the pages to buddy system well advance.

Add the boot param, reap_mem_when_killed_by=, that configures the
process name, the kill signal to a process from which makes its memory
reaped by oom reaper.

As an example, when reap_mem_when_killed_by=lmkd, then all the processes
that receives the kill signal from lmkd is added to oom reaper.

Not initializing this param makes this feature disabled.

Change-Id: I21adb95de5e380a80d7eb0b87d9b5b553f52e28a
Bug: 171763461
Signed-off-by: Charan Teja Reddy <charante@codeaurora.org>
Signed-off-by: Isaac J. Manjarres <isaacm@codeaurora.org>
This commit is contained in:
Charan Teja Reddy
2018-05-01 20:20:20 +05:30
committed by Suren Baghdasaryan
parent 51ca215606
commit a7af91adc7
4 changed files with 55 additions and 7 deletions

View File

@@ -46,6 +46,7 @@
#include <linux/livepatch.h>
#include <linux/cgroup.h>
#include <linux/audit.h>
#include <linux/oom.h>
#define CREATE_TRACE_POINTS
#include <trace/events/signal.h>
@@ -64,6 +65,18 @@ static struct kmem_cache *sigqueue_cachep;
int print_fatal_signals __read_mostly;
static char reaper_comm[TASK_COMM_LEN];
static __init int setup_mem_reap(char *str)
{
if (!str)
return 0;
strlcpy(reaper_comm, str, TASK_COMM_LEN);
return 1;
}
__setup("reap_mem_when_killed_by=", setup_mem_reap);
static void __user *sig_handler(struct task_struct *t, int sig)
{
return t->sighand->action[sig - 1].sa.sa_handler;
@@ -1411,8 +1424,12 @@ int group_send_sig_info(int sig, struct kernel_siginfo *info,
ret = check_kill_permission(sig, info, p);
rcu_read_unlock();
if (!ret && sig)
if (!ret && sig) {
ret = do_send_sig_info(sig, info, p, type);
if (!ret && sig == SIGKILL &&
!strcmp(current->comm, reaper_comm))
add_to_oom_reaper(p);
}
return ret;
}