]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - mm/oom_kill.c
OMAP: dmtimer: enable all timers to be wakeup events
[linux-2.6-omap-h63xx.git] / mm / oom_kill.c
index 6b9e758c98a59ebd46168ecf150db260988fd437..40ba05061a4fbc8a43d3eb046a58fe756748cd06 100644 (file)
@@ -429,7 +429,6 @@ void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask)
        unsigned long points = 0;
        struct task_struct *p;
 
-       cgroup_lock();
        read_lock(&tasklist_lock);
 retry:
        p = select_bad_process(&points, mem);
@@ -444,7 +443,6 @@ retry:
                goto retry;
 out:
        read_unlock(&tasklist_lock);
-       cgroup_unlock();
 }
 #endif
 
@@ -560,6 +558,13 @@ void pagefault_out_of_memory(void)
                /* Got some memory back in the last second. */
                return;
 
+       /*
+        * If this is from memcg, oom-killer is already invoked.
+        * and not worth to go system-wide-oom.
+        */
+       if (mem_cgroup_oom_called(current))
+               goto rest_and_return;
+
        if (sysctl_panic_on_oom)
                panic("out of memory from page fault. panic_on_oom is selected.\n");
 
@@ -571,6 +576,7 @@ void pagefault_out_of_memory(void)
         * Give "p" a good chance of killing itself before we
         * retry to allocate memory.
         */
+rest_and_return:
        if (!test_thread_flag(TIF_MEMDIE))
                schedule_timeout_uninterruptible(1);
 }