On 12/6/18 12:25 AM, Jens Axboe wrote: > 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. > Yes, I will do it. Thanks Jianchao