|
@@ -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();
|