From 5754ab54c1b28888e9700550585c5729fccbd15f Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 28 May 2013 16:36:56 +0200 Subject: [PATCH 18/19] blk-mq: timeout fixes Either the timeout or driver completion will atomically mark a request as complete. So when we handle the timeout, ensure that blk-mq doesn't attempt to mark it complete again and then just disregard it as a racy completion. Signed-off-by: Jens Axboe --- block/blk-mq.c | 12 ++++++++---- block/blk-mq.h | 1 + block/blk-timeout.c | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/block/blk-mq.c b/block/blk-mq.c index 2ffd067..2149c1c 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -204,11 +204,8 @@ void blk_mq_finish_request(struct request *rq, int error) blk_mq_free_request(rq); } -void __blk_mq_end_io(struct request *rq, int error) +void blk_mq_complete_request(struct request *rq, int error) { - if (blk_mark_rq_complete(rq)) - return; - trace_block_rq_complete(rq->q, rq); /* @@ -219,6 +216,13 @@ void __blk_mq_end_io(struct request *rq, int error) rq->end_io(rq, error); else blk_mq_finish_request(rq, error); + +} + +void __blk_mq_end_io(struct request *rq, int error) +{ + if (!blk_mark_rq_complete(rq)) + blk_mq_complete_request(rq, error); } /* diff --git a/block/blk-mq.h b/block/blk-mq.h index 4d11154..42d0110 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h @@ -23,6 +23,7 @@ struct blk_mq_ctx { }; void __blk_mq_end_io(struct request *rq, int error); +void blk_mq_complete_request(struct request *rq, int error); void blk_mq_run_request(struct request *rq, bool run_queue, bool async); void blk_mq_run_hw_queue(struct blk_mq_hw_ctx *hctx, bool async); void blk_mq_init_flush(struct request_queue *q); diff --git a/block/blk-timeout.c b/block/blk-timeout.c index 2eda25a..6976802 100644 --- a/block/blk-timeout.c +++ b/block/blk-timeout.c @@ -90,7 +90,7 @@ static void blk_rq_timed_out(struct request *req) case BLK_EH_HANDLED: /* Can we use req->errors here? */ if (q->mq_ops) - __blk_mq_end_io(req, req->errors); + blk_mq_complete_request(req, req->errors); else __blk_complete_request(req); break; -- 1.7.4.4