This is a preparation for moving a lot of the shared control
plane logic to the nvme core.

Signed-off-by: Sagi Grimberg <s...@grimberg.me>
---
 drivers/nvme/host/nvme.h | 10 ++++++++++
 drivers/nvme/host/rdma.c | 46 +++++++++++++++++++++++++++-------------------
 2 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index c604d471aa3d..18aac677a96c 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -233,6 +233,16 @@ struct nvme_ctrl_ops {
        int (*delete_ctrl)(struct nvme_ctrl *ctrl);
        const char *(*get_subsysnqn)(struct nvme_ctrl *ctrl);
        int (*get_address)(struct nvme_ctrl *ctrl, char *buf, int size);
+
+       int (*alloc_hw_queue)(struct nvme_ctrl *ctrl, int idx,
+               size_t queue_size);
+       void (*free_hw_queue)(struct nvme_ctrl *ctrl, int idx);
+       int (*start_hw_queue)(struct nvme_ctrl *ctrl, int idx);
+       void (*stop_hw_queue)(struct nvme_ctrl *ctrl, int idx);
+       struct blk_mq_tag_set *(*alloc_tagset)(struct nvme_ctrl *ctrl,
+               bool admin);
+       void (*free_tagset)(struct nvme_ctrl *ctrl, bool admin);
+       int (*verify_ctrl)(struct nvme_ctrl *ctrl);
 };
 
 static inline bool nvme_ctrl_ready(struct nvme_ctrl *ctrl)
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index 0036ddcbc138..a32c8a710ad4 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -679,7 +679,7 @@ static void nvme_rdma_free_io_queues(struct nvme_ctrl *ctrl)
        int i;
 
        for (i = 1; i < ctrl->queue_count; i++)
-               nvme_rdma_free_queue(ctrl, i);
+               ctrl->ops->free_hw_queue(ctrl, i);
 }
 
 static void nvme_rdma_stop_io_queues(struct nvme_ctrl *ctrl)
@@ -687,7 +687,7 @@ static void nvme_rdma_stop_io_queues(struct nvme_ctrl *ctrl)
        int i;
 
        for (i = 1; i < ctrl->queue_count; i++)
-               nvme_rdma_stop_queue(ctrl, i);
+               ctrl->ops->stop_hw_queue(ctrl, i);
 }
 
 static void nvme_rdma_destroy_io_queues(struct nvme_ctrl *ctrl, bool remove)
@@ -695,7 +695,7 @@ static void nvme_rdma_destroy_io_queues(struct nvme_ctrl 
*ctrl, bool remove)
        nvme_rdma_stop_io_queues(ctrl);
        if (remove) {
                blk_cleanup_queue(ctrl->connect_q);
-               nvme_rdma_free_tagset(ctrl, false);
+               ctrl->ops->free_tagset(ctrl, false);
        }
        nvme_rdma_free_io_queues(ctrl);
 }
@@ -723,7 +723,7 @@ static int nvme_rdma_start_io_queues(struct nvme_ctrl *ctrl)
        int i, ret = 0;
 
        for (i = 1; i < ctrl->queue_count; i++) {
-               ret = nvme_rdma_start_queue(ctrl, i);
+               ret = ctrl->ops->start_hw_queue(ctrl, i);
                if (ret)
                        goto out_stop_queues;
        }
@@ -732,7 +732,7 @@ static int nvme_rdma_start_io_queues(struct nvme_ctrl *ctrl)
 
 out_stop_queues:
        for (i--; i >= 1; i--)
-               nvme_rdma_stop_queue(ctrl, i);
+               ctrl->ops->stop_hw_queue(ctrl, i);
        return ret;
 }
 
@@ -754,7 +754,7 @@ static int nvme_rdma_alloc_io_queues(struct nvme_ctrl *ctrl)
                "creating %d I/O queues.\n", nr_io_queues);
 
        for (i = 1; i < ctrl->queue_count; i++) {
-               ret = nvme_rdma_alloc_queue(ctrl, i,
+               ret = ctrl->ops->alloc_hw_queue(ctrl, i,
                                ctrl->sqsize + 1);
                if (ret)
                        goto out_free_queues;
@@ -764,7 +764,7 @@ static int nvme_rdma_alloc_io_queues(struct nvme_ctrl *ctrl)
 
 out_free_queues:
        for (i--; i >= 1; i--)
-               nvme_rdma_free_queue(ctrl, i);
+               ctrl->ops->free_hw_queue(ctrl, i);
 
        return ret;
 }
@@ -778,7 +778,7 @@ static int nvme_rdma_configure_io_queues(struct nvme_ctrl 
*ctrl, bool new)
                return ret;
 
        if (new) {
-               ctrl->tagset = nvme_rdma_alloc_tagset(ctrl, false);
+               ctrl->tagset = ctrl->ops->alloc_tagset(ctrl, false);
                if (IS_ERR(ctrl->tagset)) {
                        ret = PTR_ERR(ctrl->tagset);
                        goto out_free_io_queues;
@@ -806,7 +806,7 @@ static int nvme_rdma_configure_io_queues(struct nvme_ctrl 
*ctrl, bool new)
                blk_cleanup_queue(ctrl->connect_q);
 out_free_tag_set:
        if (new)
-               nvme_rdma_free_tagset(ctrl, false);
+               ctrl->ops->free_tagset(ctrl, false);
 out_free_io_queues:
        nvme_rdma_free_io_queues(ctrl);
        return ret;
@@ -814,25 +814,25 @@ static int nvme_rdma_configure_io_queues(struct nvme_ctrl 
*ctrl, bool new)
 
 static void nvme_rdma_destroy_admin_queue(struct nvme_ctrl *ctrl, bool remove)
 {
-       nvme_rdma_stop_queue(ctrl, 0);
+       ctrl->ops->stop_hw_queue(ctrl, 0);
        if (remove) {
                blk_cleanup_queue(ctrl->admin_connect_q);
                blk_cleanup_queue(ctrl->admin_q);
-               nvme_rdma_free_tagset(ctrl, true);
+               ctrl->ops->free_tagset(ctrl, true);
        }
-       nvme_rdma_free_queue(ctrl, 0);
+       ctrl->ops->free_hw_queue(ctrl, 0);
 }
 
 static int nvme_rdma_configure_admin_queue(struct nvme_ctrl *ctrl, bool new)
 {
        int error;
 
-       error = nvme_rdma_alloc_queue(ctrl, 0, NVME_AQ_DEPTH);
+       error = ctrl->ops->alloc_hw_queue(ctrl, 0, NVME_AQ_DEPTH);
        if (error)
                return error;
 
        if (new) {
-               ctrl->admin_tagset = nvme_rdma_alloc_tagset(ctrl, true);
+               ctrl->admin_tagset = ctrl->ops->alloc_tagset(ctrl, true);
                if (IS_ERR(ctrl->admin_tagset)) {
                        error = PTR_ERR(ctrl->admin_tagset);
                        goto out_free_queue;
@@ -855,7 +855,7 @@ static int nvme_rdma_configure_admin_queue(struct nvme_ctrl 
*ctrl, bool new)
                        goto out_free_queue;
        }
 
-       error = nvme_rdma_start_queue(ctrl, 0);
+       error = ctrl->ops->start_hw_queue(ctrl, 0);
        if (error)
                goto out_cleanup_connect_queue;
 
@@ -889,9 +889,9 @@ static int nvme_rdma_configure_admin_queue(struct nvme_ctrl 
*ctrl, bool new)
                blk_cleanup_queue(ctrl->admin_q);
 out_free_tagset:
        if (new)
-               nvme_rdma_free_tagset(ctrl, true);
+               ctrl->ops->free_tagset(ctrl, true);
 out_free_queue:
-       nvme_rdma_free_queue(ctrl, 0);
+       ctrl->ops->free_hw_queue(ctrl, 0);
        return error;
 }
 
@@ -981,7 +981,7 @@ static void nvme_rdma_error_recovery_work(struct 
work_struct *work)
                nvme_rdma_stop_io_queues(ctrl);
        }
        blk_mq_stop_hw_queues(ctrl->admin_q);
-       nvme_rdma_stop_queue(ctrl, 0);
+       ctrl->ops->stop_hw_queue(ctrl, 0);
 
        /* We must take care of fastfail/requeue all our inflight requests */
        if (ctrl->queue_count > 1)
@@ -1886,6 +1886,14 @@ static const struct nvme_ctrl_ops nvme_rdma_ctrl_ops = {
        .delete_ctrl            = nvme_rdma_del_ctrl,
        .get_subsysnqn          = nvmf_get_subsysnqn,
        .get_address            = nvmf_get_address,
+
+       .alloc_hw_queue         = nvme_rdma_alloc_queue,
+       .free_hw_queue          = nvme_rdma_free_queue,
+       .start_hw_queue         = nvme_rdma_start_queue,
+       .stop_hw_queue          = nvme_rdma_stop_queue,
+       .alloc_tagset           = nvme_rdma_alloc_tagset,
+       .free_tagset            = nvme_rdma_free_tagset,
+       .verify_ctrl            = nvme_rdma_verify_ctrl,
 };
 
 static int nvme_rdma_probe_ctrl(struct nvme_ctrl *ctrl, struct device *dev,
@@ -1910,7 +1918,7 @@ static int nvme_rdma_probe_ctrl(struct nvme_ctrl *ctrl, 
struct device *dev,
        if (ret)
                goto out_uninit_ctrl;
 
-       ret = nvme_rdma_verify_ctrl(ctrl);
+       ret = ctrl->ops->verify_ctrl(ctrl);
        if (ret)
                goto out_remove_admin_queue;
 
-- 
2.7.4

Reply via email to