[PATCH 2/7] nvme-fabrics: introduce nvmf_reconnect_or_remove API
Himanshu Madhani
himanshu.madhani at oracle.com
Wed Oct 20 06:34:16 PDT 2021
> On Oct 18, 2021, at 8:40 AM, Max Gurtovoy <mgurtovoy at nvidia.com> wrote:
>
> This logic is duplicated today for RDMA and TCP controllers. Move it to
> the fabrics driver and export it as a new API.
>
> Also update the RDMA/TCP transport drivers to use this API and remove
> the duplicated code.
>
> Reviewed-by: Israel Rukshin <israelr at nvidia.com>
> Signed-off-by: Max Gurtovoy <mgurtovoy at nvidia.com>
> ---
> drivers/nvme/host/fabrics.c | 21 +++++++++++++++++++++
> drivers/nvme/host/fabrics.h | 1 +
> drivers/nvme/host/rdma.c | 25 +++----------------------
> drivers/nvme/host/tcp.c | 26 +++-----------------------
> 4 files changed, 28 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
> index 668c6bb7a567..4a1ef67c6fb3 100644
> --- a/drivers/nvme/host/fabrics.c
> +++ b/drivers/nvme/host/fabrics.c
> @@ -472,6 +472,27 @@ bool nvmf_should_reconnect(struct nvme_ctrl *ctrl)
> }
> EXPORT_SYMBOL_GPL(nvmf_should_reconnect);
>
> +void nvmf_reconnect_or_remove(struct nvme_ctrl *ctrl)
> +{
> + /* If we are resetting/deleting then do nothing */
> + if (ctrl->state != NVME_CTRL_CONNECTING) {
> + WARN_ON_ONCE(ctrl->state == NVME_CTRL_NEW ||
> + ctrl->state == NVME_CTRL_LIVE);
> + return;
> + }
> +
> + if (nvmf_should_reconnect(ctrl)) {
> + dev_info(ctrl->device, "Reconnecting in %d seconds...\n",
> + ctrl->opts->reconnect_delay);
> + queue_delayed_work(nvme_wq, &ctrl->connect_work,
> + ctrl->opts->reconnect_delay * HZ);
> + } else {
> + dev_info(ctrl->device, "Removing controller...\n");
> + nvme_delete_ctrl(ctrl);
> + }
> +}
> +EXPORT_SYMBOL_GPL(nvmf_reconnect_or_remove);
> +
> /**
> * nvmf_register_transport() - NVMe Fabrics Library registration function.
> * @ops: Transport ops instance to be registered to the
> diff --git a/drivers/nvme/host/fabrics.h b/drivers/nvme/host/fabrics.h
> index a146cb903869..de213ab26977 100644
> --- a/drivers/nvme/host/fabrics.h
> +++ b/drivers/nvme/host/fabrics.h
> @@ -188,6 +188,7 @@ void nvmf_unregister_transport(struct nvmf_transport_ops *ops);
> void nvmf_free_options(struct nvmf_ctrl_options *opts);
> int nvmf_get_address(struct nvme_ctrl *ctrl, char *buf, int size);
> bool nvmf_should_reconnect(struct nvme_ctrl *ctrl);
> +void nvmf_reconnect_or_remove(struct nvme_ctrl *ctrl);
> bool nvmf_ip_options_match(struct nvme_ctrl *ctrl,
> struct nvmf_ctrl_options *opts);
>
> diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
> index fbfa18a47bd8..f31a56d8fd73 100644
> --- a/drivers/nvme/host/rdma.c
> +++ b/drivers/nvme/host/rdma.c
> @@ -1064,25 +1064,6 @@ static void nvme_rdma_free_ctrl(struct nvme_ctrl *nctrl)
> kfree(ctrl);
> }
>
> -static void nvme_rdma_reconnect_or_remove(struct nvme_rdma_ctrl *ctrl)
> -{
> - /* If we are resetting/deleting then do nothing */
> - if (ctrl->ctrl.state != NVME_CTRL_CONNECTING) {
> - WARN_ON_ONCE(ctrl->ctrl.state == NVME_CTRL_NEW ||
> - ctrl->ctrl.state == NVME_CTRL_LIVE);
> - return;
> - }
> -
> - if (nvmf_should_reconnect(&ctrl->ctrl)) {
> - dev_info(ctrl->ctrl.device, "Reconnecting in %d seconds...\n",
> - ctrl->ctrl.opts->reconnect_delay);
> - queue_delayed_work(nvme_wq, &ctrl->ctrl.connect_work,
> - ctrl->ctrl.opts->reconnect_delay * HZ);
> - } else {
> - nvme_delete_ctrl(&ctrl->ctrl);
> - }
> -}
> -
> static int nvme_rdma_setup_ctrl(struct nvme_rdma_ctrl *ctrl, bool new)
> {
> int ret;
> @@ -1181,7 +1162,7 @@ static void nvme_rdma_reconnect_ctrl_work(struct work_struct *work)
> requeue:
> dev_info(ctrl->ctrl.device, "Failed reconnect attempt %d\n",
> ctrl->ctrl.nr_reconnects);
> - nvme_rdma_reconnect_or_remove(ctrl);
> + nvmf_reconnect_or_remove(&ctrl->ctrl);
> }
>
> static void nvme_rdma_error_recovery_work(struct work_struct *work)
> @@ -1202,7 +1183,7 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work)
> return;
> }
>
> - nvme_rdma_reconnect_or_remove(ctrl);
> + nvmf_reconnect_or_remove(&ctrl->ctrl);
> }
>
> static void nvme_rdma_error_recovery(struct nvme_rdma_ctrl *ctrl)
> @@ -2265,7 +2246,7 @@ static void nvme_rdma_reset_ctrl_work(struct work_struct *work)
>
> out_fail:
> ++ctrl->ctrl.nr_reconnects;
> - nvme_rdma_reconnect_or_remove(ctrl);
> + nvmf_reconnect_or_remove(&ctrl->ctrl);
> }
>
> static const struct nvme_ctrl_ops nvme_rdma_ctrl_ops = {
> diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
> index 3ace20e39c86..530ff76d4ac9 100644
> --- a/drivers/nvme/host/tcp.c
> +++ b/drivers/nvme/host/tcp.c
> @@ -1970,26 +1970,6 @@ static void nvme_tcp_teardown_io_queues(struct nvme_ctrl *ctrl,
> nvme_tcp_destroy_io_queues(ctrl, remove);
> }
>
> -static void nvme_tcp_reconnect_or_remove(struct nvme_ctrl *ctrl)
> -{
> - /* If we are resetting/deleting then do nothing */
> - if (ctrl->state != NVME_CTRL_CONNECTING) {
> - WARN_ON_ONCE(ctrl->state == NVME_CTRL_NEW ||
> - ctrl->state == NVME_CTRL_LIVE);
> - return;
> - }
> -
> - if (nvmf_should_reconnect(ctrl)) {
> - dev_info(ctrl->device, "Reconnecting in %d seconds...\n",
> - ctrl->opts->reconnect_delay);
> - queue_delayed_work(nvme_wq, &ctrl->connect_work,
> - ctrl->opts->reconnect_delay * HZ);
> - } else {
> - dev_info(ctrl->device, "Removing controller...\n");
> - nvme_delete_ctrl(ctrl);
> - }
> -}
> -
> static int nvme_tcp_setup_ctrl(struct nvme_ctrl *ctrl, bool new)
> {
> struct nvmf_ctrl_options *opts = ctrl->opts;
> @@ -2083,7 +2063,7 @@ static void nvme_tcp_reconnect_ctrl_work(struct work_struct *work)
> requeue:
> dev_info(ctrl->device, "Failed reconnect attempt %d\n",
> ctrl->nr_reconnects);
> - nvme_tcp_reconnect_or_remove(ctrl);
> + nvmf_reconnect_or_remove(ctrl);
> }
>
> static void nvme_tcp_error_recovery_work(struct work_struct *work)
> @@ -2106,7 +2086,7 @@ static void nvme_tcp_error_recovery_work(struct work_struct *work)
> return;
> }
>
> - nvme_tcp_reconnect_or_remove(ctrl);
> + nvmf_reconnect_or_remove(ctrl);
> }
>
> static void nvme_tcp_teardown_ctrl(struct nvme_ctrl *ctrl, bool shutdown)
> @@ -2150,7 +2130,7 @@ static void nvme_reset_ctrl_work(struct work_struct *work)
>
> out_fail:
> ++ctrl->nr_reconnects;
> - nvme_tcp_reconnect_or_remove(ctrl);
> + nvmf_reconnect_or_remove(ctrl);
> }
>
> static void nvme_tcp_free_ctrl(struct nvme_ctrl *nctrl)
> --
> 2.18.1
>
>
Reviewed-by: Himanshu Madhani <himanshu.madhani at oracle.com>
--
Himanshu Madhani Oracle Linux Engineering
More information about the Linux-nvme
mailing list