nvme-rdma: Allow DELETING state change failure in error_recovery
PATCH 1/2 nvme-rdma: Allow DELETING state change failure in error_recovery
While error recovery is ongoing, it is OK to move ctrl to DELETING state (from concurrent delete_work). Thus we don't need a warning for that case.
--- drivers/nvme/host/rdma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/nvme/host/rdma.c +2 -2
@@ -978,8 +978,8 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work)nvme_start_queues (&ctrl->ctrl);if (!nvme_change_ctrl_state (&ctrl->ctrl,NVME_CTRL_CONNECTING )) { -/* state change failure should never happen */ -WARN_ON_ONCE (1 ); +/* state change failure is ok if we're in DELETING state */ +WARN_ON_ONCE (ctrl->ctrl.state !=NVME_CTRL_DELETING );return ; }
Signature · 1 line
1.8.2.3
PATCH 2/2 nvme: Add .stop_ctrl to nvme ctrl ops
For consistancy reasons, any fabric-specific works (e.g error recovery/reconnect) should be canceled in nvme_stop_ctrl, as for all other NVMe pending works (e.g. scan, keep alive).
The patch aims to simplify the logic of the code, as we now only rely on a vague demand from any fabric to flush its private workqueues at the beginning of .delete_ctrl op.
--- drivers/nvme/host/core.c | 2 ++ drivers/nvme/host/nvme.h | 1 + drivers/nvme/host/rdma.c | 12 +++++++++--- 3 files changed, 12 insertions(+), 3 deletions(-)
drivers/nvme/host/core.c +2 -0
@@ -3336,6 +3336,8 @@ void nvme_stop_ctrl(struct nvme_ctrl *ctrl)flush_work (&ctrl->async_event_work);flush_work (&ctrl->scan_work);cancel_work_sync (&ctrl->fw_act_work); +if (ctrl->ops->stop_ctrl) + ctrl->ops->stop_ctrl (ctrl); }EXPORT_SYMBOL_GPL (nvme_stop_ctrl);
drivers/nvme/host/nvme.h +1 -0
@@ -298,6 +298,7 @@ struct nvme_ctrl_ops {void (*delete_ctrl)(struct nvme_ctrl *ctrl);int (*get_address)(struct nvme_ctrl *ctrl,char *buf,int size);int (*reinit_request)(void *data,struct request *rq); +void (*stop_ctrl)(struct nvme_ctrl *ctrl); };static inline bool nvme_ctrl_ready (struct nvme_ctrl *ctrl)
drivers/nvme/host/rdma.c +9 -3
@@ -871,6 +871,14 @@ out_free_io_queues:return ret; } +static void nvme_rdma_stop_ctrl (struct nvme_ctrl *nctrl) +{ +struct nvme_rdma_ctrl *ctrl =to_rdma_ctrl (nctrl); + +cancel_work_sync (&ctrl->err_work); +cancel_delayed_work_sync (&ctrl->reconnect_work); +} +static void nvme_rdma_free_ctrl (struct nvme_ctrl *nctrl) {struct nvme_rdma_ctrl *ctrl =to_rdma_ctrl (nctrl);
@@ -1723,9 +1731,6 @@ static const struct blk_mq_ops nvme_rdma_admin_mq_ops = {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); -if (ctrl->ctrl.queue_count >1 ) {nvme_stop_queues (&ctrl->ctrl); blk_mq_tagset_busy_iter(&ctrl->tag_set,
@@ -1803,6 +1808,7 @@ static const struct nvme_ctrl_ops nvme_rdma_ctrl_ops = { .submit_async_event = nvme_rdma_submit_async_event, .delete_ctrl = nvme_rdma_delete_ctrl, .get_address = nvmf_get_address, + .stop_ctrl = nvme_rdma_stop_ctrl, }; static inline bool
Signature · 1 line
1.8.2.3
Sagi Grimberg
maintainerPATCH 1/2 nvme-rdma: Allow DELETING state change failure in error_recovery
In reply to Nitzan CarmiLooks good,
Keith Busch
AppliedPATCH 1/2 nvme-rdma: Allow DELETING state change failure in error_recovery
Quoted 3 lines · Sagi Grimberg
Looks good,
Reviewed-by Sagi Grimberg <sagi at grimberg.me>
Thanks, applied to nvme-4.17.