diff options
author | Jens Axboe <axboe@fb.com> | 2017-01-13 16:39:30 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2017-01-17 12:04:15 -0500 |
commit | 2af8cbe30531eca73c8f3ba277f155fc0020b01a (patch) | |
tree | 4cdab5e44a9c2799cf1f6097a148bf46733d758d | |
parent | fd2d332677c687ca90c12a47d6c377c547100b56 (diff) |
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>
-rw-r--r-- | block/blk-mq-tag.c | 4 | ||||
-rw-r--r-- | block/blk-mq-tag.h | 1 | ||||
-rw-r--r-- | block/blk-mq.c | 30 |
3 files changed, 26 insertions, 9 deletions
diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index ced752716878..9753747a34a2 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c | |||
@@ -290,11 +290,11 @@ int blk_mq_reinit_tagset(struct blk_mq_tag_set *set) | |||
290 | struct blk_mq_tags *tags = set->tags[i]; | 290 | struct blk_mq_tags *tags = set->tags[i]; |
291 | 291 | ||
292 | for (j = 0; j < tags->nr_tags; j++) { | 292 | for (j = 0; j < tags->nr_tags; j++) { |
293 | if (!tags->rqs[j]) | 293 | if (!tags->static_rqs[j]) |
294 | continue; | 294 | continue; |
295 | 295 | ||
296 | ret = set->ops->reinit_request(set->driver_data, | 296 | ret = set->ops->reinit_request(set->driver_data, |
297 | tags->rqs[j]); | 297 | tags->static_rqs[j]); |
298 | if (ret) | 298 | if (ret) |
299 | goto out; | 299 | goto out; |
300 | } | 300 | } |
diff --git a/block/blk-mq-tag.h b/block/blk-mq-tag.h index 923602dd3bfb..41cd15fd1afd 100644 --- a/block/blk-mq-tag.h +++ b/block/blk-mq-tag.h | |||
@@ -16,6 +16,7 @@ struct blk_mq_tags { | |||
16 | struct sbitmap_queue breserved_tags; | 16 | struct sbitmap_queue breserved_tags; |
17 | 17 | ||
18 | struct request **rqs; | 18 | struct request **rqs; |
19 | struct request **static_rqs; | ||
19 | struct list_head page_list; | 20 | struct list_head page_list; |
20 | }; | 21 | }; |
21 | 22 | ||
diff --git a/block/blk-mq.c b/block/blk-mq.c index d40be641f3d5..89b81254201b 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c | |||
@@ -223,7 +223,7 @@ struct request *__blk_mq_alloc_request(struct blk_mq_alloc_data *data, | |||
223 | 223 | ||
224 | tag = blk_mq_get_tag(data); | 224 | tag = blk_mq_get_tag(data); |
225 | if (tag != BLK_MQ_TAG_FAIL) { | 225 | if (tag != BLK_MQ_TAG_FAIL) { |
226 | rq = data->hctx->tags->rqs[tag]; | 226 | rq = data->hctx->tags->static_rqs[tag]; |
227 | 227 | ||
228 | if (blk_mq_tag_busy(data->hctx)) { | 228 | if (blk_mq_tag_busy(data->hctx)) { |
229 | rq->rq_flags = RQF_MQ_INFLIGHT; | 229 | rq->rq_flags = RQF_MQ_INFLIGHT; |
@@ -231,6 +231,7 @@ struct request *__blk_mq_alloc_request(struct blk_mq_alloc_data *data, | |||
231 | } | 231 | } |
232 | 232 | ||
233 | rq->tag = tag; | 233 | rq->tag = tag; |
234 | data->hctx->tags->rqs[tag] = rq; | ||
234 | blk_mq_rq_ctx_init(data->q, data->ctx, rq, op); | 235 | blk_mq_rq_ctx_init(data->q, data->ctx, rq, op); |
235 | return rq; | 236 | return rq; |
236 | } | 237 | } |
@@ -1567,11 +1568,13 @@ void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags, | |||
1567 | int i; | 1568 | int i; |
1568 | 1569 | ||
1569 | for (i = 0; i < tags->nr_tags; i++) { | 1570 | 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) | ||
1571 | continue; | 1574 | continue; |
1572 | set->ops->exit_request(set->driver_data, tags->rqs[i], | 1575 | set->ops->exit_request(set->driver_data, rq, |
1573 | hctx_idx, i); | 1576 | hctx_idx, i); |
1574 | tags->rqs[i] = NULL; | 1577 | tags->static_rqs[i] = NULL; |
1575 | } | 1578 | } |
1576 | } | 1579 | } |
1577 | 1580 | ||
@@ -1591,6 +1594,8 @@ void blk_mq_free_rq_map(struct blk_mq_tags *tags) | |||
1591 | { | 1594 | { |
1592 | kfree(tags->rqs); | 1595 | kfree(tags->rqs); |
1593 | tags->rqs = NULL; | 1596 | tags->rqs = NULL; |
1597 | kfree(tags->static_rqs); | ||
1598 | tags->static_rqs = NULL; | ||
1594 | 1599 | ||
1595 | blk_mq_free_tags(tags); | 1600 | blk_mq_free_tags(tags); |
1596 | } | 1601 | } |
@@ -1616,6 +1621,15 @@ struct blk_mq_tags *blk_mq_alloc_rq_map(struct blk_mq_tag_set *set, | |||
1616 | return NULL; | 1621 | return NULL; |
1617 | } | 1622 | } |
1618 | 1623 | ||
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 | |||
1619 | return tags; | 1633 | return tags; |
1620 | } | 1634 | } |
1621 | 1635 | ||
@@ -1677,12 +1691,14 @@ int blk_mq_alloc_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags, | |||
1677 | to_do = min(entries_per_page, depth - i); | 1691 | to_do = min(entries_per_page, depth - i); |
1678 | left -= to_do * rq_size; | 1692 | left -= to_do * rq_size; |
1679 | for (j = 0; j < to_do; j++) { | 1693 | for (j = 0; j < to_do; j++) { |
1680 | tags->rqs[i] = p; | 1694 | struct request *rq = p; |
1695 | |||
1696 | tags->static_rqs[i] = rq; | ||
1681 | if (set->ops->init_request) { | 1697 | if (set->ops->init_request) { |
1682 | if (set->ops->init_request(set->driver_data, | 1698 | if (set->ops->init_request(set->driver_data, |
1683 | tags->rqs[i], hctx_idx, i, | 1699 | rq, hctx_idx, i, |
1684 | set->numa_node)) { | 1700 | set->numa_node)) { |
1685 | tags->rqs[i] = NULL; | 1701 | tags->static_rqs[i] = NULL; |
1686 | goto fail; | 1702 | goto fail; |
1687 | } | 1703 | } |
1688 | } | 1704 | } |