Skip to content

Commit 2af8cbe

Browse files
committed
blk-mq: split tag ->rqs[] into two
This is in preparation for having two sets of tags available. For that we need a static index, and a dynamically assignable one. Signed-off-by: Jens Axboe <axboe@fb.com> Reviewed-by: Omar Sandoval <osandov@fb.com>
1 parent fd2d332 commit 2af8cbe

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

block/blk-mq-tag.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,11 @@ int blk_mq_reinit_tagset(struct blk_mq_tag_set *set)
290290
struct blk_mq_tags *tags = set->tags[i];
291291

292292
for (j = 0; j < tags->nr_tags; j++) {
293-
if (!tags->rqs[j])
293+
if (!tags->static_rqs[j])
294294
continue;
295295

296296
ret = set->ops->reinit_request(set->driver_data,
297-
tags->rqs[j]);
297+
tags->static_rqs[j]);
298298
if (ret)
299299
goto out;
300300
}

block/blk-mq-tag.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ struct blk_mq_tags {
1616
struct sbitmap_queue breserved_tags;
1717

1818
struct request **rqs;
19+
struct request **static_rqs;
1920
struct list_head page_list;
2021
};
2122

block/blk-mq.c

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,15 @@ struct request *__blk_mq_alloc_request(struct blk_mq_alloc_data *data,
223223

224224
tag = blk_mq_get_tag(data);
225225
if (tag != BLK_MQ_TAG_FAIL) {
226-
rq = data->hctx->tags->rqs[tag];
226+
rq = data->hctx->tags->static_rqs[tag];
227227

228228
if (blk_mq_tag_busy(data->hctx)) {
229229
rq->rq_flags = RQF_MQ_INFLIGHT;
230230
atomic_inc(&data->hctx->nr_active);
231231
}
232232

233233
rq->tag = tag;
234+
data->hctx->tags->rqs[tag] = rq;
234235
blk_mq_rq_ctx_init(data->q, data->ctx, rq, op);
235236
return rq;
236237
}
@@ -1567,11 +1568,13 @@ void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
15671568
int i;
15681569

15691570
for (i = 0; i < tags->nr_tags; i++) {
1570-
if (!tags->rqs[i])
1571+
struct request *rq = tags->static_rqs[i];
1572+
1573+
if (!rq)
15711574
continue;
1572-
set->ops->exit_request(set->driver_data, tags->rqs[i],
1575+
set->ops->exit_request(set->driver_data, rq,
15731576
hctx_idx, i);
1574-
tags->rqs[i] = NULL;
1577+
tags->static_rqs[i] = NULL;
15751578
}
15761579
}
15771580

@@ -1591,6 +1594,8 @@ void blk_mq_free_rq_map(struct blk_mq_tags *tags)
15911594
{
15921595
kfree(tags->rqs);
15931596
tags->rqs = NULL;
1597+
kfree(tags->static_rqs);
1598+
tags->static_rqs = NULL;
15941599

15951600
blk_mq_free_tags(tags);
15961601
}
@@ -1616,6 +1621,15 @@ struct blk_mq_tags *blk_mq_alloc_rq_map(struct blk_mq_tag_set *set,
16161621
return NULL;
16171622
}
16181623

1624+
tags->static_rqs = kzalloc_node(nr_tags * sizeof(struct request *),
1625+
GFP_NOIO | __GFP_NOWARN | __GFP_NORETRY,
1626+
set->numa_node);
1627+
if (!tags->static_rqs) {
1628+
kfree(tags->rqs);
1629+
blk_mq_free_tags(tags);
1630+
return NULL;
1631+
}
1632+
16191633
return tags;
16201634
}
16211635

@@ -1677,12 +1691,14 @@ int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
16771691
to_do = min(entries_per_page, depth - i);
16781692
left -= to_do * rq_size;
16791693
for (j = 0; j < to_do; j++) {
1680-
tags->rqs[i] = p;
1694+
struct request *rq = p;
1695+
1696+
tags->static_rqs[i] = rq;
16811697
if (set->ops->init_request) {
16821698
if (set->ops->init_request(set->driver_data,
1683-
tags->rqs[i], hctx_idx, i,
1699+
rq, hctx_idx, i,
16841700
set->numa_node)) {
1685-
tags->rqs[i] = NULL;
1701+
tags->static_rqs[i] = NULL;
16861702
goto fail;
16871703
}
16881704
}

0 commit comments

Comments
 (0)