diff options
| author | Christoph Hellwig <hch@lst.de> | 2020-03-27 09:30:11 +0100 | 
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2020-03-27 10:23:43 -0600 | 
| commit | 3d745ea5b095a3985129e162900b7e6c22518a9d (patch) | |
| tree | 38a7c6995ddf6e14ae5b7a2bc013590af4ce5f9d /block | |
| parent | ff27668ce8092c74965f21b5c02ebc6b6764db95 (diff) | |
| download | linux-3d745ea5b095a3985129e162900b7e6c22518a9d.tar.bz2 | |
block: simplify queue allocation
Current make_request based drivers use either blk_alloc_queue_node or
blk_alloc_queue to allocate a queue, and then set up the make_request_fn
function pointer and a few parameters using the blk_queue_make_request
helper.  Simplify this by passing the make_request pointer to
blk_alloc_queue, and while at it merge the _node variant into the main
helper by always passing a node_id, and remove the superfluous gfp_mask
parameter.  A lower-level __blk_alloc_queue is kept for the blk-mq case.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block')
| -rw-r--r-- | block/blk-cgroup.c | 2 | ||||
| -rw-r--r-- | block/blk-core.c | 39 | ||||
| -rw-r--r-- | block/blk-mq.c | 8 | ||||
| -rw-r--r-- | block/blk-settings.c | 36 | ||||
| -rw-r--r-- | block/blk.h | 2 | 
5 files changed, 28 insertions, 59 deletions
diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c index a229b94d5390..c15a26096038 100644 --- a/block/blk-cgroup.c +++ b/block/blk-cgroup.c @@ -1010,7 +1010,7 @@ unlock:   * blkcg_init_queue - initialize blkcg part of request queue   * @q: request_queue to initialize   * - * Called from blk_alloc_queue_node(). Responsible for initializing blkcg + * Called from __blk_alloc_queue(). Responsible for initializing blkcg   * part of new request_queue @q.   *   * RETURNS: diff --git a/block/blk-core.c b/block/blk-core.c index eaf6cb3887e6..18b8c09d093e 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -388,12 +388,6 @@ void blk_cleanup_queue(struct request_queue *q)  }  EXPORT_SYMBOL(blk_cleanup_queue); -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); -  /**   * blk_queue_enter() - try to increase q->q_usage_counter   * @q: request queue pointer @@ -470,24 +464,19 @@ static void blk_timeout_work(struct work_struct *work)  {  } -/** - * blk_alloc_queue_node - allocate a request queue - * @gfp_mask: memory allocation flags - * @node_id: NUMA node to allocate memory from - */ -struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id) +struct request_queue *__blk_alloc_queue(int node_id)  {  	struct request_queue *q;  	int ret;  	q = kmem_cache_alloc_node(blk_requestq_cachep, -				gfp_mask | __GFP_ZERO, node_id); +				GFP_KERNEL | __GFP_ZERO, node_id);  	if (!q)  		return NULL;  	q->last_merge = NULL; -	q->id = ida_simple_get(&blk_queue_ida, 0, 0, gfp_mask); +	q->id = ida_simple_get(&blk_queue_ida, 0, 0, GFP_KERNEL);  	if (q->id < 0)  		goto fail_q; @@ -495,7 +484,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)  	if (ret)  		goto fail_id; -	q->backing_dev_info = bdi_alloc_node(gfp_mask, node_id); +	q->backing_dev_info = bdi_alloc_node(GFP_KERNEL, node_id);  	if (!q->backing_dev_info)  		goto fail_split; @@ -541,6 +530,9 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)  	if (blkcg_init_queue(q))  		goto fail_ref; +	blk_queue_dma_alignment(q, 511); +	blk_set_default_limits(&q->limits); +  	return q;  fail_ref: @@ -557,7 +549,22 @@ fail_q:  	kmem_cache_free(blk_requestq_cachep, q);  	return NULL;  } -EXPORT_SYMBOL(blk_alloc_queue_node); + +struct request_queue *blk_alloc_queue(make_request_fn make_request, int node_id) +{ +	struct request_queue *q; + +	if (WARN_ON_ONCE(!make_request)) +		return -EINVAL; + +	q = __blk_alloc_queue(node_id); +	if (!q) +		return NULL; +	q->make_request_fn = make_request; +	q->nr_requests = BLKDEV_MAX_RQ; +	return q; +} +EXPORT_SYMBOL(blk_alloc_queue);  bool blk_get_queue(struct request_queue *q)  { diff --git a/block/blk-mq.c b/block/blk-mq.c index 216bf62e88b6..f6291ceedee4 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -2729,7 +2729,7 @@ struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,  {  	struct request_queue *uninit_q, *q; -	uninit_q = blk_alloc_queue_node(GFP_KERNEL, set->numa_node); +	uninit_q = __blk_alloc_queue(set->numa_node);  	if (!uninit_q)  		return ERR_PTR(-ENOMEM);  	uninit_q->queuedata = queuedata; @@ -2939,11 +2939,7 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,  	INIT_LIST_HEAD(&q->requeue_list);  	spin_lock_init(&q->requeue_lock); -	blk_queue_make_request(q, blk_mq_make_request); - -	/* -	 * Do this after blk_queue_make_request() overrides it... -	 */ +	q->make_request_fn = blk_mq_make_request;  	q->nr_requests = set->queue_depth;  	/* diff --git a/block/blk-settings.c b/block/blk-settings.c index c8eda2e7b91e..126d216a2db6 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -87,42 +87,6 @@ void blk_set_stacking_limits(struct queue_limits *lim)  EXPORT_SYMBOL(blk_set_stacking_limits);  /** - * blk_queue_make_request - define an alternate make_request function for a device - * @q:  the request queue for the device to be affected - * @mfn: the alternate make_request function - * - * Description: - *    The normal way for &struct bios to be passed to a device - *    driver is for them to be collected into requests on a request - *    queue, and then to allow the device driver to select requests - *    off that queue when it is ready.  This works well for many block - *    devices. However some block devices (typically virtual devices - *    such as md or lvm) do not benefit from the processing on the - *    request queue, and are served best by having the requests passed - *    directly to them.  This can be achieved by providing a function - *    to blk_queue_make_request(). - * - * Caveat: - *    The driver that does this *must* be able to deal appropriately - *    with buffers in "highmemory". This can be accomplished by either calling - *    kmap_atomic() to get a temporary kernel mapping, or by calling - *    blk_queue_bounce() to create a buffer in normal memory. - **/ -void blk_queue_make_request(struct request_queue *q, make_request_fn *mfn) -{ -	/* -	 * set defaults -	 */ -	q->nr_requests = BLKDEV_MAX_RQ; - -	q->make_request_fn = mfn; -	blk_queue_dma_alignment(q, 511); - -	blk_set_default_limits(&q->limits); -} -EXPORT_SYMBOL(blk_queue_make_request); - -/**   * blk_queue_bounce_limit - set bounce buffer limit for queue   * @q: the request queue for the device   * @max_addr: the maximum address the device can handle diff --git a/block/blk.h b/block/blk.h index d9673164a145..491e52fc0aa6 100644 --- a/block/blk.h +++ b/block/blk.h @@ -482,4 +482,6 @@ static inline void part_nr_sects_write(struct hd_struct *part, sector_t size)  #endif  } +struct request_queue *__blk_alloc_queue(int node_id); +  #endif /* BLK_INTERNAL_H */  |