nvme/rdma: Move stale connection retries to connect call.
This gives us a more standard path in the create_io_qpair path. Eventually this will allow us to bring the connection commands out to the generic layer in alloc_io_qpair. Then we can split the calls to create and connect at the generic level making it possible to add rdma qpairs to a poll group in a meaningful way. Signed-off-by: Seth Howell <seth.howell@intel.com> Change-Id: Ib1b125f834c3c39a2b5050ff4a9bc4a053b95c99 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1119 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
parent
1850842461
commit
7f82fb653d
@ -1100,7 +1100,7 @@ nvme_rdma_unregister_mem(struct nvme_rdma_qpair *rqpair)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair)
|
_nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair)
|
||||||
{
|
{
|
||||||
struct sockaddr_storage dst_addr;
|
struct sockaddr_storage dst_addr;
|
||||||
struct sockaddr_storage src_addr;
|
struct sockaddr_storage src_addr;
|
||||||
@ -1207,6 +1207,32 @@ nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qp
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
nvme_rdma_ctrlr_connect_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_qpair *qpair)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
int retry_count = 0;
|
||||||
|
|
||||||
|
rc = _nvme_rdma_ctrlr_connect_qpair(ctrlr, qpair);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* -EAGAIN represents the special case where the target side still thought it was connected.
|
||||||
|
* Most NICs will fail the first connection attempt, and the NICs will clean up whatever
|
||||||
|
* state they need to. After that, subsequent connection attempts will succeed.
|
||||||
|
*/
|
||||||
|
if (rc == -EAGAIN) {
|
||||||
|
SPDK_NOTICELOG("Detected stale connection on Target side for qpid: %d\n", qpair->id);
|
||||||
|
do {
|
||||||
|
nvme_delay(NVME_RDMA_STALE_CONN_RETRY_DELAY_US);
|
||||||
|
nvme_transport_ctrlr_disconnect_qpair(ctrlr, qpair);
|
||||||
|
rc = _nvme_rdma_ctrlr_connect_qpair(ctrlr, qpair);
|
||||||
|
retry_count++;
|
||||||
|
} while (rc == -EAGAIN && retry_count < NVME_RDMA_STALE_CONN_RETRY_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc == -EAGAIN ? -1 : rc;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Build SGL describing empty payload.
|
* Build SGL describing empty payload.
|
||||||
*/
|
*/
|
||||||
@ -1584,7 +1610,7 @@ nvme_rdma_ctrlr_create_qpair(struct spdk_nvme_ctrlr *ctrlr,
|
|||||||
{
|
{
|
||||||
struct nvme_rdma_qpair *rqpair;
|
struct nvme_rdma_qpair *rqpair;
|
||||||
struct spdk_nvme_qpair *qpair;
|
struct spdk_nvme_qpair *qpair;
|
||||||
int rc, retry_count = 0;
|
int rc;
|
||||||
|
|
||||||
rqpair = calloc(1, sizeof(struct nvme_rdma_qpair));
|
rqpair = calloc(1, sizeof(struct nvme_rdma_qpair));
|
||||||
if (!rqpair) {
|
if (!rqpair) {
|
||||||
@ -1618,21 +1644,6 @@ nvme_rdma_ctrlr_create_qpair(struct spdk_nvme_ctrlr *ctrlr,
|
|||||||
|
|
||||||
rc = nvme_transport_ctrlr_connect_qpair(ctrlr, qpair);
|
rc = nvme_transport_ctrlr_connect_qpair(ctrlr, qpair);
|
||||||
|
|
||||||
/*
|
|
||||||
* -EAGAIN represents the special case where the target side still thought it was connected.
|
|
||||||
* Most NICs will fail the first connection attempt, and the NICs will clean up whatever
|
|
||||||
* state they need to. After that, subsequent connection attempts will succeed.
|
|
||||||
*/
|
|
||||||
if (rc == -EAGAIN) {
|
|
||||||
SPDK_NOTICELOG("Detected stale connection on Target side for qpid: %d\n", rqpair->qpair.id);
|
|
||||||
do {
|
|
||||||
nvme_delay(NVME_RDMA_STALE_CONN_RETRY_DELAY_US);
|
|
||||||
nvme_transport_ctrlr_disconnect_qpair(ctrlr, &rqpair->qpair);
|
|
||||||
rc = nvme_transport_ctrlr_connect_qpair(ctrlr, &rqpair->qpair);
|
|
||||||
retry_count++;
|
|
||||||
} while (rc == -EAGAIN && retry_count < NVME_RDMA_STALE_CONN_RETRY_MAX);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
nvme_rdma_ctrlr_delete_io_qpair(ctrlr, qpair);
|
nvme_rdma_ctrlr_delete_io_qpair(ctrlr, qpair);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user