Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99cf1dc5 authored by Jens Axboe's avatar Jens Axboe
Browse files

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: default avatarJens Axboe <axboe@fb.com>
Reviewed-by: default avatarOmar Sandoval <osandov@fb.com>
Tested-by: default avatarHannes Reinecke <hare@suse.com>
parent 3c782d67
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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
@@ -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;