|
@@ -416,6 +416,23 @@ void note_oom_kill(void)
|
|
|
atomic_inc(&oom_kills);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * mark_tsk_oom_victim - marks the given taks as OOM victim.
|
|
|
+ * @tsk: task to mark
|
|
|
+ */
|
|
|
+void mark_tsk_oom_victim(struct task_struct *tsk)
|
|
|
+{
|
|
|
+ set_tsk_thread_flag(tsk, TIF_MEMDIE);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * unmark_oom_victim - unmarks the current task as OOM victim.
|
|
|
+ */
|
|
|
+void unmark_oom_victim(void)
|
|
|
+{
|
|
|
+ clear_thread_flag(TIF_MEMDIE);
|
|
|
+}
|
|
|
+
|
|
|
#define K(x) ((x) << (PAGE_SHIFT-10))
|
|
|
/*
|
|
|
* 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,
|
|
|
*/
|
|
|
task_lock(p);
|
|
|
if (p->mm && task_will_free_mem(p)) {
|
|
|
- set_tsk_thread_flag(p, TIF_MEMDIE);
|
|
|
+ mark_tsk_oom_victim(p);
|
|
|
task_unlock(p);
|
|
|
put_task_struct(p);
|
|
|
return;
|
|
@@ -495,7 +512,7 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
|
|
|
|
|
|
/* mm cannot safely be dereferenced after task_unlock(victim) */
|
|
|
mm = victim->mm;
|
|
|
- set_tsk_thread_flag(victim, TIF_MEMDIE);
|
|
|
+ mark_tsk_oom_victim(victim);
|
|
|
pr_err("Killed process %d (%s) total-vm:%lukB, anon-rss:%lukB, file-rss:%lukB\n",
|
|
|
task_pid_nr(victim), victim->comm, K(victim->mm->total_vm),
|
|
|
K(get_mm_counter(victim->mm, MM_ANONPAGES)),
|
|
@@ -652,7 +669,7 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
|
|
|
*/
|
|
|
if (current->mm &&
|
|
|
(fatal_signal_pending(current) || task_will_free_mem(current))) {
|
|
|
- set_thread_flag(TIF_MEMDIE);
|
|
|
+ mark_tsk_oom_victim(current);
|
|
|
return;
|
|
|
}
|
|
|
|