|
@@ -560,12 +560,6 @@ static void nvme_rdma_free_queue(struct nvme_rdma_queue *queue)
|
|
|
if (!test_and_clear_bit(NVME_RDMA_Q_ALLOCATED, &queue->flags))
|
|
|
return;
|
|
|
|
|
|
- if (nvme_rdma_queue_idx(queue) == 0) {
|
|
|
- nvme_rdma_free_qe(queue->device->dev,
|
|
|
- &queue->ctrl->async_event_sqe,
|
|
|
- sizeof(struct nvme_command), DMA_TO_DEVICE);
|
|
|
- }
|
|
|
-
|
|
|
nvme_rdma_destroy_queue_ib(queue);
|
|
|
rdma_destroy_id(queue->cm_id);
|
|
|
}
|
|
@@ -739,6 +733,8 @@ static void nvme_rdma_destroy_admin_queue(struct nvme_rdma_ctrl *ctrl,
|
|
|
blk_cleanup_queue(ctrl->ctrl.admin_q);
|
|
|
nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.admin_tagset);
|
|
|
}
|
|
|
+ nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe,
|
|
|
+ sizeof(struct nvme_command), DMA_TO_DEVICE);
|
|
|
nvme_rdma_free_queue(&ctrl->queues[0]);
|
|
|
}
|
|
|
|
|
@@ -755,11 +751,16 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl,
|
|
|
|
|
|
ctrl->max_fr_pages = nvme_rdma_get_max_fr_pages(ctrl->device->dev);
|
|
|
|
|
|
+ error = nvme_rdma_alloc_qe(ctrl->device->dev, &ctrl->async_event_sqe,
|
|
|
+ sizeof(struct nvme_command), DMA_TO_DEVICE);
|
|
|
+ if (error)
|
|
|
+ goto out_free_queue;
|
|
|
+
|
|
|
if (new) {
|
|
|
ctrl->ctrl.admin_tagset = nvme_rdma_alloc_tagset(&ctrl->ctrl, true);
|
|
|
if (IS_ERR(ctrl->ctrl.admin_tagset)) {
|
|
|
error = PTR_ERR(ctrl->ctrl.admin_tagset);
|
|
|
- goto out_free_queue;
|
|
|
+ goto out_free_async_qe;
|
|
|
}
|
|
|
|
|
|
ctrl->ctrl.admin_q = blk_mq_init_queue(&ctrl->admin_tag_set);
|
|
@@ -795,12 +796,6 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl,
|
|
|
if (error)
|
|
|
goto out_stop_queue;
|
|
|
|
|
|
- error = nvme_rdma_alloc_qe(ctrl->queues[0].device->dev,
|
|
|
- &ctrl->async_event_sqe, sizeof(struct nvme_command),
|
|
|
- DMA_TO_DEVICE);
|
|
|
- if (error)
|
|
|
- goto out_stop_queue;
|
|
|
-
|
|
|
return 0;
|
|
|
|
|
|
out_stop_queue:
|
|
@@ -811,6 +806,9 @@ out_cleanup_queue:
|
|
|
out_free_tagset:
|
|
|
if (new)
|
|
|
nvme_rdma_free_tagset(&ctrl->ctrl, ctrl->ctrl.admin_tagset);
|
|
|
+out_free_async_qe:
|
|
|
+ nvme_rdma_free_qe(ctrl->device->dev, &ctrl->async_event_sqe,
|
|
|
+ sizeof(struct nvme_command), DMA_TO_DEVICE);
|
|
|
out_free_queue:
|
|
|
nvme_rdma_free_queue(&ctrl->queues[0]);
|
|
|
return error;
|