diff mbox series

[V10,3/4] blk-mq: issue directly with bypass 'false' in blk_mq_sched_insert_requests

Message ID 1544067160-20564-4-git-send-email-jianchao.w.wang@oracle.com (mailing list archive)
State New, archived
Headers show
Series blk-mq: refactor code of issue directly | expand

Commit Message

jianchao.wang Dec. 6, 2018, 3:32 a.m. UTC
It is not necessary to issue request directly with bypass 'true'
in blk_mq_sched_insert_requests and handle the non-issued requests
itself. Just set bypass to 'false' and let blk_mq_try_issue_directly
handle them totally. Remove the blk_rq_can_direct_dispatch check,
because blk_mq_try_issue_directly can handle it well.

With respect to commit_rqs hook, we only need to care about the last
request's result. If it is inserted, invoke commit_rqs.

Signed-off-by: Jianchao Wang <jianchao.w.wang@oracle.com>
---
 block/blk-mq-sched.c |  8 +++-----
 block/blk-mq.c       | 26 +++++++++-----------------
 2 files changed, 12 insertions(+), 22 deletions(-)

Comments

Jens Axboe Dec. 6, 2018, 3:19 p.m. UTC | #1
On 12/5/18 8:32 PM, Jianchao Wang wrote:
> It is not necessary to issue request directly with bypass 'true'
> in blk_mq_sched_insert_requests and handle the non-issued requests
> itself. Just set bypass to 'false' and let blk_mq_try_issue_directly
> handle them totally. Remove the blk_rq_can_direct_dispatch check,
> because blk_mq_try_issue_directly can handle it well.
> 
> With respect to commit_rqs hook, we only need to care about the last
> request's result. If it is inserted, invoke commit_rqs.

I don't think there's anything wrong, functionally, with this patch,
but I question the logic of continuing to attempt direct dispatch
if we fail one. If we get busy on one, for instance, we should just
insert that one to the dispatch list, and insert the rest of the list
normally.
jianchao.wang Dec. 7, 2018, 1:16 a.m. UTC | #2
On 12/6/18 11:19 PM, Jens Axboe wrote:
> On 12/5/18 8:32 PM, Jianchao Wang wrote:
>> It is not necessary to issue request directly with bypass 'true'
>> in blk_mq_sched_insert_requests and handle the non-issued requests
>> itself. Just set bypass to 'false' and let blk_mq_try_issue_directly
>> handle them totally. Remove the blk_rq_can_direct_dispatch check,
>> because blk_mq_try_issue_directly can handle it well.
>>
>> With respect to commit_rqs hook, we only need to care about the last
>> request's result. If it is inserted, invoke commit_rqs.
> 
> I don't think there's anything wrong, functionally, with this patch,
> but I question the logic of continuing to attempt direct dispatch
> if we fail one. If we get busy on one, for instance, we should just
> insert that one to the dispatch list, and insert the rest of the list
> normally.
> 
> 
It is OK for me to stop to attempt direct dispatch and insert all of the
rest when meet the non-ok case.

Thanks
Jianchao
Jens Axboe Dec. 7, 2018, 1:18 a.m. UTC | #3
On 12/6/18 6:16 PM, jianchao.wang wrote:
> 
> 
> On 12/6/18 11:19 PM, Jens Axboe wrote:
>> On 12/5/18 8:32 PM, Jianchao Wang wrote:
>>> It is not necessary to issue request directly with bypass 'true'
>>> in blk_mq_sched_insert_requests and handle the non-issued requests
>>> itself. Just set bypass to 'false' and let blk_mq_try_issue_directly
>>> handle them totally. Remove the blk_rq_can_direct_dispatch check,
>>> because blk_mq_try_issue_directly can handle it well.
>>>
>>> With respect to commit_rqs hook, we only need to care about the last
>>> request's result. If it is inserted, invoke commit_rqs.
>>
>> I don't think there's anything wrong, functionally, with this patch,
>> but I question the logic of continuing to attempt direct dispatch
>> if we fail one. If we get busy on one, for instance, we should just
>> insert that one to the dispatch list, and insert the rest of the list
>> normally.
>>
>>
> It is OK for me to stop to attempt direct dispatch and insert all of the
> rest when meet the non-ok case.

Great, let's do that then, I think that makes more sense. The usual case
of not being able to dispatch is resource limited, and for that case
we'd just be wasting our time continuing to attempt direct dispatch.
diff mbox series

Patch

diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c
index f096d898..5b4d52d 100644
--- a/block/blk-mq-sched.c
+++ b/block/blk-mq-sched.c
@@ -417,12 +417,10 @@  void blk_mq_sched_insert_requests(struct blk_mq_hw_ctx *hctx,
 		 * busy in case of 'none' scheduler, and this way may save
 		 * us one extra enqueue & dequeue to sw queue.
 		 */
-		if (!hctx->dispatch_busy && !e && !run_queue_async) {
+		if (!hctx->dispatch_busy && !e && !run_queue_async)
 			blk_mq_try_issue_list_directly(hctx, list);
-			if (list_empty(list))
-				return;
-		}
-		blk_mq_insert_requests(hctx, ctx, list);
+		else
+			blk_mq_insert_requests(hctx, ctx, list);
 	}
 
 	blk_mq_run_hw_queue(hctx, run_queue_async);
diff --git a/block/blk-mq.c b/block/blk-mq.c
index a1cccdd..dd07fe1 100644
--- a/block/blk-mq.c
+++ b/block/blk-mq.c
@@ -1896,32 +1896,24 @@  blk_status_t blk_mq_request_issue_directly(struct request *rq, bool last)
 void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
 		struct list_head *list)
 {
+	blk_qc_t unused;
+	blk_status_t ret = BLK_STS_OK;
+
 	while (!list_empty(list)) {
-		blk_status_t ret;
 		struct request *rq = list_first_entry(list, struct request,
 				queuelist);
 
-		if (!blk_rq_can_direct_dispatch(rq))
-			break;
-
 		list_del_init(&rq->queuelist);
-		ret = blk_mq_request_issue_directly(rq, list_empty(list));
-		if (ret != BLK_STS_OK) {
-			if (ret == BLK_STS_RESOURCE ||
-					ret == BLK_STS_DEV_RESOURCE) {
-				list_add(&rq->queuelist, list);
-				break;
-			}
-			blk_mq_end_request(rq, ret);
-		}
+		ret = blk_mq_try_issue_directly(hctx, rq, &unused, false,
+						list_empty(list));
 	}
 
 	/*
-	 * If we didn't flush the entire list, we could have told
-	 * the driver there was more coming, but that turned out to
-	 * be a lie.
+	 * We only need to care about the last request's result,
+	 * if it is inserted, kick the hardware with commit_rqs hook.
 	 */
-	if (!list_empty(list) && hctx->queue->mq_ops->commit_rqs)
+	if ((ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) &&
+	    hctx->queue->mq_ops->commit_rqs)
 		hctx->queue->mq_ops->commit_rqs(hctx);
 }