FROMGIT: 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. Change-Id: Ic79ef3c0dbc005013f78c580aa27b5434f143bd9 Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Sagi Grimberg <sagi@grimberg.me> Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com> Reviewed-by: Keith 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: Jens Axboe <axboe@kernel.dk> (cherry picked from commit 2b3f056f72e56fa07df69b4705e0b46a6c08e77c git://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next) Signed-off-by: Bart Van Assche <bvanassche@google.com>
This commit is contained in:
parent
06a25b851e
commit
0188abead5
@ -4055,9 +4055,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);
|
||||
|
||||
@ -4074,6 +4071,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);
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -4880,6 +4880,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(set);
|
||||
ctrl->admin_q = NULL;
|
||||
@ -4891,8 +4892,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);
|
||||
@ -4940,8 +4944,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);
|
||||
|
@ -1750,6 +1750,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);
|
||||
}
|
||||
}
|
||||
|
@ -1486,6 +1486,7 @@ void __scsi_remove_device(struct scsi_device *sdev)
|
||||
mutex_unlock(&sdev->state_mutex);
|
||||
|
||||
blk_mq_destroy_queue(sdev->request_queue);
|
||||
blk_put_queue(sdev->request_queue);
|
||||
kref_put(&sdev->host->tagset_refcnt, scsi_mq_free_tags);
|
||||
cancel_work_sync(&sdev->requeue_work);
|
||||
|
||||
|
@ -9647,6 +9647,7 @@ void ufshcd_remove(struct ufs_hba *hba)
|
||||
ufshpb_remove(hba);
|
||||
ufs_sysfs_remove_nodes(hba->dev);
|
||||
blk_mq_destroy_queue(hba->tmf_queue);
|
||||
blk_put_queue(hba->tmf_queue);
|
||||
blk_mq_free_tag_set(&hba->tmf_tag_set);
|
||||
scsi_remove_host(hba->host);
|
||||
/* disable interrupts */
|
||||
@ -9946,6 +9947,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
||||
|
||||
free_tmf_queue:
|
||||
blk_mq_destroy_queue(hba->tmf_queue);
|
||||
blk_put_queue(hba->tmf_queue);
|
||||
free_tmf_tag_set:
|
||||
blk_mq_free_tag_set(&hba->tmf_tag_set);
|
||||
out_remove_scsi_host:
|
||||
|
Loading…
Reference in New Issue
Block a user