hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/block/mq-deadline-main.c
....@@ -793,6 +793,18 @@
793793 rq->elv.priv[0] = NULL;
794794 }
795795
796
+static bool dd_has_write_work(struct blk_mq_hw_ctx *hctx)
797
+{
798
+ struct deadline_data *dd = hctx->queue->elevator->elevator_data;
799
+ enum dd_prio p;
800
+
801
+ for (p = 0; p <= DD_PRIO_MAX; p++)
802
+ if (!list_empty_careful(&dd->per_prio[p].fifo_list[DD_WRITE]))
803
+ return true;
804
+
805
+ return false;
806
+}
807
+
796808 /*
797809 * Callback from inside blk_mq_free_request().
798810 *
....@@ -816,7 +828,6 @@
816828 struct dd_blkcg *blkcg = rq->elv.priv[0];
817829 const u8 ioprio_class = dd_rq_ioclass(rq);
818830 const enum dd_prio prio = ioprio_class_to_prio[ioprio_class];
819
- struct dd_per_prio *per_prio = &dd->per_prio[prio];
820831
821832 dd_count(dd, completed, prio);
822833 ddcg_count(blkcg, completed, ioprio_class);
....@@ -826,9 +837,10 @@
826837
827838 spin_lock_irqsave(&dd->zone_lock, flags);
828839 blk_req_zone_write_unlock(rq);
829
- if (!list_empty(&per_prio->fifo_list[DD_WRITE]))
830
- blk_mq_sched_mark_restart_hctx(rq->mq_hctx);
831840 spin_unlock_irqrestore(&dd->zone_lock, flags);
841
+
842
+ if (dd_has_write_work(rq->mq_hctx))
843
+ blk_mq_sched_mark_restart_hctx(rq->mq_hctx);
832844 }
833845 }
834846