|
@@ -306,7 +306,7 @@ EXPORT_SYMBOL(mempool_resize);
|
|
|
* returns NULL. Note that due to preallocation, this function
|
|
|
* *never* fails when called from process contexts. (it might
|
|
|
* fail if called from an IRQ context.)
|
|
|
- * Note: neither __GFP_NOMEMALLOC nor __GFP_ZERO are supported.
|
|
|
+ * Note: using __GFP_ZERO is not supported.
|
|
|
*/
|
|
|
void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask)
|
|
|
{
|
|
@@ -315,27 +315,16 @@ void *mempool_alloc(mempool_t *pool, gfp_t gfp_mask)
|
|
|
wait_queue_t wait;
|
|
|
gfp_t gfp_temp;
|
|
|
|
|
|
- /* If oom killed, memory reserves are essential to prevent livelock */
|
|
|
- VM_WARN_ON_ONCE(gfp_mask & __GFP_NOMEMALLOC);
|
|
|
- /* No element size to zero on allocation */
|
|
|
VM_WARN_ON_ONCE(gfp_mask & __GFP_ZERO);
|
|
|
-
|
|
|
might_sleep_if(gfp_mask & __GFP_DIRECT_RECLAIM);
|
|
|
|
|
|
+ gfp_mask |= __GFP_NOMEMALLOC; /* don't allocate emergency reserves */
|
|
|
gfp_mask |= __GFP_NORETRY; /* don't loop in __alloc_pages */
|
|
|
gfp_mask |= __GFP_NOWARN; /* failures are OK */
|
|
|
|
|
|
gfp_temp = gfp_mask & ~(__GFP_DIRECT_RECLAIM|__GFP_IO);
|
|
|
|
|
|
repeat_alloc:
|
|
|
- if (likely(pool->curr_nr)) {
|
|
|
- /*
|
|
|
- * Don't allocate from emergency reserves if there are
|
|
|
- * elements available. This check is racy, but it will
|
|
|
- * be rechecked each loop.
|
|
|
- */
|
|
|
- gfp_temp |= __GFP_NOMEMALLOC;
|
|
|
- }
|
|
|
|
|
|
element = pool->alloc(gfp_temp, pool->pool_data);
|
|
|
if (likely(element != NULL))
|
|
@@ -359,12 +348,11 @@ repeat_alloc:
|
|
|
* We use gfp mask w/o direct reclaim or IO for the first round. If
|
|
|
* alloc failed with that and @pool was empty, retry immediately.
|
|
|
*/
|
|
|
- if ((gfp_temp & ~__GFP_NOMEMALLOC) != gfp_mask) {
|
|
|
+ if (gfp_temp != gfp_mask) {
|
|
|
spin_unlock_irqrestore(&pool->lock, flags);
|
|
|
gfp_temp = gfp_mask;
|
|
|
goto repeat_alloc;
|
|
|
}
|
|
|
- gfp_temp = gfp_mask;
|
|
|
|
|
|
/* We must not sleep if !__GFP_DIRECT_RECLAIM */
|
|
|
if (!(gfp_mask & __GFP_DIRECT_RECLAIM)) {
|