Skip to content

Commit be94f05

Browse files
committed
blk-mq: use bd->last == true for list inserts
If we are issuing a list of requests, we know if we're at the last one. If we fail issuing, ensure that we call ->commits_rqs() to flush any potential previous requests. Reviewed-by: Omar Sandoval <[email protected]> Reviewed-by: Ming Lei <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent 80ff204 commit be94f05

File tree

3 files changed

+10
-10
lines changed

3 files changed

+10
-10
lines changed

block/blk-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1334,7 +1334,7 @@ blk_status_t blk_insert_cloned_request(struct request_queue *q, struct request *
13341334
* bypass a potential scheduler on the bottom device for
13351335
* insert.
13361336
*/
1337-
return blk_mq_request_issue_directly(rq);
1337+
return blk_mq_request_issue_directly(rq, true);
13381338
}
13391339
EXPORT_SYMBOL_GPL(blk_insert_cloned_request);
13401340

block/blk-mq.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,12 +1743,12 @@ static blk_qc_t request_to_qc_t(struct blk_mq_hw_ctx *hctx, struct request *rq)
17431743

17441744
static blk_status_t __blk_mq_issue_directly(struct blk_mq_hw_ctx *hctx,
17451745
struct request *rq,
1746-
blk_qc_t *cookie)
1746+
blk_qc_t *cookie, bool last)
17471747
{
17481748
struct request_queue *q = rq->q;
17491749
struct blk_mq_queue_data bd = {
17501750
.rq = rq,
1751-
.last = true,
1751+
.last = last,
17521752
};
17531753
blk_qc_t new_cookie;
17541754
blk_status_t ret;
@@ -1783,7 +1783,7 @@ static blk_status_t __blk_mq_issue_directly(struct blk_mq_hw_ctx *hctx,
17831783
static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
17841784
struct request *rq,
17851785
blk_qc_t *cookie,
1786-
bool bypass_insert)
1786+
bool bypass_insert, bool last)
17871787
{
17881788
struct request_queue *q = rq->q;
17891789
bool run_queue = true;
@@ -1812,7 +1812,7 @@ static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
18121812
goto insert;
18131813
}
18141814

1815-
return __blk_mq_issue_directly(hctx, rq, cookie);
1815+
return __blk_mq_issue_directly(hctx, rq, cookie, last);
18161816
insert:
18171817
if (bypass_insert)
18181818
return BLK_STS_RESOURCE;
@@ -1831,7 +1831,7 @@ static void blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
18311831

18321832
hctx_lock(hctx, &srcu_idx);
18331833

1834-
ret = __blk_mq_try_issue_directly(hctx, rq, cookie, false);
1834+
ret = __blk_mq_try_issue_directly(hctx, rq, cookie, false, true);
18351835
if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE)
18361836
blk_mq_sched_insert_request(rq, false, true, false);
18371837
else if (ret != BLK_STS_OK)
@@ -1840,15 +1840,15 @@ static void blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
18401840
hctx_unlock(hctx, srcu_idx);
18411841
}
18421842

1843-
blk_status_t blk_mq_request_issue_directly(struct request *rq)
1843+
blk_status_t blk_mq_request_issue_directly(struct request *rq, bool last)
18441844
{
18451845
blk_status_t ret;
18461846
int srcu_idx;
18471847
blk_qc_t unused_cookie;
18481848
struct blk_mq_hw_ctx *hctx = rq->mq_hctx;
18491849

18501850
hctx_lock(hctx, &srcu_idx);
1851-
ret = __blk_mq_try_issue_directly(hctx, rq, &unused_cookie, true);
1851+
ret = __blk_mq_try_issue_directly(hctx, rq, &unused_cookie, true, last);
18521852
hctx_unlock(hctx, srcu_idx);
18531853

18541854
return ret;
@@ -1863,7 +1863,7 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
18631863
queuelist);
18641864

18651865
list_del_init(&rq->queuelist);
1866-
ret = blk_mq_request_issue_directly(rq);
1866+
ret = blk_mq_request_issue_directly(rq, list_empty(list));
18671867
if (ret != BLK_STS_OK) {
18681868
if (ret == BLK_STS_RESOURCE ||
18691869
ret == BLK_STS_DEV_RESOURCE) {

block/blk-mq.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void blk_mq_insert_requests(struct blk_mq_hw_ctx *hctx, struct blk_mq_ctx *ctx,
6969
struct list_head *list);
7070

7171
/* Used by blk_insert_cloned_request() to issue request directly */
72-
blk_status_t blk_mq_request_issue_directly(struct request *rq);
72+
blk_status_t blk_mq_request_issue_directly(struct request *rq, bool last);
7373
void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
7474
struct list_head *list);
7575

0 commit comments

Comments
 (0)