summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Elliott <elliott@hp.com>2014-05-20 16:46:26 -0500
committerJens Axboe <axboe@fb.com>2014-05-20 15:49:03 -0600
commitda41a589f52464e24ddefe76814ee35bfb07950c (patch)
treee3270f36a1a5766e2433b70b0eef4e2205096075
parenteba7176826ddab1d04c51bb2d5f2bbf22865444c (diff)
blk-mq: Micro-optimize blk_queue_nomerges() check
In blk_mq_make_request(), do the blk_queue_nomerges() check outside the call to blk_attempt_plug_merge() to eliminate function call overhead when nomerges=2 (disabled) Signed-off-by: Robert Elliott <elliott@hp.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--block/blk-core.c8
-rw-r--r--block/blk-mq.c3
2 files changed, 6 insertions, 5 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index fe81e19099a..5b6f768a7c0 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1471,6 +1471,8 @@ bool bio_attempt_front_merge(struct request_queue *q, struct request *req,
* added on the elevator at this point. In addition, we don't have
* reliable access to the elevator outside queue lock. Only check basic
* merging parameters without querying the elevator.
+ *
+ * Caller must ensure !blk_queue_nomerges(q) beforehand.
*/
bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio,
unsigned int *request_count)
@@ -1480,9 +1482,6 @@ bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio,
bool ret = false;
struct list_head *plug_list;
- if (blk_queue_nomerges(q))
- goto out;
-
plug = current->plug;
if (!plug)
goto out;
@@ -1561,7 +1560,8 @@ void blk_queue_bio(struct request_queue *q, struct bio *bio)
* Check if we can merge with the plugged list before grabbing
* any locks.
*/
- if (blk_attempt_plug_merge(q, bio, &request_count))
+ if (!blk_queue_nomerges(q) &&
+ blk_attempt_plug_merge(q, bio, &request_count))
return;
spin_lock_irq(q->queue_lock);
diff --git a/block/blk-mq.c b/block/blk-mq.c
index fec8fcc4f8a..ef7ed5e95d6 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1087,7 +1087,8 @@ static void blk_mq_make_request(struct request_queue *q, struct bio *bio)
return;
}
- if (use_plug && blk_attempt_plug_merge(q, bio, &request_count))
+ if (use_plug && !blk_queue_nomerges(q) &&
+ blk_attempt_plug_merge(q, bio, &request_count))
return;
if (blk_mq_queue_enter(q)) {