nvme-fc: use the tagset alloc/free helpers
authorChristoph Hellwig <hch@lst.de>
Tue, 20 Sep 2022 15:19:36 +0000 (17:19 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 27 Sep 2022 12:44:17 +0000 (14:44 +0200)
Use the common helpers to allocate and free the tagsets.  To make this
work the generic nvme_ctrl now needs to be stored in the hctx private
data instead of the nvme_fc_ctrl.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: James Smart <jsmart2021@gmail.com>
drivers/nvme/host/fc.c

index d707cf9..5d57a04 100644 (file)
@@ -2383,10 +2383,8 @@ nvme_fc_ctrl_free(struct kref *ref)
                container_of(ref, struct nvme_fc_ctrl, ref);
        unsigned long flags;
 
-       if (ctrl->ctrl.tagset) {
-               blk_mq_destroy_queue(ctrl->ctrl.connect_q);
-               blk_mq_free_tag_set(&ctrl->tag_set);
-       }
+       if (ctrl->ctrl.tagset)
+               nvme_remove_io_tag_set(&ctrl->ctrl);
 
        /* remove from rport list */
        spin_lock_irqsave(&ctrl->rport->lock, flags);
@@ -2394,9 +2392,7 @@ nvme_fc_ctrl_free(struct kref *ref)
        spin_unlock_irqrestore(&ctrl->rport->lock, flags);
 
        nvme_start_admin_queue(&ctrl->ctrl);
-       blk_mq_destroy_queue(ctrl->ctrl.admin_q);
-       blk_mq_destroy_queue(ctrl->ctrl.fabrics_q);
-       blk_mq_free_tag_set(&ctrl->admin_tag_set);
+       nvme_remove_admin_tag_set(&ctrl->ctrl);
 
        kfree(ctrl->queues);
 
@@ -2906,32 +2902,16 @@ nvme_fc_create_io_queues(struct nvme_fc_ctrl *ctrl)
 
        nvme_fc_init_io_queues(ctrl);
 
-       memset(&ctrl->tag_set, 0, sizeof(ctrl->tag_set));
-       ctrl->tag_set.ops = &nvme_fc_mq_ops;
-       ctrl->tag_set.queue_depth = ctrl->ctrl.opts->queue_size;
-       ctrl->tag_set.reserved_tags = NVMF_RESERVED_TAGS;
-       ctrl->tag_set.numa_node = ctrl->ctrl.numa_node;
-       ctrl->tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
-       ctrl->tag_set.cmd_size =
-               struct_size((struct nvme_fcp_op_w_sgl *)NULL, priv,
-                           ctrl->lport->ops->fcprqst_priv_sz);
-       ctrl->tag_set.driver_data = &ctrl->ctrl;
-       ctrl->tag_set.nr_hw_queues = ctrl->ctrl.queue_count - 1;
-       ctrl->tag_set.timeout = NVME_IO_TIMEOUT;
-
-       ret = blk_mq_alloc_tag_set(&ctrl->tag_set);
+       ret = nvme_alloc_io_tag_set(&ctrl->ctrl, &ctrl->tag_set,
+                       &nvme_fc_mq_ops, BLK_MQ_F_SHOULD_MERGE,
+                       struct_size((struct nvme_fcp_op_w_sgl *)NULL, priv,
+                                   ctrl->lport->ops->fcprqst_priv_sz));
        if (ret)
                return ret;
 
-       ctrl->ctrl.tagset = &ctrl->tag_set;
-
-       ret = nvme_ctrl_init_connect_q(&(ctrl->ctrl));
-       if (ret)
-               goto out_free_tag_set;
-
        ret = nvme_fc_create_hw_io_queues(ctrl, ctrl->ctrl.sqsize + 1);
        if (ret)
-               goto out_cleanup_blk_queue;
+               goto out_cleanup_tagset;
 
        ret = nvme_fc_connect_io_queues(ctrl, ctrl->ctrl.sqsize + 1);
        if (ret)
@@ -2943,10 +2923,8 @@ nvme_fc_create_io_queues(struct nvme_fc_ctrl *ctrl)
 
 out_delete_hw_queues:
        nvme_fc_delete_hw_io_queues(ctrl);
-out_cleanup_blk_queue:
-       blk_mq_destroy_queue(ctrl->ctrl.connect_q);
-out_free_tag_set:
-       blk_mq_free_tag_set(&ctrl->tag_set);
+out_cleanup_tagset:
+       nvme_remove_io_tag_set(&ctrl->ctrl);
        nvme_fc_free_io_queues(ctrl);
 
        /* force put free routine to ignore io queues */
@@ -3530,35 +3508,12 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
 
        nvme_fc_init_queue(ctrl, 0);
 
-       memset(&ctrl->admin_tag_set, 0, sizeof(ctrl->admin_tag_set));
-       ctrl->admin_tag_set.ops = &nvme_fc_admin_mq_ops;
-       ctrl->admin_tag_set.queue_depth = NVME_AQ_MQ_TAG_DEPTH;
-       ctrl->admin_tag_set.reserved_tags = NVMF_RESERVED_TAGS;
-       ctrl->admin_tag_set.numa_node = ctrl->ctrl.numa_node;
-       ctrl->admin_tag_set.cmd_size =
-               struct_size((struct nvme_fcp_op_w_sgl *)NULL, priv,
-                           ctrl->lport->ops->fcprqst_priv_sz);
-       ctrl->admin_tag_set.driver_data = &ctrl->ctrl;
-       ctrl->admin_tag_set.nr_hw_queues = 1;
-       ctrl->admin_tag_set.timeout = NVME_ADMIN_TIMEOUT;
-       ctrl->admin_tag_set.flags = BLK_MQ_F_NO_SCHED;
-
-       ret = blk_mq_alloc_tag_set(&ctrl->admin_tag_set);
+       ret = nvme_alloc_admin_tag_set(&ctrl->ctrl, &ctrl->admin_tag_set,
+                       &nvme_fc_admin_mq_ops, BLK_MQ_F_NO_SCHED,
+                       struct_size((struct nvme_fcp_op_w_sgl *)NULL, priv,
+                                   ctrl->lport->ops->fcprqst_priv_sz));
        if (ret)
                goto out_free_queues;
-       ctrl->ctrl.admin_tagset = &ctrl->admin_tag_set;
-
-       ctrl->ctrl.fabrics_q = blk_mq_init_queue(&ctrl->admin_tag_set);
-       if (IS_ERR(ctrl->ctrl.fabrics_q)) {
-               ret = PTR_ERR(ctrl->ctrl.fabrics_q);
-               goto out_free_admin_tag_set;
-       }
-
-       ctrl->ctrl.admin_q = blk_mq_init_queue(&ctrl->admin_tag_set);
-       if (IS_ERR(ctrl->ctrl.admin_q)) {
-               ret = PTR_ERR(ctrl->ctrl.admin_q);
-               goto out_cleanup_fabrics_q;
-       }
 
        /*
         * Would have been nice to init io queues tag set as well.
@@ -3569,7 +3524,7 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
 
        ret = nvme_init_ctrl(&ctrl->ctrl, dev, &nvme_fc_ctrl_ops, 0);
        if (ret)
-               goto out_cleanup_admin_q;
+               goto out_cleanup_tagset;
 
        /* at this point, teardown path changes to ref counting on nvme ctrl */
 
@@ -3624,12 +3579,8 @@ fail_ctrl:
 
        return ERR_PTR(-EIO);
 
-out_cleanup_admin_q:
-       blk_mq_destroy_queue(ctrl->ctrl.admin_q);
-out_cleanup_fabrics_q:
-       blk_mq_destroy_queue(ctrl->ctrl.fabrics_q);
-out_free_admin_tag_set:
-       blk_mq_free_tag_set(&ctrl->admin_tag_set);
+out_cleanup_tagset:
+       nvme_remove_admin_tag_set(&ctrl->ctrl);
 out_free_queues:
        kfree(ctrl->queues);
 out_free_ida: