Commit 544c7f62 authored by Bob Pearson's avatar Bob Pearson Committed by Jason Gunthorpe
Browse files

RDMA/rxe: Implement rereg_user_mr

Implement the two easy cases of ib_rereg_user_mr.

Link: https://lore.kernel.org/r/20230530221334.89432-7-rpearsonhpe@gmail.com


Signed-off-by: default avatarBob Pearson <rpearsonhpe@gmail.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
parent 86a3fb55
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -1299,6 +1299,40 @@ static struct ib_mr *rxe_reg_user_mr(struct ib_pd *ibpd, u64 start,
	return ERR_PTR(err);
}

static struct ib_mr *rxe_rereg_user_mr(struct ib_mr *ibmr, int flags,
				       u64 start, u64 length, u64 iova,
				       int access, struct ib_pd *ibpd,
				       struct ib_udata *udata)
{
	struct rxe_mr *mr = to_rmr(ibmr);
	struct rxe_pd *old_pd = to_rpd(ibmr->pd);
	struct rxe_pd *pd = to_rpd(ibpd);

	/* for now only support the two easy cases:
	 * rereg_pd and rereg_access
	 */
	if (flags & ~RXE_MR_REREG_SUPPORTED) {
		rxe_err_mr(mr, "flags = %#x not supported", flags);
		return ERR_PTR(-EOPNOTSUPP);
	}

	if (flags & IB_MR_REREG_PD) {
		rxe_put(old_pd);
		rxe_get(pd);
		mr->ibmr.pd = ibpd;
	}

	if (flags & IB_MR_REREG_ACCESS) {
		if (access & ~RXE_ACCESS_SUPPORTED_MR) {
			rxe_err_mr(mr, "access = %#x not supported", access);
			return ERR_PTR(-EOPNOTSUPP);
		}
		mr->access = access;
	}

	return NULL;
}

static struct ib_mr *rxe_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
				  u32 max_num_sg)
{
@@ -1451,6 +1485,7 @@ static const struct ib_device_ops rxe_dev_ops = {
	.query_srq = rxe_query_srq,
	.reg_user_mr = rxe_reg_user_mr,
	.req_notify_cq = rxe_req_notify_cq,
	.rereg_user_mr = rxe_rereg_user_mr,
	.resize_cq = rxe_resize_cq,

	INIT_RDMA_OBJ_SIZE(ib_ah, rxe_ah, ibah),
+5 −0
Original line number Diff line number Diff line
@@ -284,6 +284,11 @@ enum rxe_mr_lookup_type {
	RXE_LOOKUP_REMOTE,
};

enum rxe_rereg {
	RXE_MR_REREG_SUPPORTED	= IB_MR_REREG_PD
				| IB_MR_REREG_ACCESS,
};

static inline int rkey_is_mw(u32 rkey)
{
	u32 index = rkey >> 8;