Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mempool: add @gfp_mask to mempool_create_node()

mempool_create_node() currently assumes %GFP_KERNEL. Its only user,
blk_init_free_list(), is about to be updated to use other allocation
flags - add @gfp_mask argument to the function.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Tejun Heo and committed by
Jens Axboe
a91a5ac6 15974993

+11 -8
+2 -2
block/blk-core.c
··· 531 531 init_waitqueue_head(&rl->wait[BLK_RW_ASYNC]); 532 532 533 533 rl->rq_pool = mempool_create_node(BLKDEV_MIN_RQ, mempool_alloc_slab, 534 - mempool_free_slab, request_cachep, q->node); 535 - 534 + mempool_free_slab, request_cachep, 535 + GFP_KERNEL, q->node); 536 536 if (!rl->rq_pool) 537 537 return -ENOMEM; 538 538
+2 -1
include/linux/mempool.h
··· 26 26 extern mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, 27 27 mempool_free_t *free_fn, void *pool_data); 28 28 extern mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn, 29 - mempool_free_t *free_fn, void *pool_data, int nid); 29 + mempool_free_t *free_fn, void *pool_data, 30 + gfp_t gfp_mask, int nid); 30 31 31 32 extern int mempool_resize(mempool_t *pool, int new_min_nr, gfp_t gfp_mask); 32 33 extern void mempool_destroy(mempool_t *pool);
+7 -5
mm/mempool.c
··· 63 63 mempool_t *mempool_create(int min_nr, mempool_alloc_t *alloc_fn, 64 64 mempool_free_t *free_fn, void *pool_data) 65 65 { 66 - return mempool_create_node(min_nr,alloc_fn,free_fn, pool_data,-1); 66 + return mempool_create_node(min_nr,alloc_fn,free_fn, pool_data, 67 + GFP_KERNEL, NUMA_NO_NODE); 67 68 } 68 69 EXPORT_SYMBOL(mempool_create); 69 70 70 71 mempool_t *mempool_create_node(int min_nr, mempool_alloc_t *alloc_fn, 71 - mempool_free_t *free_fn, void *pool_data, int node_id) 72 + mempool_free_t *free_fn, void *pool_data, 73 + gfp_t gfp_mask, int node_id) 72 74 { 73 75 mempool_t *pool; 74 - pool = kmalloc_node(sizeof(*pool), GFP_KERNEL | __GFP_ZERO, node_id); 76 + pool = kmalloc_node(sizeof(*pool), gfp_mask | __GFP_ZERO, node_id); 75 77 if (!pool) 76 78 return NULL; 77 79 pool->elements = kmalloc_node(min_nr * sizeof(void *), 78 - GFP_KERNEL, node_id); 80 + gfp_mask, node_id); 79 81 if (!pool->elements) { 80 82 kfree(pool); 81 83 return NULL; ··· 95 93 while (pool->curr_nr < pool->min_nr) { 96 94 void *element; 97 95 98 - element = pool->alloc(GFP_KERNEL, pool->pool_data); 96 + element = pool->alloc(gfp_mask, pool->pool_data); 99 97 if (unlikely(!element)) { 100 98 mempool_destroy(pool); 101 99 return NULL;