Skip to content

Commit 63064be

Browse files
John Garryaxboe
authored andcommitted
blk-mq: Add blk_mq_alloc_map_and_rqs()
Add a function to combine allocating tags and the associated requests, and factor out common patterns to use this new function. Some function only call blk_mq_alloc_map_and_rqs() now, but more functionality will be added later. Also make blk_mq_alloc_rq_map() and blk_mq_alloc_rqs() static since they are only used in blk-mq.c, and finally rename some functions for conciseness and consistency with other function names: - __blk_mq_alloc_map_and_{request -> rqs}() - blk_mq_alloc_{map_and_requests -> set_map_and_rqs}() Suggested-by: Ming Lei <[email protected]> Signed-off-by: John Garry <[email protected]> Reviewed-by: Hannes Reinecke <[email protected]> Reviewed-by: Ming Lei <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent a7e7388 commit 63064be

File tree

4 files changed

+42
-53
lines changed

4 files changed

+42
-53
lines changed

block/blk-mq-sched.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -519,21 +519,12 @@ static int blk_mq_sched_alloc_map_and_rqs(struct request_queue *q,
519519
struct blk_mq_hw_ctx *hctx,
520520
unsigned int hctx_idx)
521521
{
522-
struct blk_mq_tag_set *set = q->tag_set;
523-
int ret;
522+
hctx->sched_tags = blk_mq_alloc_map_and_rqs(q->tag_set, hctx_idx,
523+
q->nr_requests);
524524

525-
hctx->sched_tags = blk_mq_alloc_rq_map(set, hctx_idx, q->nr_requests,
526-
set->reserved_tags, set->flags);
527525
if (!hctx->sched_tags)
528526
return -ENOMEM;
529-
530-
ret = blk_mq_alloc_rqs(set, hctx->sched_tags, hctx_idx, q->nr_requests);
531-
if (ret) {
532-
blk_mq_free_rq_map(hctx->sched_tags, set->flags);
533-
hctx->sched_tags = NULL;
534-
}
535-
536-
return ret;
527+
return 0;
537528
}
538529

539530
/* called in queue's release handler, tagset has gone away */

block/blk-mq-tag.c

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,6 @@ int blk_mq_tag_update_depth(struct blk_mq_hw_ctx *hctx,
592592
if (tdepth > tags->nr_tags) {
593593
struct blk_mq_tag_set *set = hctx->queue->tag_set;
594594
struct blk_mq_tags *new;
595-
bool ret;
596595

597596
if (!can_grow)
598597
return -EINVAL;
@@ -604,15 +603,9 @@ int blk_mq_tag_update_depth(struct blk_mq_hw_ctx *hctx,
604603
if (tdepth > MAX_SCHED_RQ)
605604
return -EINVAL;
606605

607-
new = blk_mq_alloc_rq_map(set, hctx->queue_num, tdepth,
608-
tags->nr_reserved_tags, set->flags);
606+
new = blk_mq_alloc_map_and_rqs(set, hctx->queue_num, tdepth);
609607
if (!new)
610608
return -ENOMEM;
611-
ret = blk_mq_alloc_rqs(set, new, hctx->queue_num, tdepth);
612-
if (ret) {
613-
blk_mq_free_rq_map(new, set->flags);
614-
return -ENOMEM;
615-
}
616609

617610
blk_mq_free_rqs(set, *tagsptr, hctx->queue_num);
618611
blk_mq_free_rq_map(*tagsptr, set->flags);

block/blk-mq.c

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2392,11 +2392,11 @@ void blk_mq_free_rq_map(struct blk_mq_tags *tags, unsigned int flags)
23922392
blk_mq_free_tags(tags, flags);
23932393
}
23942394

2395-
struct blk_mq_tags *blk_mq_alloc_rq_map(struct blk_mq_tag_set *set,
2396-
unsigned int hctx_idx,
2397-
unsigned int nr_tags,
2398-
unsigned int reserved_tags,
2399-
unsigned int flags)
2395+
static struct blk_mq_tags *blk_mq_alloc_rq_map(struct blk_mq_tag_set *set,
2396+
unsigned int hctx_idx,
2397+
unsigned int nr_tags,
2398+
unsigned int reserved_tags,
2399+
unsigned int flags)
24002400
{
24012401
struct blk_mq_tags *tags;
24022402
int node;
@@ -2444,8 +2444,9 @@ static int blk_mq_init_request(struct blk_mq_tag_set *set, struct request *rq,
24442444
return 0;
24452445
}
24462446

2447-
int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
2448-
unsigned int hctx_idx, unsigned int depth)
2447+
static int blk_mq_alloc_rqs(struct blk_mq_tag_set *set,
2448+
struct blk_mq_tags *tags,
2449+
unsigned int hctx_idx, unsigned int depth)
24492450
{
24502451
unsigned int i, j, entries_per_page, max_order = 4;
24512452
size_t rq_size, left;
@@ -2856,25 +2857,34 @@ static void blk_mq_init_cpu_queues(struct request_queue *q,
28562857
}
28572858
}
28582859

2859-
static bool __blk_mq_alloc_map_and_request(struct blk_mq_tag_set *set,
2860-
int hctx_idx)
2860+
struct blk_mq_tags *blk_mq_alloc_map_and_rqs(struct blk_mq_tag_set *set,
2861+
unsigned int hctx_idx,
2862+
unsigned int depth)
28612863
{
2862-
unsigned int flags = set->flags;
2863-
int ret = 0;
2864+
struct blk_mq_tags *tags;
2865+
int ret;
28642866

2865-
set->tags[hctx_idx] = blk_mq_alloc_rq_map(set, hctx_idx,
2866-
set->queue_depth, set->reserved_tags, flags);
2867-
if (!set->tags[hctx_idx])
2868-
return false;
2867+
tags = blk_mq_alloc_rq_map(set, hctx_idx, depth, set->reserved_tags,
2868+
set->flags);
2869+
if (!tags)
2870+
return NULL;
28692871

2870-
ret = blk_mq_alloc_rqs(set, set->tags[hctx_idx], hctx_idx,
2871-
set->queue_depth);
2872-
if (!ret)
2873-
return true;
2872+
ret = blk_mq_alloc_rqs(set, tags, hctx_idx, depth);
2873+
if (ret) {
2874+
blk_mq_free_rq_map(tags, set->flags);
2875+
return NULL;
2876+
}
28742877

2875-
blk_mq_free_rq_map(set->tags[hctx_idx], flags);
2876-
set->tags[hctx_idx] = NULL;
2877-
return false;
2878+
return tags;
2879+
}
2880+
2881+
static bool __blk_mq_alloc_map_and_rqs(struct blk_mq_tag_set *set,
2882+
int hctx_idx)
2883+
{
2884+
set->tags[hctx_idx] = blk_mq_alloc_map_and_rqs(set, hctx_idx,
2885+
set->queue_depth);
2886+
2887+
return set->tags[hctx_idx];
28782888
}
28792889

28802890
static void blk_mq_free_map_and_requests(struct blk_mq_tag_set *set,
@@ -2919,7 +2929,7 @@ static void blk_mq_map_swqueue(struct request_queue *q)
29192929
hctx_idx = set->map[j].mq_map[i];
29202930
/* unmapped hw queue can be remapped after CPU topo changed */
29212931
if (!set->tags[hctx_idx] &&
2922-
!__blk_mq_alloc_map_and_request(set, hctx_idx)) {
2932+
!__blk_mq_alloc_map_and_rqs(set, hctx_idx)) {
29232933
/*
29242934
* If tags initialization fail for some hctx,
29252935
* that hctx won't be brought online. In this
@@ -3352,7 +3362,7 @@ static int __blk_mq_alloc_rq_maps(struct blk_mq_tag_set *set)
33523362
int i;
33533363

33543364
for (i = 0; i < set->nr_hw_queues; i++) {
3355-
if (!__blk_mq_alloc_map_and_request(set, i))
3365+
if (!__blk_mq_alloc_map_and_rqs(set, i))
33563366
goto out_unwind;
33573367
cond_resched();
33583368
}
@@ -3371,7 +3381,7 @@ static int __blk_mq_alloc_rq_maps(struct blk_mq_tag_set *set)
33713381
* may reduce the depth asked for, if memory is tight. set->queue_depth
33723382
* will be updated to reflect the allocated depth.
33733383
*/
3374-
static int blk_mq_alloc_map_and_requests(struct blk_mq_tag_set *set)
3384+
static int blk_mq_alloc_set_map_and_rqs(struct blk_mq_tag_set *set)
33753385
{
33763386
unsigned int depth;
33773387
int err;
@@ -3537,7 +3547,7 @@ int blk_mq_alloc_tag_set(struct blk_mq_tag_set *set)
35373547
if (ret)
35383548
goto out_free_mq_map;
35393549

3540-
ret = blk_mq_alloc_map_and_requests(set);
3550+
ret = blk_mq_alloc_set_map_and_rqs(set);
35413551
if (ret)
35423552
goto out_free_mq_map;
35433553

block/blk-mq.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,8 @@ void blk_mq_put_rq_ref(struct request *rq);
5555
void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
5656
unsigned int hctx_idx);
5757
void blk_mq_free_rq_map(struct blk_mq_tags *tags, unsigned int flags);
58-
struct blk_mq_tags *blk_mq_alloc_rq_map(struct blk_mq_tag_set *set,
59-
unsigned int hctx_idx,
60-
unsigned int nr_tags,
61-
unsigned int reserved_tags,
62-
unsigned int flags);
63-
int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
64-
unsigned int hctx_idx, unsigned int depth);
58+
struct blk_mq_tags *blk_mq_alloc_map_and_rqs(struct blk_mq_tag_set *set,
59+
unsigned int hctx_idx, unsigned int depth);
6560

6661
/*
6762
* Internal helpers for request insertion into sw queues

0 commit comments

Comments
 (0)