Hi, On Mon, Apr 6, 2020 at 7:14 PM Ming Lei <ming.lei@xxxxxxxxxx> wrote: > > On Sun, Apr 05, 2020 at 09:26:39AM -0700, Doug Anderson wrote: > > Hi, > > > > On Sun, Apr 5, 2020 at 2:15 AM Ming Lei <ming.lei@xxxxxxxxxx> wrote: > > > > > > @@ -103,6 +104,9 @@ static void blk_mq_do_dispatch_sched(struct blk_mq_hw_ctx *hctx) > > > rq = e->type->ops.dispatch_request(hctx); > > > if (!rq) { > > > blk_mq_put_dispatch_budget(hctx); > > > + > > > + if (e->type->ops.has_work && e->type->ops.has_work(hctx)) > > > + blk_mq_delay_run_hw_queue(hctx, BLK_MQ_BUDGET_DELAY); > > > > To really close the race, don't we need to run all the queues > > associated with the hctx? I haven't traced it through, but I've been > > assuming that the multiple "hctx"s associated with the same queue will > > have the same budget associated with them and thus they can block each > > other out. > > Yeah, we should run all hctxs which share the same budget space. > > Also, in theory, we don't have to add the delay, however BFQ may plug the > dispatch for 9 ms, so looks delay run queue is required. I have posted up v3. A few notes: * Since we should run all "hctxs" I took out the check for has_work() before kicking the queue. * As far as I can tell the theoretical race happens for _anyone_ who puts budget, so I added it to blk_mq_put_dispatch_budget(). Feel free to shout at me in response to v3 if you believe I'm wrong about that. Thanks for all your reviews and suggestions so far! -Doug