All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Barry <abarry@cray.com>
To: linux-mm <linux-mm@kvack.org>
Subject: Unending loop in __alloc_pages_slowpath following OOM-kill; rfc: patch.
Date: Fri, 13 May 2011 16:31:51 -0500	[thread overview]
Message-ID: <4DCDA347.9080207@cray.com> (raw)

I believe I found a problem in __alloc_pages_slowpath, which allows a process to
get stuck endlessly looping, even when lots of memory is available.

Running an I/O and memory intensive stress-test I see a 0-order page allocation
with __GFP_IO and __GFP_WAIT, running on a system with very little free memory.
Right about the same time that the stress-test gets killed by the OOM-killer,
the utility trying to allocate memory gets stuck in __alloc_pages_slowpath even
though most of the systems memory was freed by the oom-kill of the stress-test.

The utility ends up looping from the rebalance label down through the
wait_iff_congested continiously. Because order=0, __alloc_pages_direct_compact
skips the call to get_page_from_freelist. Because all of the reclaimable memory
on the system has already been reclaimed, __alloc_pages_direct_reclaim skips the
call to get_page_from_freelist. Since there is no __GFP_FS flag, the block with
__alloc_pages_may_oom is skipped. The loop hits the wait_iff_congested, then
jumps back to rebalance without ever trying to get_page_from_freelist. This loop
repeats infinitely.

Is there a reason that this loop is set up this way for 0 order allocations? I
applied the below patch, and the problem corrects itself. Does anyone have any
thoughts on the patch, or on a better way to address this situation?

The test case is pretty pathological. Running a mix of I/O stress-tests that do
a lot of fork() and consume all of the system memory, I can pretty reliably hit
this on 600 nodes, in about 12 hours. 32GB/node.

Thanks
Andrew Barry

---
 mm/page_alloc.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 9f8a97b..c719664 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2158,7 +2158,10 @@ rebalance:
        if (should_alloc_retry(gfp_mask, order, pages_reclaimed)) {
                /* Wait for some write requests to complete then retry */
                wait_iff_congested(preferred_zone, BLK_RW_ASYNC, HZ/50);
-               goto rebalance;
+               if (did_some_progress)
+                       goto rebalance;
+               else
+                       goto restart;
        } else {
                /*
                 * High-order allocations do not necessarily loop after

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

             reply	other threads:[~2011-05-13 21:32 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-13 21:31 Andrew Barry [this message]
2011-05-17 10:34 ` Unending loop in __alloc_pages_slowpath following OOM-kill; rfc: patch Minchan Kim
2011-05-17 11:34   ` Mel Gorman
2011-05-17 15:49   ` Andrew Barry
2011-05-18 22:29     ` Minchan Kim
2011-05-20 16:49       ` Minchan Kim
2011-05-20 16:49         ` Minchan Kim
2011-05-20 17:16         ` Rik van Riel
2011-05-20 17:16           ` Rik van Riel
2011-05-20 17:23         ` Mel Gorman
2011-05-20 17:23           ` Mel Gorman
2011-05-24  4:54         ` KOSAKI Motohiro
2011-05-24  4:54           ` KOSAKI Motohiro
2011-05-24  5:45           ` KOSAKI Motohiro
2011-05-24  5:45             ` KOSAKI Motohiro
2011-05-24  8:30           ` Mel Gorman
2011-05-24  8:30             ` Mel Gorman
2011-05-24  8:36             ` KOSAKI Motohiro
2011-05-24  8:36               ` KOSAKI Motohiro
2011-05-24  8:49               ` Mel Gorman
2011-05-24  8:49                 ` Mel Gorman
2011-05-24  9:05                 ` KOSAKI Motohiro
2011-05-24  9:05                   ` KOSAKI Motohiro
2011-05-24  9:16                   ` Mel Gorman
2011-05-24  9:16                     ` Mel Gorman
2011-05-24  9:40                     ` KOSAKI Motohiro
2011-05-24  9:40                       ` KOSAKI Motohiro
2011-05-24 10:57                       ` Mel Gorman
2011-05-24 10:57                         ` Mel Gorman
2011-05-24 23:53                         ` KOSAKI Motohiro
2011-05-24 23:53                           ` KOSAKI Motohiro
2011-05-24  8:34           ` Minchan Kim
2011-05-24  8:34             ` Minchan Kim
2011-05-24  8:41             ` KOSAKI Motohiro
2011-05-24  8:41               ` KOSAKI Motohiro
2011-05-24  8:57               ` Minchan Kim
2011-05-24  8:57                 ` Minchan Kim
2011-05-24  9:36                 ` KOSAKI Motohiro
2011-05-24  9:36                   ` KOSAKI Motohiro

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4DCDA347.9080207@cray.com \
    --to=abarry@cray.com \
    --cc=linux-mm@kvack.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.