mm: oom_kill: switch test-and-clear of known TIF_MEMDIE to clear
[linux-2.6-block.git] / mm / oom_kill.c
index 2b665da1b3c92070de5e9d8ee6864d843847115c..4b9547be91700e8d27f2dca024b77d4e7ae0448e 100644 (file)
@@ -408,13 +408,13 @@ bool oom_killer_disabled __read_mostly;
 static DECLARE_RWSEM(oom_sem);
 
 /**
- * mark_tsk_oom_victim - marks the given task as OOM victim.
+ * mark_oom_victim - mark the given task as OOM victim
  * @tsk: task to mark
  *
  * Has to be called with oom_sem taken for read and never after
  * oom has been disabled already.
  */
-void mark_tsk_oom_victim(struct task_struct *tsk)
+void mark_oom_victim(struct task_struct *tsk)
 {
        WARN_ON(oom_killer_disabled);
        /* OOM killer might race with memcg OOM */
@@ -431,14 +431,11 @@ void mark_tsk_oom_victim(struct task_struct *tsk)
 }
 
 /**
- * unmark_oom_victim - unmarks the current task as OOM victim.
- *
- * Wakes up all waiters in oom_killer_disable()
+ * exit_oom_victim - note the exit of an OOM victim
  */
-void unmark_oom_victim(void)
+void exit_oom_victim(void)
 {
-       if (!test_and_clear_thread_flag(TIF_MEMDIE))
-               return;
+       clear_thread_flag(TIF_MEMDIE);
 
        down_read(&oom_sem);
        /*
@@ -488,9 +485,7 @@ bool oom_killer_disable(void)
  */
 void oom_killer_enable(void)
 {
-       down_write(&oom_sem);
        oom_killer_disabled = false;
-       up_write(&oom_sem);
 }
 
 #define K(x) ((x) << (PAGE_SHIFT-10))
@@ -517,7 +512,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)) {
-               mark_tsk_oom_victim(p);
+               mark_oom_victim(p);
                task_unlock(p);
                put_task_struct(p);
                return;
@@ -572,7 +567,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;
-       mark_tsk_oom_victim(victim);
+       mark_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)),
@@ -730,7 +725,7 @@ static void __out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
         */
        if (current->mm &&
            (fatal_signal_pending(current) || task_will_free_mem(current))) {
-               mark_tsk_oom_victim(current);
+               mark_oom_victim(current);
                return;
        }