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 2/2] mempool: fix first round failure behavior
Date: Wed, 21 Dec 2011 16:19:39 -0800 [thread overview]
Message-ID: <20111222001939.GM9213@google.com> (raw)
In-Reply-To: <20111222001800.GL9213@google.com>
For the initial allocation, mempool passes modified gfp mask to the
backing allocator so that it doesn't try too hard when there are
reserved elements waiting in the pool; however, when that allocation
fails and pool is empty too, it either waits for the pool to be
replenished before retrying or fails if !__GFP_WAIT.
* If the caller was calling in with GFP_ATOMIC, it never gets to try
emergency reserve. Allocations which would have succeeded without
mempool may fail, which is just wrong.
* Allocation which could have succeeded after a bit of reclaim now has
to wait on the reserved items and it's not like mempool doesn't
retry with the original gfp mask. It just does that *after* someone
returns an element, pointlessly delaying things.
Fix it by retrying immediately with the gfp mask requested by the
caller if the first round of allocation attempts fails with modified
mask.
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: stable@kernel.org
---
mm/mempool.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
Index: work/mm/mempool.c
===================================================================
--- work.orig/mm/mempool.c
+++ work/mm/mempool.c
@@ -221,14 +221,24 @@ repeat_alloc:
return element;
}
- /* We must not sleep in the GFP_ATOMIC case */
+ /*
+ * We use modified gfp mask for the first round. If alloc failed
+ * with that and @pool was empty too, immediately retry with the
+ * original gfp mask.
+ */
+ 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:19 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 ` Tejun Heo [this message]
2011-12-22 0:32 ` [PATCH 2/2] mempool: fix first round failure behavior Andrew Morton
2011-12-22 0:34 ` Tejun Heo
2011-12-22 0:46 ` [PATCH UPDATED " Tejun Heo
2011-12-22 1:09 ` 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=20111222001939.GM9213@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).