Few more patches from the centralization set
Subsystems (3)
Sagi Grimberg
maintainercover Few more patches from the centralization set
Mostly nvme-rdma. I'm trying to work my way incrementally so I can start moving logic to nvme core in steps.
In the next set, I'll start detaching transport specific from the reset, delete and error recovery flows.
In the set after that, I'll start adding the new transport ctrl->ops and move some logic to the core.
Currently the new ctrl ops I'm shooting for are:
* ->alloc_admin_queue()
* ->free_admin_queue()
* ->start_admin_queue()
* ->stop_admin_queue()
* ->alloc_io_queues() /* admin/io separation is due to how pci releases queues */
* ->free_io_queues()
* ->start_io_queues()
* ->stop_io_queues()
* ->alloc_tagset()
* ->free_tagset()
* ->transport_enable() /* for pcie mostly */
* ->verify_ctrl() /* for post features sanity checks */
* ->fast_fail_io() /* for fc aborts handling */
Feedback and discussion is welcome.
Sagi Grimberg (12):
nvme-rdma: move nvme_rdma_configure_admin_queue code location
nvme: Add admin_tagset pointer to nvme_ctrl
nvme-rdma: move tagset allocation to a dedicated routine
nvme-rdma: disable the controller on resets
nvme-rdma: don't free tagset on resets
nvme-rdma: reuse configure/destroy_admin_queue
nvme-rdma: introduce configure/destroy io queues
nvme-rdma: stop queues instead of simply flipping their state
nvme-rdma: rename nvme_rdma_init_queue to nvme_rdma_alloc_queue
nvme-rdma: introduce nvme_rdma_start_queue
nvme-rdma: cleanup error path in controller reset
nvme-rdma: call ops->reg_read64 instead of nvmf_reg_read64
drivers/nvme/host/fc.c | 1 + drivers/nvme/host/nvme.h | 1 + drivers/nvme/host/pci.c | 1 + drivers/nvme/host/rdma.c | 545 +++++++++++++++++++++++---------------------- drivers/nvme/target/loop.c | 1 + 5 files changed, 284 insertions(+), 265 deletions(-)
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 1/12 nvme-rdma: move nvme_rdma_configure_admin_queue code location
We will call it from other places so avoid having to forward declare it. Also move it next to nvme_rdma_destroy_admin_queue.
--- drivers/nvme/host/rdma.c | 185 ++++++++++++++++++++++++----------------------- 1 file changed, 94 insertions(+), 91 deletions(-)
drivers/nvme/host/rdma.c +94 -91
@@ -152,6 +152,9 @@ static int nvme_rdma_cm_handler(struct rdma_cm_id *cm_id, struct rdma_cm_event *event);static void nvme_rdma_recv_done (struct ib_cq *cq,struct ib_wc *wc); +static const struct blk_mq_ops nvme_rdma_mq_ops; +static const struct blk_mq_ops nvme_rdma_admin_mq_ops; +/* XXX: really should move to a generic header sooner or later.. */ static inline void put_unaligned_le24 (u32 val,u8 *p) {
@@ -662,6 +665,97 @@ static void nvme_rdma_destroy_admin_queue(struct nvme_rdma_ctrl *ctrl)nvme_rdma_dev_put (ctrl->device); } +static int nvme_rdma_configure_admin_queue (struct nvme_rdma_ctrl *ctrl) +{ +int error; + + error =nvme_rdma_init_queue (ctrl,0 ,NVME_AQ_DEPTH ); +if (error) +return error; + + ctrl->device = ctrl->queues[0 ].device; + +/* +* We need a reference on the device as long as the tag_set is alive, +* as the MRs in the request structures need a valid ib_device. +*/ + error = -EINVAL ; +if (!nvme_rdma_dev_get (ctrl->device)) + goto out_free_queue; + + ctrl->max_fr_pages =min_t (u32,NVME_RDMA_MAX_SEGMENTS , + ctrl->device->dev->attrs.max_fast_reg_page_list_len); + +memset (&ctrl->admin_tag_set,0 ,sizeof (ctrl->admin_tag_set)); + ctrl->admin_tag_set.ops = &nvme_rdma_admin_mq_ops; + ctrl->admin_tag_set.queue_depth =NVME_RDMA_AQ_BLKMQ_DEPTH ; + ctrl->admin_tag_set.reserved_tags =2 ;/* connect + keep-alive */ + ctrl->admin_tag_set.numa_node =NUMA_NO_NODE ; + ctrl->admin_tag_set.cmd_size =sizeof (struct nvme_rdma_request ) + +SG_CHUNK_SIZE *sizeof (struct scatterlist ); + ctrl->admin_tag_set.driver_data = ctrl; + ctrl->admin_tag_set.nr_hw_queues =1 ; + ctrl->admin_tag_set.timeout =ADMIN_TIMEOUT ; + + error =blk_mq_alloc_tag_set (&ctrl->admin_tag_set); +if (error) + goto out_put_dev; + + ctrl->ctrl.admin_q =blk_mq_init_queue (&ctrl->admin_tag_set); +if (IS_ERR (ctrl->ctrl.admin_q)) { + error =PTR_ERR (ctrl->ctrl.admin_q); + goto out_free_tagset; + } + + error =nvmf_connect_admin_queue (&ctrl->ctrl); +if (error) + goto out_cleanup_queue; + +set_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[0 ].flags); + + error =nvmf_reg_read64 (&ctrl->ctrl,NVME_REG_CAP , + &ctrl->ctrl.cap); +if (error) { +dev_err (ctrl->ctrl.device, +"prop_get NVME_REG_CAP failed\n" ); + goto out_cleanup_queue; + } + + ctrl->ctrl.sqsize = +min_t (int,NVME_CAP_MQES (ctrl->ctrl.cap), ctrl->ctrl.sqsize); + + error =nvme_enable_ctrl (&ctrl->ctrl, ctrl->ctrl.cap); +if (error) + goto out_cleanup_queue; + + ctrl->ctrl.max_hw_sectors = + (ctrl->max_fr_pages -1 ) << (PAGE_SHIFT -9 ); + + error =nvme_init_identify (&ctrl->ctrl); +if (error) + goto out_cleanup_queue; + + error =nvme_rdma_alloc_qe (ctrl->queues[0 ].device->dev, + &ctrl->async_event_sqe,sizeof (struct nvme_command ), +DMA_TO_DEVICE ); +if (error) + goto out_cleanup_queue; + +return 0 ; + +out_cleanup_queue: +blk_cleanup_queue (ctrl->ctrl.admin_q); +out_free_tagset: +/* disconnect and drain the queue before freeing the tagset */ +nvme_rdma_stop_queue (&ctrl->queues[0 ]); +blk_mq_free_tag_set (&ctrl->admin_tag_set); +out_put_dev: +nvme_rdma_dev_put (ctrl->device); +out_free_queue: +nvme_rdma_free_queue (&ctrl->queues[0 ]); +return error; +} +static void nvme_rdma_free_ctrl (struct nvme_ctrl *nctrl) {struct nvme_rdma_ctrl *ctrl =to_rdma_ctrl (nctrl);
@@ -1534,97 +1628,6 @@ static const struct blk_mq_ops nvme_rdma_admin_mq_ops = { .timeout = nvme_rdma_timeout, }; -static int nvme_rdma_configure_admin_queue (struct nvme_rdma_ctrl *ctrl) -{ -int error; - - error =nvme_rdma_init_queue (ctrl,0 ,NVME_AQ_DEPTH ); -if (error) -return error; - - ctrl->device = ctrl->queues[0 ].device; - -/* -* We need a reference on the device as long as the tag_set is alive, -* as the MRs in the request structures need a valid ib_device. -*/ - error = -EINVAL ; -if (!nvme_rdma_dev_get (ctrl->device)) - goto out_free_queue; - - ctrl->max_fr_pages =min_t (u32,NVME_RDMA_MAX_SEGMENTS , - ctrl->device->dev->attrs.max_fast_reg_page_list_len); - -memset (&ctrl->admin_tag_set,0 ,sizeof (ctrl->admin_tag_set)); - ctrl->admin_tag_set.ops = &nvme_rdma_admin_mq_ops; - ctrl->admin_tag_set.queue_depth =NVME_RDMA_AQ_BLKMQ_DEPTH ; - ctrl->admin_tag_set.reserved_tags =2 ;/* connect + keep-alive */ - ctrl->admin_tag_set.numa_node =NUMA_NO_NODE ; - ctrl->admin_tag_set.cmd_size =sizeof (struct nvme_rdma_request ) + -SG_CHUNK_SIZE *sizeof (struct scatterlist ); - ctrl->admin_tag_set.driver_data = ctrl; - ctrl->admin_tag_set.nr_hw_queues =1 ; - ctrl->admin_tag_set.timeout =ADMIN_TIMEOUT ; - - error =blk_mq_alloc_tag_set (&ctrl->admin_tag_set); -if (error) - goto out_put_dev; - - ctrl->ctrl.admin_q =blk_mq_init_queue (&ctrl->admin_tag_set); -if (IS_ERR (ctrl->ctrl.admin_q)) { - error =PTR_ERR (ctrl->ctrl.admin_q); - goto out_free_tagset; - } - - error =nvmf_connect_admin_queue (&ctrl->ctrl); -if (error) - goto out_cleanup_queue; - -set_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[0 ].flags); - - error =nvmf_reg_read64 (&ctrl->ctrl,NVME_REG_CAP , - &ctrl->ctrl.cap); -if (error) { -dev_err (ctrl->ctrl.device, -"prop_get NVME_REG_CAP failed\n" ); - goto out_cleanup_queue; - } - - ctrl->ctrl.sqsize = -min_t (int,NVME_CAP_MQES (ctrl->ctrl.cap), ctrl->ctrl.sqsize); - - error =nvme_enable_ctrl (&ctrl->ctrl, ctrl->ctrl.cap); -if (error) - goto out_cleanup_queue; - - ctrl->ctrl.max_hw_sectors = - (ctrl->max_fr_pages -1 ) << (PAGE_SHIFT -9 ); - - error =nvme_init_identify (&ctrl->ctrl); -if (error) - goto out_cleanup_queue; - - error =nvme_rdma_alloc_qe (ctrl->queues[0 ].device->dev, - &ctrl->async_event_sqe,sizeof (struct nvme_command ), -DMA_TO_DEVICE ); -if (error) - goto out_cleanup_queue; - -return 0 ; - -out_cleanup_queue: -blk_cleanup_queue (ctrl->ctrl.admin_q); -out_free_tagset: -/* disconnect and drain the queue before freeing the tagset */ -nvme_rdma_stop_queue (&ctrl->queues[0 ]); -blk_mq_free_tag_set (&ctrl->admin_tag_set); -out_put_dev: -nvme_rdma_dev_put (ctrl->device); -out_free_queue: -nvme_rdma_free_queue (&ctrl->queues[0 ]); -return error; -} -static void nvme_rdma_shutdown_ctrl (struct nvme_rdma_ctrl *ctrl) {cancel_work_sync (&ctrl->err_work);
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 2/12 nvme: Add admin_tagset pointer to nvme_ctrl
In reply to Sagi GrimbergWill be used when we centralize control flows. only rdma for now.
--- drivers/nvme/host/fc.c | 1 + drivers/nvme/host/nvme.h | 1 + drivers/nvme/host/pci.c | 1 + drivers/nvme/host/rdma.c | 1 + drivers/nvme/target/loop.c | 1 + 5 files changed, 5 insertions(+)
drivers/nvme/host/fc.c +1 -0
@@ -2730,6 +2730,7 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts, ret =blk_mq_alloc_tag_set (&ctrl->admin_tag_set);if (ret) goto out_free_queues; + ctrl->ctrl.admin_tagset = &ctrl->admin_tag_set; ctrl->ctrl.admin_q =blk_mq_init_queue (&ctrl->admin_tag_set);if (IS_ERR (ctrl->ctrl.admin_q)) {
drivers/nvme/host/nvme.h +1 -0
@@ -125,6 +125,7 @@ struct nvme_ctrl {struct kref kref;int instance;struct blk_mq_tag_set *tagset; +struct blk_mq_tag_set *admin_tagset;struct list_head namespaces;struct mutex namespaces_mutex;struct device *device;/* char device */
drivers/nvme/host/pci.c +1 -0
@@ -1340,6 +1340,7 @@ static int nvme_alloc_admin_tags(struct nvme_dev *dev)if (blk_mq_alloc_tag_set (&dev->admin_tagset))return -ENOMEM ; + dev->ctrl.admin_tagset = &dev->admin_tagset; dev->ctrl.admin_q =blk_mq_init_queue (&dev->admin_tagset);if (IS_ERR (dev->ctrl.admin_q)) {
drivers/nvme/host/rdma.c +1 -0
@@ -700,6 +700,7 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl) error =blk_mq_alloc_tag_set (&ctrl->admin_tag_set);if (error) goto out_put_dev; + ctrl->ctrl.admin_tagset = &ctrl->admin_tag_set; ctrl->ctrl.admin_q =blk_mq_init_queue (&ctrl->admin_tag_set);if (IS_ERR (ctrl->ctrl.admin_q)) {
drivers/nvme/target/loop.c +1 -0
@@ -375,6 +375,7 @@ static int nvme_loop_configure_admin_queue(struct nvme_loop_ctrl *ctrl) error =blk_mq_alloc_tag_set (&ctrl->admin_tag_set);if (error) goto out_free_sq; + ctrl->ctrl.admin_tagset = &ctrl->admin_tag_set; ctrl->ctrl.admin_q =blk_mq_init_queue (&ctrl->admin_tag_set);if (IS_ERR (ctrl->ctrl.admin_q)) {
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 3/12 nvme-rdma: move tagset allocation to a dedicated routine
In reply to Sagi GrimbergWe always pair tagset allocation with rdma device reference and it shares some code, centralize it with an argument if its an admin or IO tagset.
--- drivers/nvme/host/rdma.c | 131 +++++++++++++++++++++++++++-------------------- 1 file changed, 75 insertions(+), 56 deletions(-)
drivers/nvme/host/rdma.c +75 -56
@@ -655,14 +655,79 @@ static int nvme_rdma_init_io_queues(struct nvme_rdma_ctrl *ctrl)return ret; } +static void nvme_rdma_free_tagset (struct nvme_ctrl *nctrl,bool admin) +{ +struct nvme_rdma_ctrl *ctrl =to_rdma_ctrl (nctrl); +struct blk_mq_tag_set *set = admin ? + &ctrl->admin_tag_set : &ctrl->tag_set; + +blk_mq_free_tag_set (set); +nvme_rdma_dev_put (ctrl->device); +} + +static struct blk_mq_tag_set *nvme_rdma_alloc_tagset (struct nvme_ctrl *nctrl, +bool admin) +{ +struct nvme_rdma_ctrl *ctrl =to_rdma_ctrl (nctrl); +struct blk_mq_tag_set *set; +int ret; + +if (admin) { + set = &ctrl->admin_tag_set; +memset (set,0 ,sizeof (*set)); + set->ops = &nvme_rdma_admin_mq_ops; + set->queue_depth =NVME_RDMA_AQ_BLKMQ_DEPTH ; + set->reserved_tags =2 ;/* connect + keep-alive */ + set->numa_node =NUMA_NO_NODE ; + set->cmd_size =sizeof (struct nvme_rdma_request ) + +SG_CHUNK_SIZE *sizeof (struct scatterlist ); + set->driver_data = ctrl; + set->nr_hw_queues =1 ; + set->timeout =ADMIN_TIMEOUT ; + }else { + set = &ctrl->tag_set; +memset (set,0 ,sizeof (*set)); + set->ops = &nvme_rdma_mq_ops; + set->queue_depth = nctrl->opts->queue_size; + set->reserved_tags =1 ;/* fabric connect */ + set->numa_node =NUMA_NO_NODE ; + set->flags =BLK_MQ_F_SHOULD_MERGE ; + set->cmd_size =sizeof (struct nvme_rdma_request ) + +SG_CHUNK_SIZE *sizeof (struct scatterlist ); + set->driver_data = ctrl; + set->nr_hw_queues = nctrl->queue_count -1 ; + set->timeout =NVME_IO_TIMEOUT ; + } + + ret =blk_mq_alloc_tag_set (set); +if (ret) + goto out; + +/* +* We need a reference on the device as long as the tag_set is alive, +* as the MRs in the request structures need a valid ib_device. +*/ + ret =nvme_rdma_dev_get (ctrl->device); +if (!ret) { + ret = -EINVAL ; + goto out_free_tagset; + } + +return set; + +out_free_tagset: +blk_mq_free_tag_set (set); +out: +return ERR_PTR (ret); +} +static void nvme_rdma_destroy_admin_queue (struct nvme_rdma_ctrl *ctrl) {nvme_rdma_free_qe (ctrl->queues[0 ].device->dev, &ctrl->async_event_sqe,sizeof (struct nvme_command ),DMA_TO_DEVICE );nvme_rdma_stop_and_free_queue (&ctrl->queues[0 ]);blk_cleanup_queue (ctrl->ctrl.admin_q); -blk_mq_free_tag_set (&ctrl->admin_tag_set); -nvme_rdma_dev_put (ctrl->device); +nvme_rdma_free_tagset (&ctrl->ctrl, true); }static int nvme_rdma_configure_admin_queue (struct nvme_rdma_ctrl *ctrl)
@@ -675,32 +740,12 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl) ctrl->device = ctrl->queues[0 ].device; -/* -* We need a reference on the device as long as the tag_set is alive, -* as the MRs in the request structures need a valid ib_device. -*/ - error = -EINVAL ; -if (!nvme_rdma_dev_get (ctrl->device)) - goto out_free_queue; - ctrl->max_fr_pages =min_t (u32,NVME_RDMA_MAX_SEGMENTS , ctrl->device->dev->attrs.max_fast_reg_page_list_len); -memset (&ctrl->admin_tag_set,0 ,sizeof (ctrl->admin_tag_set)); - ctrl->admin_tag_set.ops = &nvme_rdma_admin_mq_ops; - ctrl->admin_tag_set.queue_depth =NVME_RDMA_AQ_BLKMQ_DEPTH ; - ctrl->admin_tag_set.reserved_tags =2 ;/* connect + keep-alive */ - ctrl->admin_tag_set.numa_node =NUMA_NO_NODE ; - ctrl->admin_tag_set.cmd_size =sizeof (struct nvme_rdma_request ) + -SG_CHUNK_SIZE *sizeof (struct scatterlist ); - ctrl->admin_tag_set.driver_data = ctrl; - ctrl->admin_tag_set.nr_hw_queues =1 ; - ctrl->admin_tag_set.timeout =ADMIN_TIMEOUT ; - - error =blk_mq_alloc_tag_set (&ctrl->admin_tag_set); -if (error) - goto out_put_dev; - ctrl->ctrl.admin_tagset = &ctrl->admin_tag_set; + ctrl->ctrl.admin_tagset =nvme_rdma_alloc_tagset (&ctrl->ctrl, true); +if (IS_ERR (ctrl->ctrl.admin_tagset)) + goto out_free_queue; ctrl->ctrl.admin_q =blk_mq_init_queue (&ctrl->admin_tag_set);if (IS_ERR (ctrl->ctrl.admin_q)) {
@@ -749,9 +794,7 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl) out_free_tagset:/* disconnect and drain the queue before freeing the tagset */ nvme_rdma_stop_queue (&ctrl->queues[0 ]); -blk_mq_free_tag_set (&ctrl->admin_tag_set); -out_put_dev: -nvme_rdma_dev_put (ctrl->device); +nvme_rdma_free_tagset (&ctrl->ctrl, true); out_free_queue:nvme_rdma_free_queue (&ctrl->queues[0 ]);return error;
@@ -1661,8 +1704,7 @@ static void __nvme_rdma_remove_ctrl(struct nvme_rdma_ctrl *ctrl, bool shutdown)nvme_uninit_ctrl (&ctrl->ctrl);if (ctrl->ctrl.tagset) {blk_cleanup_queue (ctrl->ctrl.connect_q); -blk_mq_free_tag_set (&ctrl->tag_set); -nvme_rdma_dev_put (ctrl->device); +nvme_rdma_free_tagset (&ctrl->ctrl, false); }nvme_put_ctrl (&ctrl->ctrl);
@@ -1781,31 +1823,10 @@ static int nvme_rdma_create_io_queues(struct nvme_rdma_ctrl *ctrl)if (ret)return ret; -/* -* We need a reference on the device as long as the tag_set is alive, -* as the MRs in the request structures need a valid ib_device. -*/ - ret = -EINVAL ; -if (!nvme_rdma_dev_get (ctrl->device)) + ctrl->ctrl.tagset =nvme_rdma_alloc_tagset (&ctrl->ctrl, true); +if (IS_ERR (ctrl->ctrl.tagset)) goto out_free_io_queues; -memset (&ctrl->tag_set,0 ,sizeof (ctrl->tag_set)); - ctrl->tag_set.ops = &nvme_rdma_mq_ops; - ctrl->tag_set.queue_depth = ctrl->ctrl.opts->queue_size; - ctrl->tag_set.reserved_tags =1 ;/* fabric connect */ - ctrl->tag_set.numa_node =NUMA_NO_NODE ; - ctrl->tag_set.flags =BLK_MQ_F_SHOULD_MERGE ; - ctrl->tag_set.cmd_size =sizeof (struct nvme_rdma_request ) + -SG_CHUNK_SIZE *sizeof (struct scatterlist ); - ctrl->tag_set.driver_data = 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); -if (ret) - goto out_put_dev; - ctrl->ctrl.tagset = &ctrl->tag_set; - ctrl->ctrl.connect_q =blk_mq_init_queue (&ctrl->tag_set);if (IS_ERR (ctrl->ctrl.connect_q)) { ret =PTR_ERR (ctrl->ctrl.connect_q);
@@ -1821,9 +1842,7 @@ static int nvme_rdma_create_io_queues(struct nvme_rdma_ctrl *ctrl) out_cleanup_connect_q:blk_cleanup_queue (ctrl->ctrl.connect_q); out_free_tag_set: -blk_mq_free_tag_set (&ctrl->tag_set); -out_put_dev: -nvme_rdma_dev_put (ctrl->device); +nvme_rdma_free_tagset (&ctrl->ctrl, false); out_free_io_queues:nvme_rdma_free_io_queues (ctrl);return ret;
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 4/12 nvme-rdma: disable the controller on resets
In reply to Sagi Grimbergmimic pci driver. Also like pci, some controllers might treat shutdown more heavily.
--- drivers/nvme/host/rdma.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/nvme/host/rdma.c +6 -4
@@ -1672,7 +1672,7 @@ static const struct blk_mq_ops nvme_rdma_admin_mq_ops = { .timeout = nvme_rdma_timeout, }; -static void nvme_rdma_shutdown_ctrl (struct nvme_rdma_ctrl *ctrl) +static void nvme_rdma_shutdown_ctrl (struct nvme_rdma_ctrl *ctrl,bool shutdown) {cancel_work_sync (&ctrl->err_work);cancel_delayed_work_sync (&ctrl->reconnect_work);
@@ -1684,8 +1684,10 @@ static void nvme_rdma_shutdown_ctrl(struct nvme_rdma_ctrl *ctrl)nvme_rdma_free_io_queues (ctrl); } -if (test_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[0 ].flags)) +if (shutdown)nvme_shutdown_ctrl (&ctrl->ctrl); +else +nvme_disable_ctrl (&ctrl->ctrl, ctrl->ctrl.cap);blk_mq_quiesce_queue (ctrl->ctrl.admin_q); blk_mq_tagset_busy_iter(&ctrl->admin_tag_set,
@@ -1699,7 +1701,7 @@ static void __nvme_rdma_remove_ctrl(struct nvme_rdma_ctrl *ctrl, bool shutdown)nvme_stop_ctrl (&ctrl->ctrl);nvme_remove_namespaces (&ctrl->ctrl);if (shutdown) -nvme_rdma_shutdown_ctrl (ctrl); +nvme_rdma_shutdown_ctrl (ctrl, shutdown);nvme_uninit_ctrl (&ctrl->ctrl);if (ctrl->ctrl.tagset) {
@@ -1763,7 +1765,7 @@ static void nvme_rdma_reset_ctrl_work(struct work_struct *work)bool changed;nvme_stop_ctrl (&ctrl->ctrl); -nvme_rdma_shutdown_ctrl (ctrl); +nvme_rdma_shutdown_ctrl (ctrl, false); ret =nvme_rdma_configure_admin_queue (ctrl);if (ret) {
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 5/12 nvme-rdma: don't free tagset on resets
In reply to Sagi GrimbergWe're not supposed to do that.
--- drivers/nvme/host/rdma.c | 48 +++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-)
drivers/nvme/host/rdma.c +29 -19
@@ -721,16 +721,20 @@ static struct blk_mq_tag_set *nvme_rdma_alloc_tagset(struct nvme_ctrl *nctrl,return ERR_PTR (ret); } -static void nvme_rdma_destroy_admin_queue (struct nvme_rdma_ctrl *ctrl) +static void nvme_rdma_destroy_admin_queue (struct nvme_rdma_ctrl *ctrl, +bool remove) {nvme_rdma_free_qe (ctrl->queues[0 ].device->dev, &ctrl->async_event_sqe,sizeof (struct nvme_command ),DMA_TO_DEVICE );nvme_rdma_stop_and_free_queue (&ctrl->queues[0 ]); -blk_cleanup_queue (ctrl->ctrl.admin_q); -nvme_rdma_free_tagset (&ctrl->ctrl, true); +if (remove) { +blk_cleanup_queue (ctrl->ctrl.admin_q); +nvme_rdma_free_tagset (&ctrl->ctrl, true); + } } -static int nvme_rdma_configure_admin_queue (struct nvme_rdma_ctrl *ctrl) +static int nvme_rdma_configure_admin_queue (struct nvme_rdma_ctrl *ctrl, +bool new) {int error;
@@ -743,14 +747,20 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl) ctrl->max_fr_pages =min_t (u32,NVME_RDMA_MAX_SEGMENTS , ctrl->device->dev->attrs.max_fast_reg_page_list_len); - ctrl->ctrl.admin_tagset =nvme_rdma_alloc_tagset (&ctrl->ctrl, true); -if (IS_ERR (ctrl->ctrl.admin_tagset)) - goto out_free_queue; +if (new) { + ctrl->ctrl.admin_tagset =nvme_rdma_alloc_tagset (&ctrl->ctrl, true); +if (IS_ERR (ctrl->ctrl.admin_tagset)) + goto out_free_queue; - ctrl->ctrl.admin_q =blk_mq_init_queue (&ctrl->admin_tag_set); -if (IS_ERR (ctrl->ctrl.admin_q)) { - error =PTR_ERR (ctrl->ctrl.admin_q); - goto out_free_tagset; + ctrl->ctrl.admin_q =blk_mq_init_queue (&ctrl->admin_tag_set); +if (IS_ERR (ctrl->ctrl.admin_q)) { + error =PTR_ERR (ctrl->ctrl.admin_q); + goto out_free_tagset; + } + }else { + error =blk_mq_reinit_tagset (&ctrl->admin_tag_set); +if (error) + goto out_free_queue; } error =nvmf_connect_admin_queue (&ctrl->ctrl);
@@ -790,11 +800,11 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl)return 0 ; out_cleanup_queue: -blk_cleanup_queue (ctrl->ctrl.admin_q); +if (new) +blk_cleanup_queue (ctrl->ctrl.admin_q); out_free_tagset: -/* disconnect and drain the queue before freeing the tagset */ -nvme_rdma_stop_queue (&ctrl->queues[0 ]); -nvme_rdma_free_tagset (&ctrl->ctrl, true); +if (new) +nvme_rdma_free_tagset (&ctrl->ctrl, true); out_free_queue:nvme_rdma_free_queue (&ctrl->queues[0 ]);return error;
@@ -1693,7 +1703,7 @@ static void nvme_rdma_shutdown_ctrl(struct nvme_rdma_ctrl *ctrl, bool shutdown)blk_mq_tagset_busy_iter (&ctrl->admin_tag_set, nvme_cancel_request, &ctrl->ctrl);blk_mq_unquiesce_queue (ctrl->ctrl.admin_q); -nvme_rdma_destroy_admin_queue (ctrl); +nvme_rdma_destroy_admin_queue (ctrl, shutdown); }static void __nvme_rdma_remove_ctrl (struct nvme_rdma_ctrl *ctrl,bool shutdown)
@@ -1767,7 +1777,7 @@ static void nvme_rdma_reset_ctrl_work(struct work_struct *work)nvme_stop_ctrl (&ctrl->ctrl);nvme_rdma_shutdown_ctrl (ctrl, false); - ret =nvme_rdma_configure_admin_queue (ctrl); + ret =nvme_rdma_configure_admin_queue (ctrl, false);if (ret) {/* ctrl is already shutdown, just remove the ctrl */ INIT_WORK (&ctrl->delete_work, nvme_rdma_remove_ctrl_work);
@@ -1907,7 +1917,7 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev,if (!ctrl->queues) goto out_uninit_ctrl; - ret =nvme_rdma_configure_admin_queue (ctrl); + ret =nvme_rdma_configure_admin_queue (ctrl, true);if (ret) goto out_kfree_queues;
@@ -1964,7 +1974,7 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev,return &ctrl->ctrl; out_remove_admin_queue: -nvme_rdma_destroy_admin_queue (ctrl); +nvme_rdma_destroy_admin_queue (ctrl, true); out_kfree_queues:kfree (ctrl->queues); out_uninit_ctrl:
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 6/12 nvme-rdma: reuse configure/destroy_admin_queue
In reply to Sagi GrimbergNo need to open-code it.
--- drivers/nvme/host/rdma.c | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-)
drivers/nvme/host/rdma.c +2 -17
@@ -864,23 +864,8 @@ static void nvme_rdma_reconnect_ctrl_work(struct work_struct *work) goto requeue; } -nvme_rdma_stop_and_free_queue (&ctrl->queues[0 ]); - - ret =blk_mq_reinit_tagset (&ctrl->admin_tag_set); -if (ret) - goto requeue; - - ret =nvme_rdma_init_queue (ctrl,0 ,NVME_AQ_DEPTH ); -if (ret) - goto requeue; - - ret =nvmf_connect_admin_queue (&ctrl->ctrl); -if (ret) - goto requeue; - -set_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[0 ].flags); - - ret =nvme_enable_ctrl (&ctrl->ctrl, ctrl->ctrl.cap); +nvme_rdma_destroy_admin_queue (ctrl, false); + ret =nvme_rdma_configure_admin_queue (ctrl, false);if (ret) goto requeue;
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 7/12 nvme-rdma: introduce configure/destroy io queues
In reply to Sagi GrimbergMake a symmetrical handling with admin queue.
--- drivers/nvme/host/rdma.c | 159 ++++++++++++++++++++++++----------------------- 1 file changed, 80 insertions(+), 79 deletions(-)
drivers/nvme/host/rdma.c +80 -79
@@ -561,30 +561,36 @@ static int nvme_rdma_init_queue(struct nvme_rdma_ctrl *ctrl,static void nvme_rdma_stop_queue (struct nvme_rdma_queue *queue) { +if (!test_and_clear_bit (NVME_RDMA_Q_LIVE , &queue->flags)) +return ; +rdma_disconnect (queue->cm_id);ib_drain_qp (queue->qp); }static void nvme_rdma_free_queue (struct nvme_rdma_queue *queue) { +if (test_and_set_bit (NVME_RDMA_Q_DELETING , &queue->flags)) +return ; +nvme_rdma_destroy_queue_ib (queue);rdma_destroy_id (queue->cm_id); } -static void nvme_rdma_stop_and_free_queue (struct nvme_rdma_queue *queue) +static void nvme_rdma_free_io_queues (struct nvme_rdma_ctrl *ctrl) { -if (test_and_set_bit (NVME_RDMA_Q_DELETING , &queue->flags)) -return ; -nvme_rdma_stop_queue (queue); -nvme_rdma_free_queue (queue); +int i; + +for (i =1 ; i < ctrl->ctrl.queue_count; i++) +nvme_rdma_free_queue (&ctrl->queues[i]); } -static void nvme_rdma_free_io_queues (struct nvme_rdma_ctrl *ctrl) +static void nvme_rdma_stop_io_queues (struct nvme_rdma_ctrl *ctrl) {int i;for (i =1 ; i < ctrl->ctrl.queue_count; i++) -nvme_rdma_stop_and_free_queue (&ctrl->queues[i]); +nvme_rdma_stop_queue (&ctrl->queues[i]); }static int nvme_rdma_connect_io_queues (struct nvme_rdma_ctrl *ctrl)
@@ -596,15 +602,15 @@ static int nvme_rdma_connect_io_queues(struct nvme_rdma_ctrl *ctrl)if (ret) {dev_info (ctrl->ctrl.device,"failed to connect i/o queue: %d\n" , ret); - goto out_free_queues; + goto out_stop_queues; }set_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[i].flags); }return 0 ; -out_free_queues: -nvme_rdma_free_io_queues (ctrl); +out_stop_queues: +nvme_rdma_stop_io_queues (ctrl);return ret; }
@@ -650,7 +656,7 @@ static int nvme_rdma_init_io_queues(struct nvme_rdma_ctrl *ctrl) out_free_queues:for (i--; i >=1 ; i--) -nvme_rdma_stop_and_free_queue (&ctrl->queues[i]); +nvme_rdma_free_queue (&ctrl->queues[i]);return ret; }
@@ -726,11 +732,12 @@ static void nvme_rdma_destroy_admin_queue(struct nvme_rdma_ctrl *ctrl, {nvme_rdma_free_qe (ctrl->queues[0 ].device->dev, &ctrl->async_event_sqe,sizeof (struct nvme_command ),DMA_TO_DEVICE ); -nvme_rdma_stop_and_free_queue (&ctrl->queues[0 ]); +nvme_rdma_stop_queue (&ctrl->queues[0 ]);if (remove) {blk_cleanup_queue (ctrl->ctrl.admin_q);nvme_rdma_free_tagset (&ctrl->ctrl, true); } +nvme_rdma_free_queue (&ctrl->queues[0 ]); } static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl,
@@ -810,6 +817,61 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl,return error; } +static void nvme_rdma_destroy_io_queues (struct nvme_rdma_ctrl *ctrl, +bool remove) +{ +nvme_rdma_stop_io_queues (ctrl); +if (remove) { +blk_cleanup_queue (ctrl->ctrl.connect_q); +nvme_rdma_free_tagset (&ctrl->ctrl, false); + } +nvme_rdma_free_io_queues (ctrl); +} + +static int nvme_rdma_configure_io_queues (struct nvme_rdma_ctrl *ctrl,bool new) +{ +int ret; + + ret =nvme_rdma_init_io_queues (ctrl); +if (ret) +return ret; + +if (new) { + ctrl->ctrl.tagset =nvme_rdma_alloc_tagset (&ctrl->ctrl, false); +if (IS_ERR (ctrl->ctrl.tagset)) + goto out_free_io_queues; + + ctrl->ctrl.connect_q =blk_mq_init_queue (&ctrl->tag_set); +if (IS_ERR (ctrl->ctrl.connect_q)) { + ret =PTR_ERR (ctrl->ctrl.connect_q); + goto out_free_tag_set; + } + }else { + ret =blk_mq_reinit_tagset (&ctrl->tag_set); +if (ret) + goto out_free_io_queues; + +blk_mq_update_nr_hw_queues (&ctrl->tag_set, + ctrl->ctrl.queue_count -1 ); + } + + ret =nvme_rdma_connect_io_queues (ctrl); +if (ret) + goto out_cleanup_connect_q; + +return 0 ; + +out_cleanup_connect_q: +if (new) +blk_cleanup_queue (ctrl->ctrl.connect_q); +out_free_tag_set: +if (new) +nvme_rdma_free_tagset (&ctrl->ctrl, false); +out_free_io_queues: +nvme_rdma_free_io_queues (ctrl); +return ret; +} +static void nvme_rdma_free_ctrl (struct nvme_ctrl *nctrl) {struct nvme_rdma_ctrl *ctrl =to_rdma_ctrl (nctrl);
@@ -856,13 +918,8 @@ static void nvme_rdma_reconnect_ctrl_work(struct work_struct *work) ++ctrl->ctrl.nr_reconnects; -if (ctrl->ctrl.queue_count >1 ) { -nvme_rdma_free_io_queues (ctrl); - - ret =blk_mq_reinit_tagset (&ctrl->tag_set); -if (ret) - goto requeue; - } +if (ctrl->ctrl.queue_count >1 ) +nvme_rdma_destroy_io_queues (ctrl, false);nvme_rdma_destroy_admin_queue (ctrl, false); ret =nvme_rdma_configure_admin_queue (ctrl, false);
@@ -870,16 +927,9 @@ static void nvme_rdma_reconnect_ctrl_work(struct work_struct *work) goto requeue;if (ctrl->ctrl.queue_count >1 ) { - ret =nvme_rdma_init_io_queues (ctrl); + ret =nvme_rdma_configure_io_queues (ctrl, false);if (ret) goto requeue; - - ret =nvme_rdma_connect_io_queues (ctrl); -if (ret) - goto requeue; - -blk_mq_update_nr_hw_queues (&ctrl->tag_set, - ctrl->ctrl.queue_count -1 ); } changed =nvme_change_ctrl_state (&ctrl->ctrl,NVME_CTRL_LIVE );
@@ -1676,7 +1726,7 @@ static void nvme_rdma_shutdown_ctrl(struct nvme_rdma_ctrl *ctrl, bool shutdown)nvme_stop_queues (&ctrl->ctrl);blk_mq_tagset_busy_iter (&ctrl->tag_set, nvme_cancel_request, &ctrl->ctrl); -nvme_rdma_free_io_queues (ctrl); +nvme_rdma_destroy_io_queues (ctrl, shutdown); }if (shutdown)
@@ -1699,11 +1749,6 @@ static void __nvme_rdma_remove_ctrl(struct nvme_rdma_ctrl *ctrl, bool shutdown)nvme_rdma_shutdown_ctrl (ctrl, shutdown);nvme_uninit_ctrl (&ctrl->ctrl); -if (ctrl->ctrl.tagset) { -blk_cleanup_queue (ctrl->ctrl.connect_q); -nvme_rdma_free_tagset (&ctrl->ctrl, false); - } -nvme_put_ctrl (&ctrl->ctrl); }
@@ -1770,20 +1815,9 @@ static void nvme_rdma_reset_ctrl_work(struct work_struct *work) }if (ctrl->ctrl.queue_count >1 ) { - ret =blk_mq_reinit_tagset (&ctrl->tag_set); -if (ret) - goto del_dead_ctrl; - - ret =nvme_rdma_init_io_queues (ctrl); + ret =nvme_rdma_configure_io_queues (ctrl, false);if (ret) goto del_dead_ctrl; - - ret =nvme_rdma_connect_io_queues (ctrl); -if (ret) - goto del_dead_ctrl; - -blk_mq_update_nr_hw_queues (&ctrl->tag_set, - ctrl->ctrl.queue_count -1 ); } changed =nvme_change_ctrl_state (&ctrl->ctrl,NVME_CTRL_LIVE );
@@ -1812,39 +1846,6 @@ static const struct nvme_ctrl_ops nvme_rdma_ctrl_ops = { .get_address = nvmf_get_address, }; -static int nvme_rdma_create_io_queues (struct nvme_rdma_ctrl *ctrl) -{ -int ret; - - ret =nvme_rdma_init_io_queues (ctrl); -if (ret) -return ret; - - ctrl->ctrl.tagset =nvme_rdma_alloc_tagset (&ctrl->ctrl, true); -if (IS_ERR (ctrl->ctrl.tagset)) - goto out_free_io_queues; - - ctrl->ctrl.connect_q =blk_mq_init_queue (&ctrl->tag_set); -if (IS_ERR (ctrl->ctrl.connect_q)) { - ret =PTR_ERR (ctrl->ctrl.connect_q); - goto out_free_tag_set; - } - - ret =nvme_rdma_connect_io_queues (ctrl); -if (ret) - goto out_cleanup_connect_q; - -return 0 ; - -out_cleanup_connect_q: -blk_cleanup_queue (ctrl->ctrl.connect_q); -out_free_tag_set: -nvme_rdma_free_tagset (&ctrl->ctrl, false); -out_free_io_queues: -nvme_rdma_free_io_queues (ctrl); -return ret; -} -static struct nvme_ctrl *nvme_rdma_create_ctrl (struct device *dev,struct nvmf_ctrl_options *opts) {
@@ -1937,7 +1938,7 @@ static struct nvme_ctrl *nvme_rdma_create_ctrl(struct device *dev, }if (opts->nr_io_queues) { - ret =nvme_rdma_create_io_queues (ctrl); + ret =nvme_rdma_configure_io_queues (ctrl, true);if (ret) goto out_remove_admin_queue; }
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 8/12 nvme-rdma: stop queues instead of simply flipping their state
In reply to Sagi GrimbergIf we move the queues from LIVE state, we might as well stop them (drain for rdma). Do it after we stop the sw request queues to prevent a stray request sneaking in .queue_rq after we stop the queue.
--- drivers/nvme/host/rdma.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/nvme/host/rdma.c +4 -5
@@ -952,16 +952,15 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work) {struct nvme_rdma_ctrl *ctrl =container_of (work, struct nvme_rdma_ctrl, err_work); -int i;nvme_stop_ctrl (&ctrl->ctrl); -for (i =0 ; i < ctrl->ctrl.queue_count; i++) -clear_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[i].flags); - -if (ctrl->ctrl.queue_count >1 ) +if (ctrl->ctrl.queue_count >1 ) {nvme_stop_queues (&ctrl->ctrl); +nvme_rdma_stop_io_queues (ctrl); + }blk_mq_quiesce_queue (ctrl->ctrl.admin_q); +nvme_rdma_stop_queue (&ctrl->queues[0 ]);/* We must take care of fastfail/requeue all our inflight requests */ if (ctrl->ctrl.queue_count >1 )
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 9/12 nvme-rdma: rename nvme_rdma_init_queue to nvme_rdma_alloc_queue
In reply to Sagi GrimbergGive it a name symmetric to nvme_rdma_free_queue. Also pass in the ctrl sqsize+1 and not the opts queue_size. And suppress failure message that has prior verbosity.
--- drivers/nvme/host/rdma.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-)
drivers/nvme/host/rdma.c +7 -10
@@ -503,7 +503,7 @@ static int nvme_rdma_create_queue_ib(struct nvme_rdma_queue *queue)return ret; } -static int nvme_rdma_init_queue (struct nvme_rdma_ctrl *ctrl, +static int nvme_rdma_alloc_queue (struct nvme_rdma_ctrl *ctrl,int idx,size_t queue_size) {struct nvme_rdma_queue *queue;
@@ -614,7 +614,7 @@ static int nvme_rdma_connect_io_queues(struct nvme_rdma_ctrl *ctrl)return ret; } -static int nvme_rdma_init_io_queues (struct nvme_rdma_ctrl *ctrl) +static int nvme_rdma_alloc_io_queues (struct nvme_rdma_ctrl *ctrl) {struct nvmf_ctrl_options *opts = ctrl->ctrl.opts;struct ib_device *ibdev = ctrl->device->dev;
@@ -643,13 +643,10 @@ static int nvme_rdma_init_io_queues(struct nvme_rdma_ctrl *ctrl) "creating %d I/O queues.\n", nr_io_queues);for (i =1 ; i < ctrl->ctrl.queue_count; i++) { - ret =nvme_rdma_init_queue (ctrl, i, - ctrl->ctrl.opts->queue_size); -if (ret) { -dev_info (ctrl->ctrl.device, -"failed to initialize i/o queue: %d\n" , ret); + ret =nvme_rdma_alloc_queue (ctrl, i, + ctrl->ctrl.sqsize +1 ); +if (ret) goto out_free_queues; - } }return 0 ;
@@ -745,7 +742,7 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, {int error; - error =nvme_rdma_init_queue (ctrl,0 ,NVME_AQ_DEPTH ); + error =nvme_rdma_alloc_queue (ctrl,0 ,NVME_AQ_DEPTH );if (error)return error;
@@ -832,7 +829,7 @@ static int nvme_rdma_configure_io_queues(struct nvme_rdma_ctrl *ctrl, bool new) {int ret; - ret =nvme_rdma_init_io_queues (ctrl); + ret =nvme_rdma_alloc_io_queues (ctrl);if (ret)return ret;
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 10/12 nvme-rdma: introduce nvme_rdma_start_queue
In reply to Sagi GrimbergThis should pair with nvme_rdma_stop_queue. While this is not a complete 1x1 reverse, it still pairs up pretty well because in fabrics we don't have a disconnect capsule (yet) but we simply teardown the transport association.
--- drivers/nvme/host/rdma.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-)
drivers/nvme/host/rdma.c +24 -12
@@ -593,24 +593,38 @@ static void nvme_rdma_stop_io_queues(struct nvme_rdma_ctrl *ctrl)nvme_rdma_stop_queue (&ctrl->queues[i]); } -static int nvme_rdma_connect_io_queues (struct nvme_rdma_ctrl *ctrl) +static int nvme_rdma_start_queue (struct nvme_rdma_ctrl *ctrl,int idx) +{ +int ret; + +if (idx) + ret =nvmf_connect_io_queue (&ctrl->ctrl, idx); +else + ret =nvmf_connect_admin_queue (&ctrl->ctrl); + +if (!ret) +set_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[idx].flags); +else +dev_info (ctrl->ctrl.device, +"failed to connect queue: %d ret=%d\n" , idx, ret); +return ret; +} + +static int nvme_rdma_start_io_queues (struct nvme_rdma_ctrl *ctrl) {int i, ret =0 ;for (i =1 ; i < ctrl->ctrl.queue_count; i++) { - ret =nvmf_connect_io_queue (&ctrl->ctrl, i); -if (ret) { -dev_info (ctrl->ctrl.device, -"failed to connect i/o queue: %d\n" , ret); + ret =nvme_rdma_start_queue (ctrl, i); +if (ret) goto out_stop_queues; - } -set_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[i].flags); }return 0 ; out_stop_queues: -nvme_rdma_stop_io_queues (ctrl); +for (i--; i >=1 ; i--) +nvme_rdma_stop_queue (&ctrl->queues[i]);return ret; }
@@ -767,12 +781,10 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, goto out_free_queue; } - error =nvmf_connect_admin_queue (&ctrl->ctrl); + error =nvme_rdma_start_queue (ctrl,0 );if (error) goto out_cleanup_queue; -set_bit (NVME_RDMA_Q_LIVE , &ctrl->queues[0 ].flags); - error =nvmf_reg_read64 (&ctrl->ctrl,NVME_REG_CAP , &ctrl->ctrl.cap);if (error) {
@@ -852,7 +864,7 @@ static int nvme_rdma_configure_io_queues(struct nvme_rdma_ctrl *ctrl, bool new) ctrl->ctrl.queue_count - 1); } - ret =nvme_rdma_connect_io_queues (ctrl); + ret =nvme_rdma_start_io_queues (ctrl);if (ret) goto out_cleanup_connect_q;
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 11/12 nvme-rdma: cleanup error path in controller reset
In reply to Sagi GrimbergNo need to queue an extra work to indirect controller removal, just call a ctrl remove routine.
--- drivers/nvme/host/rdma.c | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-)
drivers/nvme/host/rdma.c +9 -23
@@ -1749,13 +1749,10 @@ static void nvme_rdma_shutdown_ctrl(struct nvme_rdma_ctrl *ctrl, bool shutdown)nvme_rdma_destroy_admin_queue (ctrl, shutdown); } -static void __nvme_rdma_remove_ctrl (struct nvme_rdma_ctrl *ctrl,bool shutdown) +static void nvme_rdma_remove_ctrl (struct nvme_rdma_ctrl *ctrl) { -nvme_stop_ctrl (&ctrl->ctrl);nvme_remove_namespaces (&ctrl->ctrl); -if (shutdown) -nvme_rdma_shutdown_ctrl (ctrl, shutdown); - +nvme_rdma_shutdown_ctrl (ctrl, true);nvme_uninit_ctrl (&ctrl->ctrl);nvme_put_ctrl (&ctrl->ctrl); }
@@ -1765,7 +1762,8 @@ static void nvme_rdma_del_ctrl_work(struct work_struct *work)struct nvme_rdma_ctrl *ctrl =container_of (work, struct nvme_rdma_ctrl, delete_work); -__nvme_rdma_remove_ctrl (ctrl, true); +nvme_stop_ctrl (&ctrl->ctrl); +nvme_rdma_remove_ctrl (ctrl); }static int __nvme_rdma_del_ctrl (struct nvme_rdma_ctrl *ctrl)
@@ -1797,14 +1795,6 @@ static int nvme_rdma_del_ctrl(struct nvme_ctrl *nctrl)return ret; } -static void nvme_rdma_remove_ctrl_work (struct work_struct *work) -{ -struct nvme_rdma_ctrl *ctrl =container_of (work, - struct nvme_rdma_ctrl, delete_work); - -__nvme_rdma_remove_ctrl (ctrl, false); -} -static void nvme_rdma_reset_ctrl_work (struct work_struct *work) { struct nvme_rdma_ctrl *ctrl =
@@ -1816,16 +1806,13 @@ static void nvme_rdma_reset_ctrl_work(struct work_struct *work)nvme_rdma_shutdown_ctrl (ctrl, false); ret =nvme_rdma_configure_admin_queue (ctrl, false); -if (ret) { -/* ctrl is already shutdown, just remove the ctrl */ -INIT_WORK (&ctrl->delete_work, nvme_rdma_remove_ctrl_work); - goto del_dead_ctrl; - } +if (ret) + goto out_fail;if (ctrl->ctrl.queue_count >1 ) { ret =nvme_rdma_configure_io_queues (ctrl, false);if (ret) - goto del_dead_ctrl; + goto out_fail; } changed =nvme_change_ctrl_state (&ctrl->ctrl,NVME_CTRL_LIVE );
@@ -1835,10 +1822,9 @@ static void nvme_rdma_reset_ctrl_work(struct work_struct *work)return ; -del_dead_ctrl: -/* Deleting this dead controller... */ +out_fail:dev_warn (ctrl->ctrl.device,"Removing after reset failure\n" ); -WARN_ON (!queue_work (nvme_wq, &ctrl->delete_work)); +nvme_rdma_remove_ctrl (ctrl); }static const struct nvme_ctrl_ops nvme_rdma_ctrl_ops = {
Signature · 1 line
2.7.4
Sagi Grimberg
maintainerPATCH 12/12 nvme-rdma: call ops->reg_read64 instead of nvmf_reg_read64
In reply to Sagi GrimbergMake it a generic routine.
--- drivers/nvme/host/rdma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/rdma.c +1 -1
@@ -785,7 +785,7 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl,if (error) goto out_cleanup_queue; - error =nvmf_reg_read64 (&ctrl->ctrl,NVME_REG_CAP , + error = ctrl->ctrl.ops->reg_read64 (&ctrl->ctrl,NVME_REG_CAP , &ctrl->ctrl.cap);if (error) { dev_err(ctrl->ctrl.device,
Signature · 1 line
2.7.4
cover Few more patches from the centralization set
In reply to Sagi GrimbergThanks Sagi,
I've applied the series to the nvme-4.14 branch.