* another request associated with @q is found on the plug list
  * (optional, may be %NULL)
  *
- * Determine whether @bio being queued on @q can be merged with a request
- * on %current's plugged list.  Returns %true if merge was successful,
+ * Determine whether @bio being queued on @q can be merged with the previous
+ * request on %current's plugged list.  Returns %true if merge was successful,
  * otherwise %false.
  *
  * Plugging coalesces IOs from the same issuer for the same purpose without
 {
        struct blk_plug *plug;
        struct request *rq;
-       struct list_head *plug_list;
 
        plug = blk_mq_plug(q, bio);
-       if (!plug)
+       if (!plug || list_empty(&plug->mq_list))
                return false;
 
-       plug_list = &plug->mq_list;
-
-       list_for_each_entry_reverse(rq, plug_list, queuelist) {
-               if (rq->q == q && same_queue_rq) {
-                       /*
-                        * Only blk-mq multiple hardware queues case checks the
-                        * rq in the same queue, there should be only one such
-                        * rq in a queue
-                        **/
-                       *same_queue_rq = rq;
-               }
-
-               if (rq->q != q)
-                       continue;
-
-               if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) ==
-                   BIO_MERGE_OK)
-                       return true;
+       /* check the previously added entry for a quick merge attempt */
+       rq = list_last_entry(&plug->mq_list, struct request, queuelist);
+       if (rq->q == q && same_queue_rq) {
+               /*
+                * Only blk-mq multiple hardware queues case checks the rq in
+                * the same queue, there should be only one such rq in a queue
+                */
+               *same_queue_rq = rq;
        }
-
+       if (blk_attempt_bio_merge(q, rq, bio, nr_segs, false) == BIO_MERGE_OK)
+               return true;
        return false;
 }