Merge tag 'staging-4.2-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[firefly-linux-kernel-4.4.55.git] / drivers / staging / android / lowmemorykiller.c
index 2345ee7342d9bfb428f672c7cb3af2cc56cc89f6..872bd603fd0d8b8ae207be9e2d67e71c5b5e04ed 100644 (file)
@@ -156,20 +156,27 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc)
                             p->pid, p->comm, oom_score_adj, tasksize);
        }
        if (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;
+               task_lock(selected);
+               if (!selected->mm) {
+                       /* Already exited, cannot do mark_tsk_oom_victim() */
+                       task_unlock(selected);
+                       goto out;
+               }
                /*
                 * 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);
+               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();