nvmf: continue rdma_poll even meets error

Change-Id: I82fc3e939cc82a696b4c0b186bbc1d6cd82b8b54
Signed-off-by: GangCao <gang.cao@intel.com>
This commit is contained in:
GangCao 2017-02-03 11:55:27 +08:00 committed by Daniel Verkamp
parent 48519cba2f
commit fcdb601ea5

View File

@ -1372,6 +1372,7 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
struct spdk_nvmf_request *req; struct spdk_nvmf_request *req;
int reaped, i, rc; int reaped, i, rc;
int count = 0; int count = 0;
bool error = false;
/* Poll for completing operations. */ /* Poll for completing operations. */
rc = ibv_poll_cq(rdma_conn->cq, 32, wc); rc = ibv_poll_cq(rdma_conn->cq, 32, wc);
@ -1386,13 +1387,15 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
if (wc[i].status) { if (wc[i].status) {
SPDK_ERRLOG("CQ error on Connection %p, Request 0x%lu (%d): %s\n", SPDK_ERRLOG("CQ error on Connection %p, Request 0x%lu (%d): %s\n",
conn, wc[i].wr_id, wc[i].status, ibv_wc_status_str(wc[i].status)); conn, wc[i].wr_id, wc[i].status, ibv_wc_status_str(wc[i].status));
return -1; error = true;
continue;
} }
rdma_req = (struct spdk_nvmf_rdma_request *)wc[i].wr_id; rdma_req = (struct spdk_nvmf_rdma_request *)wc[i].wr_id;
if (rdma_req == NULL) { if (rdma_req == NULL) {
SPDK_ERRLOG("NULL wr_id in RDMA work completion\n"); SPDK_ERRLOG("NULL wr_id in RDMA work completion\n");
return -1; error = true;
continue;
} }
req = &rdma_req->req; req = &rdma_req->req;
@ -1405,7 +1408,8 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
req, conn, rdma_conn->cur_queue_depth - 1); req, conn, rdma_conn->cur_queue_depth - 1);
rc = spdk_nvmf_rdma_request_ack_completion(req); rc = spdk_nvmf_rdma_request_ack_completion(req);
if (rc) { if (rc) {
return -1; error = true;
continue;
} }
break; break;
@ -1415,14 +1419,16 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
spdk_trace_record(TRACE_RDMA_WRITE_COMPLETE, 0, 0, (uint64_t)req, 0); spdk_trace_record(TRACE_RDMA_WRITE_COMPLETE, 0, 0, (uint64_t)req, 0);
rc = spdk_nvmf_rdma_request_send_completion(req); rc = spdk_nvmf_rdma_request_send_completion(req);
if (rc) { if (rc) {
return -1; error = true;
continue;
} }
/* Since an RDMA R/W operation completed, try to submit from the pending list. */ /* Since an RDMA R/W operation completed, try to submit from the pending list. */
rdma_conn->cur_rdma_rw_depth--; rdma_conn->cur_rdma_rw_depth--;
rc = spdk_nvmf_rdma_handle_pending_rdma_rw(conn); rc = spdk_nvmf_rdma_handle_pending_rdma_rw(conn);
if (rc < 0) { if (rc < 0) {
return -1; error = true;
continue;
} }
count += rc; count += rc;
break; break;
@ -1433,7 +1439,8 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
spdk_trace_record(TRACE_RDMA_READ_COMPLETE, 0, 0, (uint64_t)req, 0); spdk_trace_record(TRACE_RDMA_READ_COMPLETE, 0, 0, (uint64_t)req, 0);
rc = spdk_nvmf_request_exec(req); rc = spdk_nvmf_request_exec(req);
if (rc) { if (rc) {
return -1; error = true;
continue;
} }
count++; count++;
@ -1441,7 +1448,8 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
rdma_conn->cur_rdma_rw_depth--; rdma_conn->cur_rdma_rw_depth--;
rc = spdk_nvmf_rdma_handle_pending_rdma_rw(conn); rc = spdk_nvmf_rdma_handle_pending_rdma_rw(conn);
if (rc < 0) { if (rc < 0) {
return -1; error = true;
continue;
} }
count += rc; count += rc;
break; break;
@ -1449,7 +1457,8 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
case IBV_WC_RECV: case IBV_WC_RECV:
if (wc[i].byte_len < sizeof(struct spdk_nvmf_capsule_cmd)) { if (wc[i].byte_len < sizeof(struct spdk_nvmf_capsule_cmd)) {
SPDK_ERRLOG("recv length %u less than capsule header\n", wc[i].byte_len); SPDK_ERRLOG("recv length %u less than capsule header\n", wc[i].byte_len);
return -1; error = true;
continue;
} }
rdma_conn->cur_queue_depth++; rdma_conn->cur_queue_depth++;
@ -1466,7 +1475,8 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
/* Data is immediately available */ /* Data is immediately available */
rc = spdk_nvmf_request_exec(req); rc = spdk_nvmf_request_exec(req);
if (rc < 0) { if (rc < 0) {
return -1; error = true;
continue;
} }
count++; count++;
break; break;
@ -1478,7 +1488,8 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
SPDK_TRACELOG(SPDK_TRACE_RDMA, "Request %p needs data transfer\n", req); SPDK_TRACELOG(SPDK_TRACE_RDMA, "Request %p needs data transfer\n", req);
rc = spdk_nvmf_rdma_request_transfer_data(req); rc = spdk_nvmf_rdma_request_transfer_data(req);
if (rc < 0) { if (rc < 0) {
return -1; error = true;
continue;
} }
break; break;
case SPDK_NVMF_REQUEST_PREP_ERROR: case SPDK_NVMF_REQUEST_PREP_ERROR:
@ -1489,10 +1500,15 @@ spdk_nvmf_rdma_poll(struct spdk_nvmf_conn *conn)
default: default:
SPDK_ERRLOG("Received an unknown opcode on the CQ: %d\n", wc[i].opcode); SPDK_ERRLOG("Received an unknown opcode on the CQ: %d\n", wc[i].opcode);
return -1; error = true;
continue;
} }
} }
if (error == true) {
return -1;
}
return count; return count;
} }