|
@@ -572,3 +572,62 @@ int blk_init_rl(struct request_list *rl, struct request_queue *q,
|
|
|
rl->starved[BLK_RW_SYNC] = rl->starved[BLK_RW_ASYNC] = 0;
|
|
|
init_waitqueue_head(&rl->wait[BLK_RW_SYNC]);
|
|
|
init_waitqueue_head(&rl->wait[BLK_RW_ASYNC]);
|
|
|
+
|
|
|
+ rl->rq_pool = mempool_create_node(BLKDEV_MIN_RQ, mempool_alloc_slab,
|
|
|
+ mempool_free_slab, request_cachep,
|
|
|
+ gfp_mask, q->node);
|
|
|
+ if (!rl->rq_pool)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void blk_exit_rl(struct request_list *rl)
|
|
|
+{
|
|
|
+ if (rl->rq_pool)
|
|
|
+ mempool_destroy(rl->rq_pool);
|
|
|
+}
|
|
|
+
|
|
|
+struct request_queue *blk_alloc_queue(gfp_t gfp_mask)
|
|
|
+{
|
|
|
+ return blk_alloc_queue_node(gfp_mask, NUMA_NO_NODE);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(blk_alloc_queue);
|
|
|
+
|
|
|
+struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
|
|
|
+{
|
|
|
+ struct request_queue *q;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ q = kmem_cache_alloc_node(blk_requestq_cachep,
|
|
|
+ gfp_mask | __GFP_ZERO, node_id);
|
|
|
+ if (!q)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ q->id = ida_simple_get(&blk_queue_ida, 0, 0, gfp_mask);
|
|
|
+ if (q->id < 0)
|
|
|
+ goto fail_q;
|
|
|
+
|
|
|
+ q->backing_dev_info.ra_pages =
|
|
|
+ (VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
|
|
|
+ q->backing_dev_info.state = 0;
|
|
|
+ q->backing_dev_info.capabilities = BDI_CAP_MAP_COPY;
|
|
|
+ q->backing_dev_info.name = "block";
|
|
|
+ q->node = node_id;
|
|
|
+
|
|
|
+ err = bdi_init(&q->backing_dev_info);
|
|
|
+ if (err)
|
|
|
+ goto fail_id;
|
|
|
+
|
|
|
+ setup_timer(&q->backing_dev_info.laptop_mode_wb_timer,
|
|
|
+ laptop_mode_timer_fn, (unsigned long) q);
|
|
|
+ setup_timer(&q->timeout, blk_rq_timed_out_timer, (unsigned long) q);
|
|
|
+ INIT_LIST_HEAD(&q->queue_head);
|
|
|
+ INIT_LIST_HEAD(&q->timeout_list);
|
|
|
+ INIT_LIST_HEAD(&q->icq_list);
|
|
|
+#ifdef CONFIG_BLK_CGROUP
|
|
|
+ INIT_LIST_HEAD(&q->blkg_list);
|
|
|
+#endif
|
|
|
+ INIT_LIST_HEAD(&q->flush_queue[0]);
|
|
|
+ INIT_LIST_HEAD(&q->flush_queue[1]);
|
|
|
+ INIT_LIST_HEAD(&q->flush_data_in_flight);
|