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 <smatsumoto@nvidia.com>
Change-Id: If03f82d4499cf83c0e428a62e91c9d9e6aad28e0
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14229
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: GangCao <gang.cao@intel.com>
Reviewed-by: Dong Yi <dongx.yi@intel.com>
This commit is contained in:
Shuhei Matsumoto 2022-08-26 16:53:49 +09:00 committed by Tomasz Zawadzki
parent 5af2dfdc9d
commit 4a6f858872

View File

@ -1193,6 +1193,20 @@ nvme_rdma_resolve_addr(struct nvme_rdma_qpair *rqpair,
{ {
int ret; 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, ret = rdma_resolve_addr(rqpair->cm_id, src_addr, dst_addr,
NVME_RDMA_TIME_OUT_IN_MS); NVME_RDMA_TIME_OUT_IN_MS);
if (ret) { if (ret) {