Skip to content

Commit 958dc1d

Browse files
lostandy26Christoph Hellwig
authored and
Christoph Hellwig
committed
nvme-rdma: add clean action for failed reconnection
A crash happens when inject failed reconnection. If reconnect failed after start io queues, the queues will be unquiesced and new requests continue to be delivered. Reconnection error handling process directly free queues without cancel suspend requests. The suppend request will time out, and then crash due to use the queue after free. Add sync queues and cancel suppend requests for reconnection error handling. Signed-off-by: Chao Leng <[email protected]> Signed-off-by: Christoph Hellwig <[email protected]>
1 parent 2547906 commit 958dc1d

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

drivers/nvme/host/rdma.c

+16-2
Original file line numberDiff line numberDiff line change
@@ -919,12 +919,16 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl,
919919

920920
error = nvme_init_identify(&ctrl->ctrl);
921921
if (error)
922-
goto out_stop_queue;
922+
goto out_quiesce_queue;
923923

924924
return 0;
925925

926+
out_quiesce_queue:
927+
blk_mq_quiesce_queue(ctrl->ctrl.admin_q);
928+
blk_sync_queue(ctrl->ctrl.admin_q);
926929
out_stop_queue:
927930
nvme_rdma_stop_queue(&ctrl->queues[0]);
931+
nvme_cancel_admin_tagset(&ctrl->ctrl);
928932
out_cleanup_queue:
929933
if (new)
930934
blk_cleanup_queue(ctrl->ctrl.admin_q);
@@ -1001,8 +1005,10 @@ static int nvme_rdma_configure_io_queues(struct nvme_rdma_ctrl *ctrl, bool new)
10011005

10021006
out_wait_freeze_timed_out:
10031007
nvme_stop_queues(&ctrl->ctrl);
1008+
nvme_sync_io_queues(&ctrl->ctrl);
10041009
nvme_rdma_stop_io_queues(ctrl);
10051010
out_cleanup_connect_q:
1011+
nvme_cancel_tagset(&ctrl->ctrl);
10061012
if (new)
10071013
blk_cleanup_queue(ctrl->ctrl.connect_q);
10081014
out_free_tag_set:
@@ -1144,10 +1150,18 @@ static int nvme_rdma_setup_ctrl(struct nvme_rdma_ctrl *ctrl, bool new)
11441150
return 0;
11451151

11461152
destroy_io:
1147-
if (ctrl->ctrl.queue_count > 1)
1153+
if (ctrl->ctrl.queue_count > 1) {
1154+
nvme_stop_queues(&ctrl->ctrl);
1155+
nvme_sync_io_queues(&ctrl->ctrl);
1156+
nvme_rdma_stop_io_queues(ctrl);
1157+
nvme_cancel_tagset(&ctrl->ctrl);
11481158
nvme_rdma_destroy_io_queues(ctrl, new);
1159+
}
11491160
destroy_admin:
1161+
blk_mq_quiesce_queue(ctrl->ctrl.admin_q);
1162+
blk_sync_queue(ctrl->ctrl.admin_q);
11501163
nvme_rdma_stop_queue(&ctrl->queues[0]);
1164+
nvme_cancel_admin_tagset(&ctrl->ctrl);
11511165
nvme_rdma_destroy_admin_queue(ctrl, new);
11521166
return ret;
11531167
}

0 commit comments

Comments
 (0)