diff options
-rw-r--r-- | drivers/staging/android/lowmemorykiller.c | 7 | ||||
-rw-r--r-- | include/linux/oom.h | 4 | ||||
-rw-r--r-- | kernel/exit.c | 2 | ||||
-rw-r--r-- | mm/memcontrol.c | 2 | ||||
-rw-r--r-- | mm/oom_kill.c | 23 |
5 files changed, 32 insertions, 6 deletions
diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index b545d3d1da3e..feafa172b155 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c | |||
@@ -160,7 +160,12 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) | |||
160 | selected->pid, selected->comm, | 160 | selected->pid, selected->comm, |
161 | selected_oom_score_adj, selected_tasksize); | 161 | selected_oom_score_adj, selected_tasksize); |
162 | lowmem_deathpending_timeout = jiffies + HZ; | 162 | lowmem_deathpending_timeout = jiffies + HZ; |
163 | set_tsk_thread_flag(selected, TIF_MEMDIE); | 163 | /* |
164 | * FIXME: lowmemorykiller shouldn't abuse global OOM killer | ||
165 | * infrastructure. There is no real reason why the selected | ||
166 | * task should have access to the memory reserves. | ||
167 | */ | ||
168 | mark_tsk_oom_victim(selected); | ||
164 | send_sig(SIGKILL, selected, 0); | 169 | send_sig(SIGKILL, selected, 0); |
165 | rem += selected_tasksize; | 170 | rem += selected_tasksize; |
166 | } | 171 | } |
diff --git a/include/linux/oom.h b/include/linux/oom.h index 76200984d1e2..b42b80f88c3a 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h | |||
@@ -47,6 +47,10 @@ static inline bool oom_task_origin(const struct task_struct *p) | |||
47 | return !!(p->signal->oom_flags & OOM_FLAG_ORIGIN); | 47 | return !!(p->signal->oom_flags & OOM_FLAG_ORIGIN); |
48 | } | 48 | } |
49 | 49 | ||
50 | extern void mark_tsk_oom_victim(struct task_struct *tsk); | ||
51 | |||
52 | extern void unmark_oom_victim(void); | ||
53 | |||
50 | extern unsigned long oom_badness(struct task_struct *p, | 54 | extern unsigned long oom_badness(struct task_struct *p, |
51 | struct mem_cgroup *memcg, const nodemask_t *nodemask, | 55 | struct mem_cgroup *memcg, const nodemask_t *nodemask, |
52 | unsigned long totalpages); | 56 | unsigned long totalpages); |
diff --git a/kernel/exit.c b/kernel/exit.c index 6806c55475ee..02b3d1ab2ec0 100644 --- a/kernel/exit.c +++ b/kernel/exit.c | |||
@@ -435,7 +435,7 @@ static void exit_mm(struct task_struct *tsk) | |||
435 | task_unlock(tsk); | 435 | task_unlock(tsk); |
436 | mm_update_next_owner(mm); | 436 | mm_update_next_owner(mm); |
437 | mmput(mm); | 437 | mmput(mm); |
438 | clear_thread_flag(TIF_MEMDIE); | 438 | unmark_oom_victim(); |
439 | } | 439 | } |
440 | 440 | ||
441 | static struct task_struct *find_alive_thread(struct task_struct *p) | 441 | static struct task_struct *find_alive_thread(struct task_struct *p) |
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 11c9e6a1dad5..fe4d258ef32b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1556,7 +1556,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, | |||
1556 | * quickly exit and free its memory. | 1556 | * quickly exit and free its memory. |
1557 | */ | 1557 | */ |
1558 | if (fatal_signal_pending(current) || task_will_free_mem(current)) { | 1558 | if (fatal_signal_pending(current) || task_will_free_mem(current)) { |
1559 | set_thread_flag(TIF_MEMDIE); | 1559 | mark_tsk_oom_victim(current); |
1560 | return; | 1560 | return; |
1561 | } | 1561 | } |
1562 | 1562 | ||
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 294493a7ae4b..80b34e285f96 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -416,6 +416,23 @@ void note_oom_kill(void) | |||
416 | atomic_inc(&oom_kills); | 416 | atomic_inc(&oom_kills); |
417 | } | 417 | } |
418 | 418 | ||
419 | /** | ||
420 | * mark_tsk_oom_victim - marks the given taks as OOM victim. | ||
421 | * @tsk: task to mark | ||
422 | */ | ||
423 | void mark_tsk_oom_victim(struct task_struct *tsk) | ||
424 | { | ||
425 | set_tsk_thread_flag(tsk, TIF_MEMDIE); | ||
426 | } | ||
427 | |||
428 | /** | ||
429 | * unmark_oom_victim - unmarks the current task as OOM victim. | ||
430 | */ | ||
431 | void unmark_oom_victim(void) | ||
432 | { | ||
433 | clear_thread_flag(TIF_MEMDIE); | ||
434 | } | ||
435 | |||
419 | #define K(x) ((x) << (PAGE_SHIFT-10)) | 436 | #define K(x) ((x) << (PAGE_SHIFT-10)) |
420 | /* | 437 | /* |
421 | * Must be called while holding a reference to p, which will be released upon | 438 | * Must be called while holding a reference to p, which will be released upon |
@@ -440,7 +457,7 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, | |||
440 | */ | 457 | */ |
441 | task_lock(p); | 458 | task_lock(p); |
442 | if (p->mm && task_will_free_mem(p)) { | 459 | if (p->mm && task_will_free_mem(p)) { |
443 | set_tsk_thread_flag(p, TIF_MEMDIE); | 460 | mark_tsk_oom_victim(p); |
444 | task_unlock(p); | 461 | task_unlock(p); |
445 | put_task_struct(p); | 462 | put_task_struct(p); |
446 | return; | 463 | return; |
@@ -495,7 +512,7 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, | |||
495 | 512 | ||
496 | /* mm cannot safely be dereferenced after task_unlock(victim) */ | 513 | /* mm cannot safely be dereferenced after task_unlock(victim) */ |
497 | mm = victim->mm; | 514 | mm = victim->mm; |
498 | set_tsk_thread_flag(victim, TIF_MEMDIE); | 515 | mark_tsk_oom_victim(victim); |
499 | pr_err("Killed process %d (%s) total-vm:%lukB, anon-rss:%lukB, file-rss:%lukB\n", | 516 | pr_err("Killed process %d (%s) total-vm:%lukB, anon-rss:%lukB, file-rss:%lukB\n", |
500 | task_pid_nr(victim), victim->comm, K(victim->mm->total_vm), | 517 | task_pid_nr(victim), victim->comm, K(victim->mm->total_vm), |
501 | K(get_mm_counter(victim->mm, MM_ANONPAGES)), | 518 | K(get_mm_counter(victim->mm, MM_ANONPAGES)), |
@@ -652,7 +669,7 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, | |||
652 | */ | 669 | */ |
653 | if (current->mm && | 670 | if (current->mm && |
654 | (fatal_signal_pending(current) || task_will_free_mem(current))) { | 671 | (fatal_signal_pending(current) || task_will_free_mem(current))) { |
655 | set_thread_flag(TIF_MEMDIE); | 672 | mark_tsk_oom_victim(current); |
656 | return; | 673 | return; |
657 | } | 674 | } |
658 | 675 | ||