Hi Jens On 11/13/18 11:22 AM, Jens Axboe wrote: > On 11/12/18 2:23 AM, Jianchao Wang wrote: >> Merge blk_mq_try_issue_directly and __blk_mq_try_issue_directly >> into one interface to unify the interfaces to issue requests >> directly. The merged interface takes over the requests totally, >> it could insert, end or do nothing based on the return value of >> .queue_rq and 'bypass' parameter. Then caller needn't any other >> handling any more. >> >> To make code clearer, introduce new helpers enum mq_issue_decision >> and blk_mq_make_decision to decide how to handle the non-issued >> requests. >> >> Signed-off-by: Jianchao Wang <jianchao.w.wang@xxxxxxxxxx> >> --- >> block/blk-mq.c | 108 +++++++++++++++++++++++++++++++++------------------------ >> 1 file changed, 63 insertions(+), 45 deletions(-) >> >> diff --git a/block/blk-mq.c b/block/blk-mq.c >> index 364a53f..48b7a7c 100644 >> --- a/block/blk-mq.c >> +++ b/block/blk-mq.c >> @@ -1766,77 +1766,95 @@ static blk_status_t __blk_mq_issue_directly(struct blk_mq_hw_ctx *hctx, >> return ret; >> } >> >> -static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx, >> +enum mq_issue_decision { >> + MQ_ISSUE_INSERT_QUEUE, >> + MQ_ISSUE_END_REQUEST, >> + MQ_ISSUE_DO_NOTHING, >> +}; >> + >> +static inline enum mq_issue_decision >> + blk_mq_make_dicision(blk_status_t ret, bool bypass) >> +{ >> + enum mq_issue_decision dec; >> + >> + switch(ret) { >> + case BLK_STS_OK: >> + dec = MQ_ISSUE_DO_NOTHING; >> + break; >> + case BLK_STS_DEV_RESOURCE: >> + case BLK_STS_RESOURCE: >> + dec = bypass ? MQ_ISSUE_DO_NOTHING : MQ_ISSUE_INSERT_QUEUE; >> + break; >> + default: >> + dec = bypass ? MQ_ISSUE_DO_NOTHING : MQ_ISSUE_END_REQUEST; >> + break; >> + } >> + >> + return dec; >> +} > > You seem to mix and match decision and dicision, the former is the > right spelling. > Oops, it's my bad that not find this even in V5 respin. > But more importantly, not sure I like where this is going, wrapping > the return value in some other status code. That also makes it a bit > fragile in terms of adding other status codes, another spot to update. > Like the decent distinction between RESOURCE and DEV_RESOURCE. > > Maybe it is cleaner to just handle this in the caller still? > Actually enum mq_issue_decision is introduced to reduce the depth of 'if' branch. And it is indeed not good to introduce another status value. I will discard enum mq_issue_decision and blk_mq_make_decision in next version. Thanks Jianchao