summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaohua Li <shli@fb.com>2017-10-07 03:56:00 +0300
committerJens Axboe <axboe@kernel.dk>2017-10-10 22:48:16 +0300
commit85acb3ba2f925a0ec6928c1967c3adefa00682f4 (patch)
tree8f33cf0708140ea17e4fa3d3fc31aadfd1867b0e
parenteca8b53a6769e60d6d8240d71202d73b0af81901 (diff)
downloadlinux-85acb3ba2f925a0ec6928c1967c3adefa00682f4.tar.xz
block: set request_list for request
Legacy queue sets request's request_list, mq doesn't. This makes mq does the same thing, so we can find cgroup of a request. Note, we really only use blkg field of request_list, it's pointless to allocate mempool for request_list in mq case. Signed-off-by: Shaohua Li <shli@fb.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r--block/blk-core.c2
-rw-r--r--block/blk-mq.c5
2 files changed, 6 insertions, 1 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 14f7674fa0b1..e8e149ccc86b 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -718,7 +718,7 @@ static void free_request_size(void *element, void *data)
int blk_init_rl(struct request_list *rl, struct request_queue *q,
gfp_t gfp_mask)
{
- if (unlikely(rl->rq_pool))
+ if (unlikely(rl->rq_pool) || q->mq_ops)
return 0;
rl->q = q;
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 076cbab9c3e0..40cba1b1978f 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -481,6 +481,9 @@ void blk_mq_free_request(struct request *rq)
wbt_done(q->rq_wb, &rq->issue_stat);
+ if (blk_rq_rl(rq))
+ blk_put_rl(blk_rq_rl(rq));
+
clear_bit(REQ_ATOM_STARTED, &rq->atomic_flags);
clear_bit(REQ_ATOM_POLL_SLEPT, &rq->atomic_flags);
if (rq->tag != -1)
@@ -1532,6 +1535,8 @@ static void blk_mq_bio_to_request(struct request *rq, struct bio *bio)
{
blk_init_request_from_bio(rq, bio);
+ blk_rq_set_rl(rq, blk_get_rl(rq->q, bio));
+
blk_account_io_start(rq, true);
}