Commit 2b3f056f authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

blk-mq: move the call to blk_put_queue out of blk_mq_destroy_queue



The fact that blk_mq_destroy_queue also drops a queue reference leads
to various places having to grab an extra reference.  Move the call to
blk_put_queue into the callers to allow removing the extra references.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarSagi Grimberg <sagi@grimberg.me>
Reviewed-by: default avatarChaitanya Kulkarni <kch@nvidia.com>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Link: https://lore.kernel.org/r/20221018135720.670094-2-hch@lst.de


[axboe: fix fabrics_q vs admin_q conflict in nvme core.c]
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 8ed40ee3
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -4010,9 +4010,6 @@ void blk_mq_destroy_queue(struct request_queue *q)
	blk_sync_queue(q);
	blk_mq_cancel_work_sync(q);
	blk_mq_exit_queue(q);

	/* @q is and will stay empty, shutdown and put */
	blk_put_queue(q);
}
EXPORT_SYMBOL(blk_mq_destroy_queue);

@@ -4029,6 +4026,7 @@ struct gendisk *__blk_mq_alloc_disk(struct blk_mq_tag_set *set, void *queuedata,
	disk = __alloc_disk_node(q, set->numa_node, lkclass);
	if (!disk) {
		blk_mq_destroy_queue(q);
		blk_put_queue(q);
		return ERR_PTR(-ENOMEM);
	}
	set_bit(GD_OWNS_QUEUE, &disk->state);
+2 −0
Original line number Diff line number Diff line
@@ -325,6 +325,7 @@ void bsg_remove_queue(struct request_queue *q)

		bsg_unregister_queue(bset->bd);
		blk_mq_destroy_queue(q);
		blk_put_queue(q);
		blk_mq_free_tag_set(&bset->tag_set);
		kfree(bset);
	}
@@ -400,6 +401,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
	return q;
out_cleanup_queue:
	blk_mq_destroy_queue(q);
	blk_put_queue(q);
out_queue:
	blk_mq_free_tag_set(set);
out_tag_set:
+1 −0
Original line number Diff line number Diff line
@@ -1510,6 +1510,7 @@ static int apple_nvme_probe(struct platform_device *pdev)
	if (!blk_get_queue(anv->ctrl.admin_q)) {
		nvme_start_admin_queue(&anv->ctrl);
		blk_mq_destroy_queue(anv->ctrl.admin_q);
		blk_put_queue(anv->ctrl.admin_q);
		anv->ctrl.admin_q = NULL;
		ret = -ENODEV;
		goto put_dev;
+8 −2
Original line number Diff line number Diff line
@@ -4851,6 +4851,7 @@ int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,

out_cleanup_admin_q:
	blk_mq_destroy_queue(ctrl->admin_q);
	blk_put_queue(ctrl->admin_q);
out_free_tagset:
	blk_mq_free_tag_set(ctrl->admin_tagset);
	return ret;
@@ -4860,8 +4861,11 @@ EXPORT_SYMBOL_GPL(nvme_alloc_admin_tag_set);
void nvme_remove_admin_tag_set(struct nvme_ctrl *ctrl)
{
	blk_mq_destroy_queue(ctrl->admin_q);
	if (ctrl->ops->flags & NVME_F_FABRICS)
	blk_put_queue(ctrl->admin_q);
	if (ctrl->ops->flags & NVME_F_FABRICS) {
		blk_mq_destroy_queue(ctrl->fabrics_q);
		blk_put_queue(ctrl->fabrics_q);
	}
	blk_mq_free_tag_set(ctrl->admin_tagset);
}
EXPORT_SYMBOL_GPL(nvme_remove_admin_tag_set);
@@ -4907,8 +4911,10 @@ EXPORT_SYMBOL_GPL(nvme_alloc_io_tag_set);

void nvme_remove_io_tag_set(struct nvme_ctrl *ctrl)
{
	if (ctrl->ops->flags & NVME_F_FABRICS)
	if (ctrl->ops->flags & NVME_F_FABRICS) {
		blk_mq_destroy_queue(ctrl->connect_q);
		blk_put_queue(ctrl->connect_q);
	}
	blk_mq_free_tag_set(ctrl->tagset);
}
EXPORT_SYMBOL_GPL(nvme_remove_io_tag_set);
+1 −0
Original line number Diff line number Diff line
@@ -1749,6 +1749,7 @@ static void nvme_dev_remove_admin(struct nvme_dev *dev)
		 */
		nvme_start_admin_queue(&dev->ctrl);
		blk_mq_destroy_queue(dev->ctrl.admin_q);
		blk_put_queue(dev->ctrl.admin_q);
		blk_mq_free_tag_set(&dev->admin_tagset);
	}
}
Loading