[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