Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8345bad0 authored by Ashwini Oruganti's avatar Ashwini Oruganti Committed by Pranav Vashi
Browse files

Revert "mm: oom_kill: reap memory of a task that receives SIGKILL"

This reverts commit 724adb44.

Reason for revert: The changes introduced in this commit are causing an
undesirable SELinux denial as a side-effect. Additionally, it appears
(http://b/130391762

) that we do not enable the functionality that this
commit adds. Reverting the commit fixes the SELinux denial bug.

Bug: 138594811
Change-Id: Ie440e290dc89b72c46de2194da0275910c03a66d
Signed-off-by: default avatarAshwini Oruganti <ashfall@google.com>
Signed-off-by: default avatarPranav Vashi <neobuddy89@gmail.com>
parent 43192520
Loading
Loading
Loading
Loading
+0 −19
Original line number Diff line number Diff line
@@ -50,7 +50,6 @@ Currently, these files are in /proc/sys/vm:
- nr_trim_pages         (only if CONFIG_MMU=n)
- numa_zonelist_order
- oom_dump_tasks
- reap_mem_on_sigkill
- oom_kill_allocating_task
- overcommit_kbytes
- overcommit_memory
@@ -658,24 +657,6 @@ The default value is 1 (enabled).

==============================================================

reap_mem_on_sigkill

This enables or disables the memory reaping for a SIGKILL received
process and that the sending process must have the CAP_KILL capabilities.

If this is set to 1, when a process receives SIGKILL from a process
that has the capability, CAP_KILL, the process is added into the oom_reaper
queue which can be picked up by the oom_reaper thread to reap the memory of
that process. This reaps for the process which received SIGKILL through
either sys_kill from user or kill_pid from kernel.

If this is set to 0, we are not reaping memory of a SIGKILL, sent through
either sys_kill from user or kill_pid from kernel, received process.

The default value is 0 (disabled).

==============================================================

oom_kill_allocating_task

This enables or disables killing the OOM-triggering task in
+0 −4
Original line number Diff line number Diff line
@@ -123,8 +123,4 @@ extern void wake_oom_reaper(struct task_struct *tsk);
extern int sysctl_oom_dump_tasks;
extern int sysctl_oom_kill_allocating_task;
extern int sysctl_panic_on_oom;
extern int sysctl_reap_mem_on_sigkill;

/* calls for LMK reaper */
extern void add_to_oom_reaper(struct task_struct *p);
#endif /* _INCLUDE_LINUX_OOM_H */
+1 −6
Original line number Diff line number Diff line
@@ -42,8 +42,6 @@
#include <linux/cn_proc.h>
#include <linux/compiler.h>
#include <linux/posix-timers.h>
#include <linux/oom.h>
#include <linux/capability.h>
#include <linux/cgroup.h>

#define CREATE_TRACE_POINTS
@@ -1346,11 +1344,8 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p)
	ret = check_kill_permission(sig, info, p);
	rcu_read_unlock();

	if (!ret && sig) {
	if (!ret && sig)
		ret = do_send_sig_info(sig, info, p, true);
		if (capable(CAP_KILL) && sig == SIGKILL)
			add_to_oom_reaper(p);
	}

	return ret;
}
+0 −7
Original line number Diff line number Diff line
@@ -1480,13 +1480,6 @@ static struct ctl_table vm_table[] = {
		.mode		= 0644,
		.proc_handler	= proc_dointvec,
	},
	{
		.procname       = "reap_mem_on_sigkill",
		.data           = &sysctl_reap_mem_on_sigkill,
		.maxlen         = sizeof(sysctl_reap_mem_on_sigkill),
		.mode           = 0644,
		.proc_handler   = proc_dointvec,
	},
	{
		.procname	= "overcommit_ratio",
		.data		= &sysctl_overcommit_ratio,
+8 −53
Original line number Diff line number Diff line
@@ -53,7 +53,6 @@
int sysctl_panic_on_oom;
int sysctl_oom_kill_allocating_task;
int sysctl_oom_dump_tasks = 1;
int sysctl_reap_mem_on_sigkill;

DEFINE_MUTEX(oom_lock);
/* Serializes oom_score_adj and oom_score_adj_min updates */
@@ -608,21 +607,13 @@ void wake_oom_reaper(struct task_struct *tsk)
	if (!oom_reaper_th)
		return;

	/*
	 * Move the lock here to avoid scenario of queuing
	 * the same task by both OOM killer and any other SIGKILL
	 * path.
	 */
	spin_lock(&oom_reaper_lock);

	/* mm is already queued? */
	if (test_and_set_bit(MMF_OOM_REAP_QUEUED, &tsk->signal->oom_mm->flags)) {
		spin_unlock(&oom_reaper_lock);
	if (test_and_set_bit(MMF_OOM_REAP_QUEUED, &tsk->signal->oom_mm->flags))
		return;
	}

	get_task_struct(tsk);

	spin_lock(&oom_reaper_lock);
	tsk->oom_reaper_list = oom_reaper_list;
	oom_reaper_list = tsk;
	spin_unlock(&oom_reaper_lock);
@@ -647,16 +638,6 @@ static inline void wake_oom_reaper(struct task_struct *tsk)
}
#endif /* CONFIG_MMU */

static void __mark_oom_victim(struct task_struct *tsk)
{
	struct mm_struct *mm = tsk->mm;

	if (!cmpxchg(&tsk->signal->oom_mm, NULL, mm)) {
		mmgrab(tsk->signal->oom_mm);
		set_bit(MMF_OOM_VICTIM, &mm->flags);
	}
}

/**
 * mark_oom_victim - mark the given task as OOM victim
 * @tsk: task to mark
@@ -669,13 +650,18 @@ static void __mark_oom_victim(struct task_struct *tsk)
 */
static void mark_oom_victim(struct task_struct *tsk)
{
	struct mm_struct *mm = tsk->mm;

	WARN_ON(oom_killer_disabled);
	/* OOM killer might race with memcg OOM */
	if (test_and_set_tsk_thread_flag(tsk, TIF_MEMDIE))
		return;

	/* oom_mm is bound to the signal struct life time. */
	__mark_oom_victim(tsk);
	if (!cmpxchg(&tsk->signal->oom_mm, NULL, mm)) {
		mmgrab(tsk->signal->oom_mm);
		set_bit(MMF_OOM_VICTIM, &mm->flags);
	}

	/*
	 * Make sure that the task is woken up from uninterruptible sleep
@@ -1138,34 +1124,3 @@ void dump_killed_info(struct task_struct *selected)
			global_node_page_state(NR_FILE_PAGES) *
				(long)(PAGE_SIZE / 1024));
}

void add_to_oom_reaper(struct task_struct *p)
{
	static DEFINE_RATELIMIT_STATE(reaper_rs, DEFAULT_RATELIMIT_INTERVAL,
						 DEFAULT_RATELIMIT_BURST);

	if (!sysctl_reap_mem_on_sigkill)
		return;

	p = find_lock_task_mm(p);
	if (!p)
		return;

	get_task_struct(p);
	if (task_will_free_mem(p)) {
		__mark_oom_victim(p);
		wake_oom_reaper(p);
	}

	dump_killed_info(p);
	task_unlock(p);

	if (__ratelimit(&reaper_rs) && p->signal->oom_score_adj == 0) {
		show_mem(SHOW_MEM_FILTER_NODES, NULL);
		show_mem_call_notifiers();
		if (sysctl_oom_dump_tasks)
			dump_tasks(NULL, NULL);
	}

	put_task_struct(p);
}