blk-mq: release driver tag on a requeue event
We don't want to hold on to this resource when we have a scheduler attached. Signed-off-by: Jens Axboe <axboe@fb.com> Reviewed-by: Omar Sandoval <osandov@fb.com> Tested-by: Hannes Reinecke <hare@suse.com>
This commit is contained in:
parent
3c782d67c1
commit
99cf1dc580
@ -879,6 +879,21 @@ done:
|
|||||||
return false;
|
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
|
* 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
|
* assigned and on the dispatch list, BUT the first entry does not have a
|
||||||
@ -951,6 +966,7 @@ bool blk_mq_dispatch_rq_list(struct blk_mq_hw_ctx *hctx, struct list_head *list)
|
|||||||
queued++;
|
queued++;
|
||||||
break;
|
break;
|
||||||
case BLK_MQ_RQ_QUEUE_BUSY:
|
case BLK_MQ_RQ_QUEUE_BUSY:
|
||||||
|
blk_mq_put_driver_tag(hctx, rq);
|
||||||
list_add(&rq->queuelist, list);
|
list_add(&rq->queuelist, list);
|
||||||
__blk_mq_requeue_request(rq);
|
__blk_mq_requeue_request(rq);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user