Messages in this thread | | | From | Doug Anderson <> | Date | Tue, 7 Apr 2020 15:04:20 -0700 | Subject | Re: [PATCH v2 2/2] blk-mq: Rerun dispatching in the case of budget contention |
| |
Hi,
On Mon, Apr 6, 2020 at 7:14 PM Ming Lei <ming.lei@redhat.com> 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@redhat.com> 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
| |