[PATCH 06/11] nvme-rdma: rework rdma connection establishment error path
Christoph Hellwig
hch at lst.de
Thu May 4 04:18:34 PDT 2017
On Thu, May 04, 2017 at 01:33:10PM +0300, Sagi Grimberg wrote:
> Instead of introducing a flag for if the queue is allocated,
> simply free the rdma resources when we get the error.
>
> We allocate the queue rdma resources when we have an address
> resolution, their we allocate (or take a reference on) our device
> so we should free it when we have error after the address resolution
> namely:
> 1. route resolution error
> 2. connect reject
> 3. connect error
> 4. peer unreachable error
>
> Signed-off-by: Sagi Grimberg <sagi at grimberg.me>
> ---
> drivers/nvme/host/rdma.c | 14 +++++---------
> 1 file changed, 5 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
> index 2dc381b57e4b..7df52896f321 100644
> --- a/drivers/nvme/host/rdma.c
> +++ b/drivers/nvme/host/rdma.c
> @@ -81,9 +81,8 @@ struct nvme_rdma_request {
>
> enum nvme_rdma_queue_flags {
> NVME_RDMA_Q_CONNECTED = 0,
> - NVME_RDMA_IB_QUEUE_ALLOCATED = 1,
> - NVME_RDMA_Q_DELETING = 2,
> - NVME_RDMA_Q_LIVE = 3,
> + NVME_RDMA_Q_DELETING = 1,
> + NVME_RDMA_Q_LIVE = 2,
> };
>
> struct nvme_rdma_queue {
> @@ -466,9 +465,6 @@ static void nvme_rdma_destroy_queue_ib(struct nvme_rdma_queue *queue)
> struct nvme_rdma_device *dev;
> struct ib_device *ibdev;
>
> - if (!test_and_clear_bit(NVME_RDMA_IB_QUEUE_ALLOCATED, &queue->flags))
> - return;
> -
> dev = queue->device;
> ibdev = dev->dev;
> rdma_destroy_qp(queue->cm_id);
> @@ -525,7 +521,6 @@ static int nvme_rdma_create_queue_ib(struct nvme_rdma_queue *queue)
> ret = -ENOMEM;
> goto out_destroy_qp;
> }
> - set_bit(NVME_RDMA_IB_QUEUE_ALLOCATED, &queue->flags);
>
> return 0;
>
> @@ -590,7 +585,6 @@ static int nvme_rdma_init_queue(struct nvme_rdma_ctrl *ctrl,
> return 0;
>
> out_destroy_cm_id:
> - nvme_rdma_destroy_queue_ib(queue);
> rdma_destroy_id(queue->cm_id);
> return ret;
> }
> @@ -1362,12 +1356,14 @@ static int nvme_rdma_cm_handler(struct rdma_cm_id *cm_id,
> complete(&queue->cm_done);
> return 0;
> case RDMA_CM_EVENT_REJECTED:
> + nvme_rdma_destroy_queue_ib(queue);
> cm_error = nvme_rdma_conn_rejected(queue, ev);
> break;
> - case RDMA_CM_EVENT_ADDR_ERROR:
> case RDMA_CM_EVENT_ROUTE_ERROR:
> case RDMA_CM_EVENT_CONNECT_ERROR:
> case RDMA_CM_EVENT_UNREACHABLE:
> + nvme_rdma_destroy_queue_ib(queue);
> + case RDMA_CM_EVENT_ADDR_ERROR:
Please add a /*FALLTHRU*/ annotation here.
Otherwise looks fine:
Reviewed-by: Christoph Hellwig <hch at lst.de>
More information about the Linux-nvme
mailing list