Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dab7e3b8 authored by Chuck Lever's avatar Chuck Lever Committed by Anna Schumaker
Browse files

xprtrdma: Disable completions for LOCAL_INV Work Requests



Instead of relying on a completion to change the state of an FRMR
to FRMR_IS_INVALID, set it in advance. If an error occurs, a completion
will fire anyway and mark the FRMR FRMR_IS_STALE.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Tested-by: default avatarSteve Wise <swise@opengridcomputing.com>
Tested-by: default avatarShirley Ma <shirley.ma@oracle.com>
Tested-by: default avatarDevesh Sharma <devesh.sharma@emulex.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 05055722
Loading
Loading
Loading
Loading
+8 −9
Original line number Original line Diff line number Diff line
@@ -154,12 +154,8 @@ rpcrdma_sendcq_process_wc(struct ib_wc *wc)


	if (wc->wr_id == 0ULL)
	if (wc->wr_id == 0ULL)
		return;
		return;
	if (wc->status != IB_WC_SUCCESS) {
	if (wc->status != IB_WC_SUCCESS)
		frmr->r.frmr.fr_state = FRMR_IS_STALE;
		frmr->r.frmr.fr_state = FRMR_IS_STALE;
		return;
	}

	frmr->r.frmr.fr_state = FRMR_IS_INVALID;
}
}


static int
static int
@@ -1369,12 +1365,11 @@ rpcrdma_retry_local_inv(struct rpcrdma_mw *r, struct rpcrdma_ia *ia)
	dprintk("RPC:       %s: FRMR %p is stale\n", __func__, r);
	dprintk("RPC:       %s: FRMR %p is stale\n", __func__, r);


	/* When this FRMR is re-inserted into rb_mws, it is no longer stale */
	/* When this FRMR is re-inserted into rb_mws, it is no longer stale */
	r->r.frmr.fr_state = FRMR_IS_VALID;
	r->r.frmr.fr_state = FRMR_IS_INVALID;


	memset(&invalidate_wr, 0, sizeof(invalidate_wr));
	memset(&invalidate_wr, 0, sizeof(invalidate_wr));
	invalidate_wr.wr_id = (unsigned long)(void *)r;
	invalidate_wr.wr_id = (unsigned long)(void *)r;
	invalidate_wr.opcode = IB_WR_LOCAL_INV;
	invalidate_wr.opcode = IB_WR_LOCAL_INV;
	invalidate_wr.send_flags = IB_SEND_SIGNALED;
	invalidate_wr.ex.invalidate_rkey = r->r.frmr.fr_mr->rkey;
	invalidate_wr.ex.invalidate_rkey = r->r.frmr.fr_mr->rkey;
	DECR_CQCOUNT(&r_xprt->rx_ep);
	DECR_CQCOUNT(&r_xprt->rx_ep);


@@ -1778,10 +1773,11 @@ rpcrdma_deregister_frmr_external(struct rpcrdma_mr_seg *seg,
	struct ib_send_wr invalidate_wr, *bad_wr;
	struct ib_send_wr invalidate_wr, *bad_wr;
	int rc;
	int rc;


	seg1->mr_chunk.rl_mw->r.frmr.fr_state = FRMR_IS_INVALID;

	memset(&invalidate_wr, 0, sizeof invalidate_wr);
	memset(&invalidate_wr, 0, sizeof invalidate_wr);
	invalidate_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw;
	invalidate_wr.wr_id = (unsigned long)(void *)seg1->mr_chunk.rl_mw;
	invalidate_wr.opcode = IB_WR_LOCAL_INV;
	invalidate_wr.opcode = IB_WR_LOCAL_INV;
	invalidate_wr.send_flags = IB_SEND_SIGNALED;
	invalidate_wr.ex.invalidate_rkey = seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey;
	invalidate_wr.ex.invalidate_rkey = seg1->mr_chunk.rl_mw->r.frmr.fr_mr->rkey;
	DECR_CQCOUNT(&r_xprt->rx_ep);
	DECR_CQCOUNT(&r_xprt->rx_ep);


@@ -1790,9 +1786,12 @@ rpcrdma_deregister_frmr_external(struct rpcrdma_mr_seg *seg,
		rpcrdma_unmap_one(ia, seg++);
		rpcrdma_unmap_one(ia, seg++);
	rc = ib_post_send(ia->ri_id->qp, &invalidate_wr, &bad_wr);
	rc = ib_post_send(ia->ri_id->qp, &invalidate_wr, &bad_wr);
	read_unlock(&ia->ri_qplock);
	read_unlock(&ia->ri_qplock);
	if (rc)
	if (rc) {
		/* Force rpcrdma_buffer_get() to retry */
		seg1->mr_chunk.rl_mw->r.frmr.fr_state = FRMR_IS_STALE;
		dprintk("RPC:       %s: failed ib_post_send for invalidate,"
		dprintk("RPC:       %s: failed ib_post_send for invalidate,"
			" status %i\n", __func__, rc);
			" status %i\n", __func__, rc);
	}
	return rc;
	return rc;
}
}