diff --git a/Documentation/sysctl/vm.txt b/Documentation/sysctl/vm.txt index 8ead633d71b2..4cefb8690c79 100644 --- a/Documentation/sysctl/vm.txt +++ b/Documentation/sysctl/vm.txt @@ -51,7 +51,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 @@ -656,24 +655,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 diff --git a/include/linux/oom.h b/include/linux/oom.h index 8aeb4a53c291..939103137851 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -120,8 +120,4 @@ extern void dump_tasks(struct mem_cgroup *memcg, 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 */ diff --git a/kernel/signal.c b/kernel/signal.c index 55dde5fc5d02..61e5823ae1b1 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -43,8 +43,6 @@ #include #include #include -#include -#include #include #define CREATE_TRACE_POINTS @@ -1387,11 +1385,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, type); - if (capable(CAP_KILL) && sig == SIGKILL) - add_to_oom_reaper(p); - } return ret; } diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 6ca36933a6bb..020af07685a5 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1663,13 +1663,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, diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 36fdf953f5cc..6b9b9c2b85d0 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -54,7 +54,6 @@ int sysctl_panic_on_oom; int sysctl_oom_kill_allocating_task; int sysctl_oom_dump_tasks = 1; -int sysctl_reap_mem_on_sigkill; /* * Serializes oom killer invocations (out_of_memory()) from all contexts to @@ -642,21 +641,13 @@ static int oom_reaper(void *unused) static void wake_oom_reaper(struct task_struct *tsk) { - /* - * 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); @@ -676,16 +667,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 @@ -698,13 +679,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 @@ -1179,21 +1165,3 @@ void pagefault_out_of_memory(void) if (__ratelimit(&pfoom_rs)) pr_warn("Huh VM_FAULT_OOM leaked out to the #PF handler. Retrying PF\n"); } - -void add_to_oom_reaper(struct task_struct *p) -{ - 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); - } - task_unlock(p); - put_task_struct(p); -}