X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=mm%2Foom_kill.c;h=40ba05061a4fbc8a43d3eb046a58fe756748cd06;hb=92181f190b649f7ef2b79cbf5c00f26ccc66da2a;hp=6b9e758c98a59ebd46168ecf150db260988fd437;hpb=3610639d1fceb09cb418c65fcbe9136c31eee03a;p=linux-2.6-block.git diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 6b9e758c98a5..40ba05061a4f 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -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); }