diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-merge.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/block/blk-merge.c b/block/blk-merge.c index f5255991b773..8d8177f71ebd 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -1087,12 +1087,20 @@ bool blk_attempt_plug_merge(struct request_queue *q, struct bio *bio, if (!plug || rq_list_empty(plug->mq_list)) return false; - /* check the previously added entry for a quick merge attempt */ - rq = rq_list_peek(&plug->mq_list); - if (rq->q == q) { - if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) == - BIO_MERGE_OK) - return true; + rq_list_for_each(&plug->mq_list, rq) { + if (rq->q == q) { + if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) == + BIO_MERGE_OK) + return true; + break; + } + + /* + * Only keep iterating plug list for merges if we have multiple + * queues + */ + if (!plug->multiple_queues) + break; } return false; } |