blk-mq: refactor the DONTPREP/SOFTBARRIER andling in blk_mq_requeue_work
authorChristoph Hellwig <hch@lst.de>
Thu, 13 Apr 2023 06:40:48 +0000 (08:40 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 13 Apr 2023 12:52:30 +0000 (06:52 -0600)
Split the RQF_DONTPREP and RQF_SOFTBARRIER in separate branches to make
the code more readable.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Link: https://lore.kernel.org/r/20230413064057.707578-12-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c

index c3de032..d17871c 100644 (file)
@@ -1427,20 +1427,21 @@ static void blk_mq_requeue_work(struct work_struct *work)
        spin_unlock_irq(&q->requeue_lock);
 
        list_for_each_entry_safe(rq, next, &rq_list, queuelist) {
-               if (!(rq->rq_flags & (RQF_SOFTBARRIER | RQF_DONTPREP)))
-                       continue;
-
-               rq->rq_flags &= ~RQF_SOFTBARRIER;
-               list_del_init(&rq->queuelist);
                /*
-                * If RQF_DONTPREP, rq has contained some driver specific
-                * data, so insert it to hctx dispatch list to avoid any
-                * merge.
+                * If RQF_DONTPREP ist set, the request has been started by the
+                * driver already and might have driver-specific data allocated
+                * already.  Insert it into the hctx dispatch list to avoid
+                * block layer merges for the request.
                 */
-               if (rq->rq_flags & RQF_DONTPREP)
+               if (rq->rq_flags & RQF_DONTPREP) {
+                       rq->rq_flags &= ~RQF_SOFTBARRIER;
+                       list_del_init(&rq->queuelist);
                        blk_mq_request_bypass_insert(rq, false, false);
-               else
+               } else if (rq->rq_flags & RQF_SOFTBARRIER) {
+                       rq->rq_flags &= ~RQF_SOFTBARRIER;
+                       list_del_init(&rq->queuelist);
                        blk_mq_insert_request(rq, true, false, false);
+               }
        }
 
        while (!list_empty(&rq_list)) {