summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Axboe <axboe@fb.com>2017-01-13 16:39:30 -0500
committerJens Axboe <axboe@fb.com>2017-01-17 12:04:15 -0500
commit2af8cbe30531eca73c8f3ba277f155fc0020b01a (patch)
tree4cdab5e44a9c2799cf1f6097a148bf46733d758d
parentfd2d332677c687ca90c12a47d6c377c547100b56 (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.c4
-rw-r--r--block/blk-mq-tag.h1
-rw-r--r--block/blk-mq.c30
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 }