From: David Rientjes <rient...@google.com>

ML: da39da3a54fed88e29024f2f1f6cd7357cd03a44

The oom killer takes task_lock() in a couple of places solely to protect
printing the task's comm.

A process's comm, including current's comm, may change due to
/proc/pid/comm or PR_SET_NAME.

The comm will always be NULL-terminated, so the worst race scenario would
only be during update.  We can tolerate a comm being printed that is in
the middle of an update to avoid taking the lock.

Other locations in the kernel have already dropped task_lock() when
printing comm, so this is consistent.

Signed-off-by: David Rientjes <rient...@google.com>
Suggested-by: Oleg Nesterov <o...@redhat.com>
Cc: Michal Hocko <mho...@kernel.org>
Cc: Vladimir Davydov <vdavy...@parallels.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky.w...@gmail.com>
Acked-by: Johannes Weiner <han...@cmpxchg.org>
Signed-off-by: Andrew Morton <a...@linux-foundation.org>
Signed-off-by: Linus Torvalds <torva...@linux-foundation.org>

https://jira.sw.ru/browse/PSBM-56178

[Partial backport - this patch doesn't contain changes in kernel/cpuset.c
from the upstream patch. Our kernel still needs task_lock() task lock there
to protect task_cs(). Upstream switched to RCU protection thus it doesn't
need task_lock() to protect task_cs()]

Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com>
---
 mm/oom_kill.c | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)

diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index f9a8e62..59b109e 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -570,10 +570,8 @@ bool oom_trylock(struct mem_cgroup *memcg)
                        struct task_struct *p = ctx->victim;
 
                        if (p && ctx->marked) {
-                               task_lock(p);
                                pr_err("OOM kill timeout: %d (%s)\n",
                                       task_pid_nr(p), p->comm);
-                               task_unlock(p);
                                show_stack(p, NULL);
                        }
 
@@ -766,12 +764,9 @@ static void oom_berserker(unsigned long points, unsigned 
long overdraft,
                    points * 100 / totalpages)
                        continue;
 
-               if (__ratelimit(&berserker_rs)) {
-                       task_lock(p);
+               if (__ratelimit(&berserker_rs))
                        pr_err("Rage kill process %d (%s)\n",
                               task_pid_nr(p), p->comm);
-                       task_unlock(p);
-               }
 
                do_send_sig_info(SIGKILL, SEND_SIG_FORCED, p, true);
                mem_cgroup_note_oom_kill(memcg, p);
@@ -818,10 +813,8 @@ void oom_kill_process(struct task_struct *p, gfp_t 
gfp_mask, int order,
        if (__ratelimit(&oom_rs))
                dump_header(p, gfp_mask, order, memcg, nodemask);
 
-       task_lock(p);
        pr_err("%s: Kill process %d (%s) score %lu or sacrifice child\n",
                message, task_pid_nr(p), p->comm, points * 1000 / totalpages);
-       task_unlock(p);
 
        /*
         * If any of p's children has a different mm and is eligible for kill,
@@ -891,10 +884,8 @@ void oom_kill_process(struct task_struct *p, gfp_t 
gfp_mask, int order,
                        if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
                                continue;
 
-                       task_lock(p);   /* Protect ->comm from prctl() */
                        pr_err("Kill process %d (%s) in VE \"%s\" sharing same 
memory\n",
                                task_pid_nr(p), p->comm, task_ve_name(p));
-                       task_unlock(p);
                        do_send_sig_info(SIGKILL, SEND_SIG_FORCED, p, true);
                        mem_cgroup_note_oom_kill(memcg, p);
                }
-- 
2.10.2

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to