nvmf/rdma: Fix double complete when RNIC goes offline
A request could be completed twice, once for an error on an IBV_SEND operation and again on an outstanding IBV_RDMA_WRITE operation, if the RNIC goes offline while a complete + data transfer are occurring. This fixes GitHub issue #414 Change-Id: I2338b4d4582c5ee2512cfbd1e89048a10d3ecf1c Signed-off-by: Ben Walker <benjamin.walker@intel.com> Reviewed-on: https://review.gerrithub.io/425646 Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
e7988759d0
commit
4d5f288c7d
@ -2670,8 +2670,6 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_transport *rtransport,
|
||||
|
||||
switch (wc[i].opcode) {
|
||||
case IBV_WC_SEND:
|
||||
case IBV_WC_RDMA_WRITE:
|
||||
case IBV_WC_RDMA_READ:
|
||||
rdma_req = get_rdma_req_from_wc(&wc[i]);
|
||||
rqpair = SPDK_CONTAINEROF(rdma_req->req.qpair, struct spdk_nvmf_rdma_qpair, qpair);
|
||||
|
||||
@ -2688,6 +2686,14 @@ spdk_nvmf_rdma_poller_poll(struct spdk_nvmf_rdma_transport *rtransport,
|
||||
* the queue pair disconnects or recovers. */
|
||||
TAILQ_INSERT_TAIL(&rqpair->incoming_queue, rdma_recv, link);
|
||||
break;
|
||||
case IBV_WC_RDMA_WRITE:
|
||||
case IBV_WC_RDMA_READ:
|
||||
/* If the data transfer fails still force the queue into the error state,
|
||||
* but the rdma_req objects should only be manipulated in response to
|
||||
* SEND and RECV operations. */
|
||||
rdma_req = get_rdma_req_from_wc(&wc[i]);
|
||||
rqpair = SPDK_CONTAINEROF(rdma_req->req.qpair, struct spdk_nvmf_rdma_qpair, qpair);
|
||||
break;
|
||||
default:
|
||||
SPDK_ERRLOG("Received an unknown opcode on the CQ: %d\n", wc[i].opcode);
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user