On 12/5/18 12:43 AM, Jianchao Wang wrote: > We don't allow direct dispatch of anything but regular reads/writes > and insert all of non-read-write requests. However, this is not > correct for 'bypass_insert == true' case where inserting is ignored > and BLK_STS_RESOURCE is returned. The caller will fail forever. > > Fix it with inserting the non-read-write request to hctx dispatch > list to avoid to involve merge and io scheduler when bypass_insert > is true. > > Signed-off-by: Jianchao Wang <jianchao.w.wang@xxxxxxxxxx> > --- > block/blk-mq.c | 19 +++++++++++++++++-- > 1 file changed, 17 insertions(+), 2 deletions(-) > > diff --git a/block/blk-mq.c b/block/blk-mq.c > index 9005505..153af90 100644 > --- a/block/blk-mq.c > +++ b/block/blk-mq.c > @@ -1822,6 +1822,7 @@ static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx, > { > struct request_queue *q = rq->q; > bool run_queue = true; > + bool force = false; > > /* > * RCU or SRCU read lock is needed before checking quiesced flag. > @@ -1836,9 +1837,19 @@ static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx, > goto insert; > } > > - if (!blk_rq_can_direct_dispatch(rq) || (q->elevator && !bypass_insert)) > + if (q->elevator && !bypass_insert) > goto insert; > > + if (!blk_rq_can_direct_dispatch(rq)) { > + /* > + * For 'bypass_insert == true' case, insert request into hctx > + * dispatch list. > + */ > + if (bypass_insert) > + force = true; > + goto insert; > + } Just do force = bypass_insert, no need for the if. -- Jens Axboe