[PATCH] OOM can panic due to processes stuck in __alloc_pages()
OOM can panic due to the processes stuck in __alloc_pages() doing infinite rebalance loop while no memory can be reclaimed. OOM killer tries to kill some processes, but unfortunetaly, rebalance label was moved by someone below the TIF_MEMDIE check, so buddy allocator doesn't see that process is OOM-killed and it can simply fail the allocation :/ Observed in reality on RHEL4(2.6.9)+OpenVZ kernel when a user doing some memory allocation tricks triggered OOM panic. Signed-off-by: Denis Lunev <den@sw.ru> Signed-off-by: Kirill Korotaev <dev@openvz.org> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Родитель
a3eea484f7
Коммит
b43a57bb4d
|
@ -1180,6 +1180,7 @@ restart:
|
||||||
|
|
||||||
/* This allocation should allow future memory freeing. */
|
/* This allocation should allow future memory freeing. */
|
||||||
|
|
||||||
|
rebalance:
|
||||||
if (((p->flags & PF_MEMALLOC) || unlikely(test_thread_flag(TIF_MEMDIE)))
|
if (((p->flags & PF_MEMALLOC) || unlikely(test_thread_flag(TIF_MEMDIE)))
|
||||||
&& !in_interrupt()) {
|
&& !in_interrupt()) {
|
||||||
if (!(gfp_mask & __GFP_NOMEMALLOC)) {
|
if (!(gfp_mask & __GFP_NOMEMALLOC)) {
|
||||||
|
@ -1201,7 +1202,6 @@ nofail_alloc:
|
||||||
if (!wait)
|
if (!wait)
|
||||||
goto nopage;
|
goto nopage;
|
||||||
|
|
||||||
rebalance:
|
|
||||||
cond_resched();
|
cond_resched();
|
||||||
|
|
||||||
/* We now go into synchronous reclaim */
|
/* We now go into synchronous reclaim */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче