diff options
Diffstat (limited to 'drivers/nvme/host/tcp.c')
| -rw-r--r-- | drivers/nvme/host/tcp.c | 40 | 
1 files changed, 26 insertions, 14 deletions
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index fdbcdcedcee9..8b5e4327fe83 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -360,12 +360,18 @@ static inline void nvme_tcp_send_all(struct nvme_tcp_queue *queue)  	} while (ret > 0);  } -static inline bool nvme_tcp_queue_more(struct nvme_tcp_queue *queue) +static inline bool nvme_tcp_queue_has_pending(struct nvme_tcp_queue *queue)  {  	return !list_empty(&queue->send_list) ||  		!llist_empty(&queue->req_list);  } +static inline bool nvme_tcp_queue_more(struct nvme_tcp_queue *queue) +{ +	return !nvme_tcp_tls(&queue->ctrl->ctrl) && +		nvme_tcp_queue_has_pending(queue); +} +  static inline void nvme_tcp_queue_request(struct nvme_tcp_request *req,  		bool sync, bool last)  { @@ -386,7 +392,7 @@ static inline void nvme_tcp_queue_request(struct nvme_tcp_request *req,  		mutex_unlock(&queue->send_mutex);  	} -	if (last && nvme_tcp_queue_more(queue)) +	if (last && nvme_tcp_queue_has_pending(queue))  		queue_work_on(queue->io_cpu, nvme_tcp_wq, &queue->io_work);  } @@ -2155,7 +2161,8 @@ 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) +static void nvme_tcp_reconnect_or_remove(struct nvme_ctrl *ctrl, +		int status)  {  	enum nvme_ctrl_state state = nvme_ctrl_state(ctrl); @@ -2165,13 +2172,14 @@ static void nvme_tcp_reconnect_or_remove(struct nvme_ctrl *ctrl)  		return;  	} -	if (nvmf_should_reconnect(ctrl)) { +	if (nvmf_should_reconnect(ctrl, status)) {  		dev_info(ctrl->device, "Reconnecting in %d seconds...\n",  			ctrl->opts->reconnect_delay);  		queue_delayed_work(nvme_wq, &to_tcp_ctrl(ctrl)->connect_work,  				ctrl->opts->reconnect_delay * HZ);  	} else { -		dev_info(ctrl->device, "Removing controller...\n"); +		dev_info(ctrl->device, "Removing controller (%d)...\n", +			 status);  		nvme_delete_ctrl(ctrl);  	}  } @@ -2252,23 +2260,25 @@ static void nvme_tcp_reconnect_ctrl_work(struct work_struct *work)  	struct nvme_tcp_ctrl *tcp_ctrl = container_of(to_delayed_work(work),  			struct nvme_tcp_ctrl, connect_work);  	struct nvme_ctrl *ctrl = &tcp_ctrl->ctrl; +	int ret;  	++ctrl->nr_reconnects; -	if (nvme_tcp_setup_ctrl(ctrl, false)) +	ret = nvme_tcp_setup_ctrl(ctrl, false); +	if (ret)  		goto requeue; -	dev_info(ctrl->device, "Successfully reconnected (%d attempt)\n", -			ctrl->nr_reconnects); +	dev_info(ctrl->device, "Successfully reconnected (attempt %d/%d)\n", +		 ctrl->nr_reconnects, ctrl->opts->max_reconnects);  	ctrl->nr_reconnects = 0;  	return;  requeue: -	dev_info(ctrl->device, "Failed reconnect attempt %d\n", -			ctrl->nr_reconnects); -	nvme_tcp_reconnect_or_remove(ctrl); +	dev_info(ctrl->device, "Failed reconnect attempt %d/%d\n", +		 ctrl->nr_reconnects, ctrl->opts->max_reconnects); +	nvme_tcp_reconnect_or_remove(ctrl, ret);  }  static void nvme_tcp_error_recovery_work(struct work_struct *work) @@ -2295,7 +2305,7 @@ static void nvme_tcp_error_recovery_work(struct work_struct *work)  		return;  	} -	nvme_tcp_reconnect_or_remove(ctrl); +	nvme_tcp_reconnect_or_remove(ctrl, 0);  }  static void nvme_tcp_teardown_ctrl(struct nvme_ctrl *ctrl, bool shutdown) @@ -2315,6 +2325,7 @@ static void nvme_reset_ctrl_work(struct work_struct *work)  {  	struct nvme_ctrl *ctrl =  		container_of(work, struct nvme_ctrl, reset_work); +	int ret;  	nvme_stop_ctrl(ctrl);  	nvme_tcp_teardown_ctrl(ctrl, false); @@ -2328,14 +2339,15 @@ static void nvme_reset_ctrl_work(struct work_struct *work)  		return;  	} -	if (nvme_tcp_setup_ctrl(ctrl, false)) +	ret = nvme_tcp_setup_ctrl(ctrl, false); +	if (ret)  		goto out_fail;  	return;  out_fail:  	++ctrl->nr_reconnects; -	nvme_tcp_reconnect_or_remove(ctrl); +	nvme_tcp_reconnect_or_remove(ctrl, ret);  }  static void nvme_tcp_stop_ctrl(struct nvme_ctrl *ctrl)  |