aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block/blk-core.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 794c3e7f01cf..fd154b94447a 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -557,6 +557,18 @@ void blk_cleanup_queue(struct request_queue *q)
557} 557}
558EXPORT_SYMBOL(blk_cleanup_queue); 558EXPORT_SYMBOL(blk_cleanup_queue);
559 559
560/* Allocate memory local to the request queue */
561static void *alloc_request_struct(gfp_t gfp_mask, void *data)
562{
563 int nid = (int)(long)data;
564 return kmem_cache_alloc_node(request_cachep, gfp_mask, nid);
565}
566
567static void free_request_struct(void *element, void *unused)
568{
569 kmem_cache_free(request_cachep, element);
570}
571
560int blk_init_rl(struct request_list *rl, struct request_queue *q, 572int blk_init_rl(struct request_list *rl, struct request_queue *q,
561 gfp_t gfp_mask) 573 gfp_t gfp_mask)
562{ 574{
@@ -569,9 +581,10 @@ int blk_init_rl(struct request_list *rl, struct request_queue *q,
569 init_waitqueue_head(&rl->wait[BLK_RW_SYNC]); 581 init_waitqueue_head(&rl->wait[BLK_RW_SYNC]);
570 init_waitqueue_head(&rl->wait[BLK_RW_ASYNC]); 582 init_waitqueue_head(&rl->wait[BLK_RW_ASYNC]);
571 583
572 rl->rq_pool = mempool_create_node(BLKDEV_MIN_RQ, mempool_alloc_slab, 584 rl->rq_pool = mempool_create_node(BLKDEV_MIN_RQ, alloc_request_struct,
573 mempool_free_slab, request_cachep, 585 free_request_struct,
574 gfp_mask, q->node); 586 (void *)(long)q->node, gfp_mask,
587 q->node);
575 if (!rl->rq_pool) 588 if (!rl->rq_pool)
576 return -ENOMEM; 589 return -ENOMEM;
577 590