|author||Ming Lei <firstname.lastname@example.org>||2021-08-11 23:52:02 +0800|
|committer||Jens Axboe <email@example.com>||2021-08-17 08:32:45 -0600|
blk-mq: don't grab rq's refcount in blk_mq_check_expired()
Inside blk_mq_queue_tag_busy_iter() we already grabbed request's refcount before calling ->fn(), so needn't to grab it one more time in blk_mq_check_expired(). Meantime remove extra request expire check in blk_mq_check_expired(). Cc: Keith Busch <firstname.lastname@example.org> Signed-off-by: Ming Lei <email@example.com> Reviewed-by: Christoph Hellwig <firstname.lastname@example.org> Reviewed-by: John Garry <email@example.com> Link: https://firstname.lastname@example.org Signed-off-by: Jens Axboe <email@example.com>
Diffstat (limited to 'block')
1 files changed, 5 insertions, 25 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c
index 2fe396385a4a..914c71ecc72a 100644
@@ -923,34 +923,14 @@ static bool blk_mq_check_expired(struct blk_mq_hw_ctx *hctx,
unsigned long *next = priv;
- * Just do a quick check if it is expired before locking the request in
- * so we're not unnecessarilly synchronizing across CPUs.
- if (!blk_mq_req_expired(rq, next))
- return true;
- * We have reason to believe the request may be expired. Take a
- * reference on the request to lock this request lifetime into its
- * currently allocated context to prevent it from being reallocated in
- * the event the completion by-passes this timeout handler.
- * If the reference was already released, then the driver beat the
- * timeout handler to posting a natural completion.
- if (!refcount_inc_not_zero(&rq->ref))
- return true;
- * The request is now locked and cannot be reallocated underneath the
- * timeout handler's processing. Re-verify this exact request is truly
- * expired; if it is not expired, then the request was completed and
- * reallocated as a new request.
+ * blk_mq_queue_tag_busy_iter() has locked the request, so it cannot
+ * be reallocated underneath the timeout handler's processing, then
+ * the expire check is reliable. If the request is not expired, then
+ * it was completed and reallocated as a new request after returning
+ * from blk_mq_check_expired().
if (blk_mq_req_expired(rq, next))