Lines Matching refs:mw

18 	struct rxe_mw *mw = to_rmw(ibmw);  in rxe_alloc_mw()  local
25 ret = rxe_add_to_pool(&rxe->mw_pool, mw); in rxe_alloc_mw()
31 mw->rkey = ibmw->rkey = (mw->elem.index << 8) | rxe_get_next_key(-1); in rxe_alloc_mw()
32 mw->state = (mw->ibmw.type == IB_MW_TYPE_2) ? in rxe_alloc_mw()
34 spin_lock_init(&mw->lock); in rxe_alloc_mw()
36 rxe_finalize(mw); in rxe_alloc_mw()
43 struct rxe_mw *mw = to_rmw(ibmw); in rxe_dealloc_mw() local
45 rxe_cleanup(mw); in rxe_dealloc_mw()
51 struct rxe_mw *mw, struct rxe_mr *mr, int access) in rxe_check_bind_mw() argument
53 if (mw->ibmw.type == IB_MW_TYPE_1) { in rxe_check_bind_mw()
54 if (unlikely(mw->state != RXE_MW_STATE_VALID)) { in rxe_check_bind_mw()
55 rxe_dbg_mw(mw, in rxe_check_bind_mw()
62 rxe_dbg_mw(mw, "attempt to bind a zero based type 1 MW\n"); in rxe_check_bind_mw()
67 if (mw->ibmw.type == IB_MW_TYPE_2) { in rxe_check_bind_mw()
69 if (unlikely(mw->state != RXE_MW_STATE_FREE)) { in rxe_check_bind_mw()
70 rxe_dbg_mw(mw, in rxe_check_bind_mw()
76 if (unlikely(qp->pd != to_rpd(mw->ibmw.pd))) { in rxe_check_bind_mw()
77 rxe_dbg_mw(mw, in rxe_check_bind_mw()
83 if (unlikely(!mr || wqe->wr.wr.mw.length == 0)) { in rxe_check_bind_mw()
84 rxe_dbg_mw(mw, in rxe_check_bind_mw()
95 rxe_dbg_mw(mw, "attempt to bind MW to zero based MR\n"); in rxe_check_bind_mw()
101 rxe_dbg_mw(mw, in rxe_check_bind_mw()
110 rxe_dbg_mw(mw, in rxe_check_bind_mw()
117 if (unlikely(wqe->wr.wr.mw.length > mr->ibmr.length)) { in rxe_check_bind_mw()
118 rxe_dbg_mw(mw, in rxe_check_bind_mw()
123 if (unlikely((wqe->wr.wr.mw.addr < mr->ibmr.iova) || in rxe_check_bind_mw()
124 ((wqe->wr.wr.mw.addr + wqe->wr.wr.mw.length) > in rxe_check_bind_mw()
126 rxe_dbg_mw(mw, in rxe_check_bind_mw()
136 struct rxe_mw *mw, struct rxe_mr *mr, int access) in rxe_do_bind_mw() argument
138 u32 key = wqe->wr.wr.mw.rkey & 0xff; in rxe_do_bind_mw()
140 mw->rkey = (mw->rkey & ~0xff) | key; in rxe_do_bind_mw()
141 mw->access = access; in rxe_do_bind_mw()
142 mw->state = RXE_MW_STATE_VALID; in rxe_do_bind_mw()
143 mw->addr = wqe->wr.wr.mw.addr; in rxe_do_bind_mw()
144 mw->length = wqe->wr.wr.mw.length; in rxe_do_bind_mw()
146 if (mw->mr) { in rxe_do_bind_mw()
147 rxe_put(mw->mr); in rxe_do_bind_mw()
148 atomic_dec(&mw->mr->num_mw); in rxe_do_bind_mw()
149 mw->mr = NULL; in rxe_do_bind_mw()
152 if (mw->length) { in rxe_do_bind_mw()
153 mw->mr = mr; in rxe_do_bind_mw()
158 if (mw->ibmw.type == IB_MW_TYPE_2) { in rxe_do_bind_mw()
160 mw->qp = qp; in rxe_do_bind_mw()
167 struct rxe_mw *mw; in rxe_bind_mw() local
170 u32 mw_rkey = wqe->wr.wr.mw.mw_rkey; in rxe_bind_mw()
171 u32 mr_lkey = wqe->wr.wr.mw.mr_lkey; in rxe_bind_mw()
172 int access = wqe->wr.wr.mw.access; in rxe_bind_mw()
174 mw = rxe_pool_get_index(&rxe->mw_pool, mw_rkey >> 8); in rxe_bind_mw()
175 if (unlikely(!mw)) { in rxe_bind_mw()
180 if (unlikely(mw->rkey != mw_rkey)) { in rxe_bind_mw()
185 if (likely(wqe->wr.wr.mw.length)) { in rxe_bind_mw()
201 rxe_err_mw(mw, "access %#x not supported\n", access); in rxe_bind_mw()
206 spin_lock_bh(&mw->lock); in rxe_bind_mw()
208 ret = rxe_check_bind_mw(qp, wqe, mw, mr, access); in rxe_bind_mw()
212 rxe_do_bind_mw(qp, wqe, mw, mr, access); in rxe_bind_mw()
214 spin_unlock_bh(&mw->lock); in rxe_bind_mw()
219 rxe_put(mw); in rxe_bind_mw()
224 static int rxe_check_invalidate_mw(struct rxe_qp *qp, struct rxe_mw *mw) in rxe_check_invalidate_mw() argument
226 if (unlikely(mw->state == RXE_MW_STATE_INVALID)) in rxe_check_invalidate_mw()
230 if (unlikely(mw->ibmw.type == IB_MW_TYPE_1)) in rxe_check_invalidate_mw()
236 static void rxe_do_invalidate_mw(struct rxe_mw *mw) in rxe_do_invalidate_mw() argument
242 qp = mw->qp; in rxe_do_invalidate_mw()
243 mw->qp = NULL; in rxe_do_invalidate_mw()
247 mr = mw->mr; in rxe_do_invalidate_mw()
248 mw->mr = NULL; in rxe_do_invalidate_mw()
252 mw->access = 0; in rxe_do_invalidate_mw()
253 mw->addr = 0; in rxe_do_invalidate_mw()
254 mw->length = 0; in rxe_do_invalidate_mw()
255 mw->state = RXE_MW_STATE_FREE; in rxe_do_invalidate_mw()
261 struct rxe_mw *mw; in rxe_invalidate_mw() local
264 mw = rxe_pool_get_index(&rxe->mw_pool, rkey >> 8); in rxe_invalidate_mw()
265 if (!mw) { in rxe_invalidate_mw()
270 if (rkey != mw->rkey) { in rxe_invalidate_mw()
275 spin_lock_bh(&mw->lock); in rxe_invalidate_mw()
277 ret = rxe_check_invalidate_mw(qp, mw); in rxe_invalidate_mw()
281 rxe_do_invalidate_mw(mw); in rxe_invalidate_mw()
283 spin_unlock_bh(&mw->lock); in rxe_invalidate_mw()
285 rxe_put(mw); in rxe_invalidate_mw()
294 struct rxe_mw *mw; in rxe_lookup_mw() local
297 mw = rxe_pool_get_index(&rxe->mw_pool, index); in rxe_lookup_mw()
298 if (!mw) in rxe_lookup_mw()
301 if (unlikely((mw->rkey != rkey) || rxe_mw_pd(mw) != pd || in rxe_lookup_mw()
302 (mw->ibmw.type == IB_MW_TYPE_2 && mw->qp != qp) || in rxe_lookup_mw()
303 (mw->length == 0) || ((access & mw->access) != access) || in rxe_lookup_mw()
304 mw->state != RXE_MW_STATE_VALID)) { in rxe_lookup_mw()
305 rxe_put(mw); in rxe_lookup_mw()
309 return mw; in rxe_lookup_mw()
314 struct rxe_mw *mw = container_of(elem, typeof(*mw), elem); in rxe_mw_cleanup() local
315 struct rxe_pd *pd = to_rpd(mw->ibmw.pd); in rxe_mw_cleanup()
319 if (mw->mr) { in rxe_mw_cleanup()
320 struct rxe_mr *mr = mw->mr; in rxe_mw_cleanup()
322 mw->mr = NULL; in rxe_mw_cleanup()
327 if (mw->qp) { in rxe_mw_cleanup()
328 struct rxe_qp *qp = mw->qp; in rxe_mw_cleanup()
330 mw->qp = NULL; in rxe_mw_cleanup()
334 mw->access = 0; in rxe_mw_cleanup()
335 mw->addr = 0; in rxe_mw_cleanup()
336 mw->length = 0; in rxe_mw_cleanup()
337 mw->state = RXE_MW_STATE_INVALID; in rxe_mw_cleanup()