aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorMing Lei <ming.lei@canonical.com>2014-09-25 11:23:46 -0400
committerJens Axboe <axboe@fb.com>2014-09-25 17:22:44 -0400
commite97c293cdf77263abdc021de280516e0017afc84 (patch)
tree77e1bef4a3835fdbfe5975c78b3d0ba53f266459 /block
parent0bae352da54a95435f721705d3670a6eaefdcf87 (diff)
block: introduce 'blk_mq_ctx' parameter to blk_get_flush_queue
This patch adds 'blk_mq_ctx' parameter to blk_get_flush_queue(), so that this function can find the corresponding blk_flush_queue bound with current mq context since the flush queue will become per hw-queue. For legacy queue, the parameter can be simply 'NULL'. For multiqueue case, the parameter should be set as the context from which the related request is originated. With this context info, the hw queue and related flush queue can be found easily. Signed-off-by: Ming Lei <ming.lei@canonical.com> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'block')
-rw-r--r--block/blk-core.c2
-rw-r--r--block/blk-flush.c11
-rw-r--r--block/blk-mq.c3
-rw-r--r--block/blk.h4
4 files changed, 10 insertions, 10 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index dba0a8350807..b1dd4e086740 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -390,7 +390,7 @@ static void __blk_drain_queue(struct request_queue *q, bool drain_all)
390 * be drained. Check all the queues and counters. 390 * be drained. Check all the queues and counters.
391 */ 391 */
392 if (drain_all) { 392 if (drain_all) {
393 struct blk_flush_queue *fq = blk_get_flush_queue(q); 393 struct blk_flush_queue *fq = blk_get_flush_queue(q, NULL);
394 drain |= !list_empty(&q->queue_head); 394 drain |= !list_empty(&q->queue_head);
395 for (i = 0; i < 2; i++) { 395 for (i = 0; i < 2; i++) {
396 drain |= q->nr_rqs[i]; 396 drain |= q->nr_rqs[i];
diff --git a/block/blk-flush.c b/block/blk-flush.c
index 9bc5b4f35c23..004d95e4098e 100644
--- a/block/blk-flush.c
+++ b/block/blk-flush.c
@@ -223,7 +223,7 @@ static void flush_end_io(struct request *flush_rq, int error)
223 bool queued = false; 223 bool queued = false;
224 struct request *rq, *n; 224 struct request *rq, *n;
225 unsigned long flags = 0; 225 unsigned long flags = 0;
226 struct blk_flush_queue *fq = blk_get_flush_queue(q); 226 struct blk_flush_queue *fq = blk_get_flush_queue(q, flush_rq->mq_ctx);
227 227
228 if (q->mq_ops) { 228 if (q->mq_ops) {
229 spin_lock_irqsave(&fq->mq_flush_lock, flags); 229 spin_lock_irqsave(&fq->mq_flush_lock, flags);
@@ -319,7 +319,7 @@ static bool blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq)
319static void flush_data_end_io(struct request *rq, int error) 319static void flush_data_end_io(struct request *rq, int error)
320{ 320{
321 struct request_queue *q = rq->q; 321 struct request_queue *q = rq->q;
322 struct blk_flush_queue *fq = blk_get_flush_queue(q); 322 struct blk_flush_queue *fq = blk_get_flush_queue(q, NULL);
323 323
324 /* 324 /*
325 * After populating an empty queue, kick it to avoid stall. Read 325 * After populating an empty queue, kick it to avoid stall. Read
@@ -333,11 +333,10 @@ static void mq_flush_data_end_io(struct request *rq, int error)
333{ 333{
334 struct request_queue *q = rq->q; 334 struct request_queue *q = rq->q;
335 struct blk_mq_hw_ctx *hctx; 335 struct blk_mq_hw_ctx *hctx;
336 struct blk_mq_ctx *ctx; 336 struct blk_mq_ctx *ctx = rq->mq_ctx;
337 unsigned long flags; 337 unsigned long flags;
338 struct blk_flush_queue *fq = blk_get_flush_queue(q); 338 struct blk_flush_queue *fq = blk_get_flush_queue(q, ctx);
339 339
340 ctx = rq->mq_ctx;
341 hctx = q->mq_ops->map_queue(q, ctx->cpu); 340 hctx = q->mq_ops->map_queue(q, ctx->cpu);
342 341
343 /* 342 /*
@@ -367,7 +366,7 @@ void blk_insert_flush(struct request *rq)
367 struct request_queue *q = rq->q; 366 struct request_queue *q = rq->q;
368 unsigned int fflags = q->flush_flags; /* may change, cache */ 367 unsigned int fflags = q->flush_flags; /* may change, cache */
369 unsigned int policy = blk_flush_policy(fflags, rq); 368 unsigned int policy = blk_flush_policy(fflags, rq);
370 struct blk_flush_queue *fq = blk_get_flush_queue(q); 369 struct blk_flush_queue *fq = blk_get_flush_queue(q, rq->mq_ctx);
371 370
372 /* 371 /*
373 * @policy now records what operations need to be done. Adjust 372 * @policy now records what operations need to be done. Adjust
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 59ca79634cb9..53b6def12fc4 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -518,7 +518,8 @@ static inline bool is_flush_request(struct request *rq,
518struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag) 518struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag)
519{ 519{
520 struct request *rq = tags->rqs[tag]; 520 struct request *rq = tags->rqs[tag];
521 struct blk_flush_queue *fq = blk_get_flush_queue(rq->q); 521 /* mq_ctx of flush rq is always cloned from the corresponding req */
522 struct blk_flush_queue *fq = blk_get_flush_queue(rq->q, rq->mq_ctx);
522 523
523 if (!is_flush_request(rq, fq, tag)) 524 if (!is_flush_request(rq, fq, tag))
524 return rq; 525 return rq;
diff --git a/block/blk.h b/block/blk.h
index 9eaa6e91b13f..7ecdd8517e69 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -29,7 +29,7 @@ extern struct kobj_type blk_queue_ktype;
29extern struct ida blk_queue_ida; 29extern struct ida blk_queue_ida;
30 30
31static inline struct blk_flush_queue *blk_get_flush_queue( 31static inline struct blk_flush_queue *blk_get_flush_queue(
32 struct request_queue *q) 32 struct request_queue *q, struct blk_mq_ctx *ctx)
33{ 33{
34 return q->fq; 34 return q->fq;
35} 35}
@@ -106,7 +106,7 @@ void blk_insert_flush(struct request *rq);
106static inline struct request *__elv_next_request(struct request_queue *q) 106static inline struct request *__elv_next_request(struct request_queue *q)
107{ 107{
108 struct request *rq; 108 struct request *rq;
109 struct blk_flush_queue *fq = blk_get_flush_queue(q); 109 struct blk_flush_queue *fq = blk_get_flush_queue(q, NULL);
110 110
111 while (1) { 111 while (1) {
112 if (!list_empty(&q->queue_head)) { 112 if (!list_empty(&q->queue_head)) {