android, lmk: Send SIGKILL before setting TIF_MEMDIE.
authorTetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Sun, 6 Sep 2015 05:25:35 +0000 (14:25 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 4 Oct 2015 12:07:52 +0000 (13:07 +0100)
It was observed that setting TIF_MEMDIE before sending SIGKILL at
oom_kill_process() allows memory reserves to be depleted by allocations
which are not needed for terminating the OOM victim.

This patch reverts commit 6bc2b856bb7c ("staging: android: lowmemorykiller:
set TIF_MEMDIE before send kill sig"), for oom_kill_process() was updated
to send SIGKILL before setting TIF_MEMDIE.

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Acked-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/android/lowmemorykiller.c

index 872bd60..569d12c 100644 (file)
@@ -157,26 +157,22 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc)
        }
        if (selected) {
                task_lock(selected);
-               if (!selected->mm) {
-                       /* Already exited, cannot do mark_tsk_oom_victim() */
-                       task_unlock(selected);
-                       goto out;
-               }
+               send_sig(SIGKILL, selected, 0);
                /*
                 * FIXME: lowmemorykiller shouldn't abuse global OOM killer
                 * infrastructure. There is no real reason why the selected
                 * task should have access to the memory reserves.
                 */
-               mark_oom_victim(selected);
+               if (selected->mm)
+                       mark_oom_victim(selected);
                task_unlock(selected);
                lowmem_print(1, "send sigkill to %d (%s), adj %hd, size %d\n",
                             selected->pid, selected->comm,
                             selected_oom_score_adj, selected_tasksize);
                lowmem_deathpending_timeout = jiffies + HZ;
-               send_sig(SIGKILL, selected, 0);
                rem += selected_tasksize;
        }
-out:
+
        lowmem_print(4, "lowmem_scan %lu, %x, return %lu\n",
                     sc->nr_to_scan, sc->gfp_mask, rem);
        rcu_read_unlock();