Loading block/blk-mq.c +16 −0 Original line number Diff line number Diff line Loading @@ -879,6 +879,21 @@ static bool blk_mq_get_driver_tag(struct request *rq, return false; } static void blk_mq_put_driver_tag(struct blk_mq_hw_ctx *hctx, struct request *rq) { if (rq->tag == -1 || rq->internal_tag == -1) return; blk_mq_put_tag(hctx, hctx->tags, rq->mq_ctx, rq->tag); rq->tag = -1; if (rq->rq_flags & RQF_MQ_INFLIGHT) { rq->rq_flags &= ~RQF_MQ_INFLIGHT; atomic_dec(&hctx->nr_active); } } /* * If we fail getting a driver tag because all the driver tags are already * assigned and on the dispatch list, BUT the first entry does not have a Loading Loading @@ -951,6 +966,7 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list) queued++; break; case BLK_MQ_RQ_QUEUE_BUSY: blk_mq_put_driver_tag(hctx, rq); list_add(&rq->queuelist, list); __blk_mq_requeue_request(rq); break; Loading Loading
block/blk-mq.c +16 −0 Original line number Diff line number Diff line Loading @@ -879,6 +879,21 @@ static bool blk_mq_get_driver_tag(struct request *rq, return false; } static void blk_mq_put_driver_tag(struct blk_mq_hw_ctx *hctx, struct request *rq) { if (rq->tag == -1 || rq->internal_tag == -1) return; blk_mq_put_tag(hctx, hctx->tags, rq->mq_ctx, rq->tag); rq->tag = -1; if (rq->rq_flags & RQF_MQ_INFLIGHT) { rq->rq_flags &= ~RQF_MQ_INFLIGHT; atomic_dec(&hctx->nr_active); } } /* * If we fail getting a driver tag because all the driver tags are already * assigned and on the dispatch list, BUT the first entry does not have a Loading Loading @@ -951,6 +966,7 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list) queued++; break; case BLK_MQ_RQ_QUEUE_BUSY: blk_mq_put_driver_tag(hctx, rq); list_add(&rq->queuelist, list); __blk_mq_requeue_request(rq); break; Loading