nvme-rdma: disable the controller on resets
authorSagi Grimberg <sagi@grimberg.me>
Mon, 10 Jul 2017 06:22:31 +0000 (09:22 +0300)
committerChristoph Hellwig <hch@lst.de>
Mon, 28 Aug 2017 19:38:26 +0000 (21:38 +0200)
Mimic the pci driver as a controller disable might be more lightweight
than a shutdown.

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/rdma.c

index 3f580c198100e320c331b7acd854fbbeeca7c1fc..b1e67cd41c8172fffebfb9325fbc27610ccb6a26 100644 (file)
@@ -1655,7 +1655,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);
@@ -1667,8 +1667,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,
@@ -1682,7 +1684,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) {
@@ -1746,7 +1748,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) {