From 4a6f8588726b16544c9d44c971a6af23a9c299a7 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 26 Aug 2022 16:53:49 +0900 Subject: [PATCH] nvme_rdma: Set REUSEADDR to reuse source address among multiple CM IDs When we specify source address for admin and I/O qpairs, rdma_resolve_addr() succeeded only for admin qpair and failed for following all I/O qpairs because rdma_resolve_addr() returned -EADDRINUSE. To reuse source address among multiple qpairs, set the REUSEADDR option for each CM ID before executing rdma_resolve_addr() if source address is specified. We may miss something. Even if rdma_set_option() fails, execute rdma_resolve_addr(). Fixes issue #2604 Signed-off-by: Shuhei Matsumoto Change-Id: If03f82d4499cf83c0e428a62e91c9d9e6aad28e0 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14229 Tested-by: SPDK CI Jenkins Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker Reviewed-by: GangCao Reviewed-by: Dong Yi --- lib/nvme/nvme_rdma.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index fab23d74b..7a9a9fbae 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1193,6 +1193,20 @@ nvme_rdma_resolve_addr(struct nvme_rdma_qpair *rqpair, { int ret; + if (src_addr) { + int reuse = 1; + + ret = rdma_set_option(rqpair->cm_id, RDMA_OPTION_ID, RDMA_OPTION_ID_REUSEADDR, + &reuse, sizeof(reuse)); + if (ret) { + SPDK_NOTICELOG("Can't apply RDMA_OPTION_ID_REUSEADDR %d, ret %d\n", + reuse, ret); + /* It is likely that rdma_resolve_addr() returns -EADDRINUSE, but + * we may missing something. We rely on rdma_resolve_addr(). + */ + } + } + ret = rdma_resolve_addr(rqpair->cm_id, src_addr, dst_addr, NVME_RDMA_TIME_OUT_IN_MS); if (ret) {