On Wed, Apr 24, 2019 at 06:18:34PM +0200, Christoph Hellwig wrote:
> On Wed, Apr 24, 2019 at 07:02:13PM +0800, Ming Lei wrote:
> > if (rq->mq_hctx != this_hctx || rq->mq_ctx != this_ctx) {
> > if (this_hctx) {
> > trace_block_unplug(this_q, depth,
> > !from_schedule);
> > +
> > + percpu_ref_get(&this_q->q_usage_counter);
> > blk_mq_sched_insert_requests(this_hctx,
> > this_ctx,
> > &rq_list,
> > from_schedule);
> > + percpu_ref_put(&this_q->q_usage_counter);
> > }
> >
> > this_q = rq->q;
> > @@ -1757,8 +1760,11 @@ void blk_mq_flush_plug_list(struct blk_plug *plug,
> > bool from_schedule)
> > */
> > if (this_hctx) {
> > trace_block_unplug(this_q, depth, !from_schedule);
> > +
> > + percpu_ref_get(&this_q->q_usage_counter);
> > blk_mq_sched_insert_requests(this_hctx, this_ctx, &rq_list,
> > from_schedule);
> > + percpu_ref_put(&this_q->q_usage_counter);
>
> Why don't we push this into blk_mq_sched_insert_requests? Yes, it
> would need a request_queue argument, but that still seems saner
> than duplicating it in both callers.
It isn't in other callers of blk_mq_sched_insert_requests(), it is just
needed in some corner case like flush plug context.
For other callers of blk_mq_sched_insert_requests(), it is guaranteed
that request queue's ref is held.
Thanks,
Ming