diff --git a/include/linux/oom.h b/include/linux/oom.h index 2db9a1432511286d1b10d9185c935a89253371bc..426f1a284284a3ac71db939a40e581404fa00872 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -112,6 +112,7 @@ long oom_badness(struct task_struct *p, unsigned long totalpages); extern bool out_of_memory(struct oom_control *oc); +int oom_kill_memcg_member(struct task_struct *task, void *message); extern void exit_oom_victim(void); diff --git a/kernel/fork.c b/kernel/fork.c index dfeadf1c07fe0249d70be57075cd0c2863fa0fae..b82bac1e02bb03a9dfd3be746cf6ffedb5189481 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -1388,6 +1388,9 @@ static struct mm_struct *dup_mm(struct task_struct *tsk, mm->hiwater_rss = get_mm_rss(mm); mm->hiwater_vm = mm->total_vm; + #ifdef CONFIG_RSS_THRESHOLD + mm->rss_threshold = oldmm->rss_threshold; + #endif if (mm->binfmt && !try_module_get(mm->binfmt->module)) goto free_pt; diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 3d7c557fb70c9dd987833139b5757bfed97de2cd..d1e2e273a7ddcf3828a63980a72b30092ae83e4e 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -968,7 +968,7 @@ static void __oom_kill_process(struct task_struct *victim, const char *message) * Kill provided task unless it's secured by setting * oom_score_adj to OOM_SCORE_ADJ_MIN. */ -static int oom_kill_memcg_member(struct task_struct *task, void *message) +int oom_kill_memcg_member(struct task_struct *task, void *message) { if (task->signal->oom_score_adj != OOM_SCORE_ADJ_MIN && !is_global_init(task)) { diff --git a/mm/rss_threshold.c b/mm/rss_threshold.c index c9d915998dbda2d7ae27fdb5759f234997d24ceb..c07d55fed4dcb85efde848147295ff3210c2d30b 100644 --- a/mm/rss_threshold.c +++ b/mm/rss_threshold.c @@ -5,6 +5,7 @@ * Copyright (c) 2022 Huawei Technologies Co., Ltd. */ #include +#include #include #include #include "../fs/proc/internal.h" @@ -23,6 +24,13 @@ int proc_pid_rss(struct seq_file *m, struct pid_namespace *ns, return 0; } +static int rss_theashold_oom_kill(struct task_struct *task) +{ + if (task) + return oom_kill_memcg_member(task, "rss out of range\n"); + return 0; +} + void listen_rss_threshold(struct mm_struct *mm) { unsigned long total_rss; @@ -38,15 +46,16 @@ void listen_rss_threshold(struct mm_struct *mm) return; if (mm->owner->comm) - pr_err("rss_threshold monitor:Pid:%d [%s] rss size:%lu KB is out of range:%lu KB\n", - mm->owner->pid, mm->owner->comm, + pr_err("rss_threshold monitor: Killing Pid:%d [%s] (tgid:%d) rss size:%lu KB is out of range:%lu KB\n", + mm->owner->pid, mm->owner->comm, mm->owner->tgid, total_rss, mm->rss_threshold); else - pr_err("rss_threshold monitor:Pid:%d [NULL] rss size:%lu KB is out of range:%lu KB\n", - mm->owner->pid, + pr_err("rss_threshold monitor: Killing Pid:%d [NULL] tgid:%d rss size:%lu KB is out of range:%lu KB\n", + mm->owner->pid, mm->owner->tgid, total_rss, mm->rss_threshold); + rss_theashold_oom_kill(mm->owner); } static ssize_t rss_threshold_write(struct file *file, const char __user *buf,