From: Tejun Heo <tj@kernel.org>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
linux-kernel@vger.kernel.org
Subject: [PATCH UPDATED 2/2] mempool: fix first round failure behavior
Date: Wed, 21 Dec 2011 16:46:29 -0800 [thread overview]
Message-ID: <20111222004629.GO9213@google.com> (raw)
In-Reply-To: <20111222001939.GM9213@google.com>
mempool modifies gfp_mask so that the backing allocator doesn't try
too hard or trigger warning message when there's pool to fall back on.
In addition, for the first try, it removes __GFP_WAIT and IO, so that
it doesn't trigger reclaim or wait when allocation can be fulfilled
from pool; however, when that allocation fails and pool is empty too,
it waits for the pool to be replenished before retrying.
Allocation which could have succeeded after a bit of reclaim has to
wait on the reserved items and it's not like mempool doesn't retry
with __GFP_WAIT and IO. It just does that *after* someone returns an
element, pointlessly delaying things.
Fix it by retrying immediately if the first round of allocation
attempts w/o __GFP_WAIT and IO fails.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
---
The code hasn't changed. Only the description and comment are
updated. It doesn't affect anything regarding emergency pool. It
just changes when the first retry happens.
That said, I still find it a bit unsettling that a GFP_ATOMIC
allocation which would otherwise succeed may fail when issued through
mempool. Maybe the RTTD is clearing __GFP_NOMEMALLOC on retry if the
gfp requsted by the caller is !__GFP_WAIT && !__GFP_NOMEMALLOC?
Thanks.
mm/mempool.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
Index: work/mm/mempool.c
===================================================================
--- work.orig/mm/mempool.c
+++ work/mm/mempool.c
@@ -221,14 +221,23 @@ repeat_alloc:
return element;
}
- /* We must not sleep in the GFP_ATOMIC case */
+ /*
+ * We use gfp mask w/o __GFP_WAIT or IO for the first round. If
+ * alloc failed with that and @pool was empty, retry immediately.
+ */
+ if (gfp_temp != gfp_mask) {
+ gfp_temp = gfp_mask;
+ spin_unlock_irqrestore(&pool->lock, flags);
+ goto repeat_alloc;
+ }
+
+ /* We must not sleep if !__GFP_WAIT */
if (!(gfp_mask & __GFP_WAIT)) {
spin_unlock_irqrestore(&pool->lock, flags);
return NULL;
}
/* Let's wait for someone else to return an element to @pool */
- gfp_temp = gfp_mask;
init_wait(&wait);
prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE);
next prev parent reply other threads:[~2011-12-22 0:46 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-22 0:18 [PATCH 1/2] mempool: drop unnecessary and incorrect BUG_ON() from mempool_destroy() Tejun Heo
2011-12-22 0:19 ` [PATCH 2/2] mempool: fix first round failure behavior Tejun Heo
2011-12-22 0:32 ` Andrew Morton
2011-12-22 0:34 ` Tejun Heo
2011-12-22 0:46 ` Tejun Heo [this message]
2011-12-22 1:09 ` [PATCH UPDATED " Andrew Morton
2011-12-22 1:23 ` Tejun Heo
2011-12-22 1:31 ` Tejun Heo
2011-12-22 15:15 ` Vivek Goyal
2011-12-22 15:20 ` Vivek Goyal
2011-12-22 15:58 ` Tejun Heo
2011-12-22 16:04 ` Vivek Goyal
2011-12-22 16:15 ` Tejun Heo
2011-12-22 15:21 ` Tejun Heo
2011-12-22 0:25 ` [PATCH 1/2] mempool: drop unnecessary and incorrect BUG_ON() from mempool_destroy() Andrew Morton
2011-12-22 0:35 ` Tejun Heo
2011-12-22 0:40 ` Greg KH
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=20111222004629.GO9213@google.com \
--to=tj@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@linux-foundation.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.