Lines Matching full:mem
39 siw_dbg_mem(m, "new MEM object\n"); in siw_mem_add()
53 struct siw_mem *mem; in siw_mem_id2obj() local
56 mem = xa_load(&sdev->mem_xa, stag_index); in siw_mem_id2obj()
57 if (likely(mem && kref_get_unless_zero(&mem->ref))) { in siw_mem_id2obj()
59 return mem; in siw_mem_id2obj()
85 struct siw_mem *mem = kzalloc(sizeof(*mem), GFP_KERNEL); in siw_mr_add_mem() local
89 if (!mem) in siw_mr_add_mem()
92 mem->mem_obj = mem_obj; in siw_mr_add_mem()
93 mem->stag_valid = 0; in siw_mr_add_mem()
94 mem->sdev = sdev; in siw_mr_add_mem()
95 mem->va = start; in siw_mr_add_mem()
96 mem->len = len; in siw_mr_add_mem()
97 mem->pd = pd; in siw_mr_add_mem()
98 mem->perms = rights & IWARP_ACCESS_MASK; in siw_mr_add_mem()
99 kref_init(&mem->ref); in siw_mr_add_mem()
104 if (xa_alloc_cyclic(&sdev->mem_xa, &id, mem, limit, &next, in siw_mr_add_mem()
106 kfree(mem); in siw_mr_add_mem()
110 mr->mem = mem; in siw_mr_add_mem()
112 mem->stag = id << 8; in siw_mr_add_mem()
113 mr->base_mr.lkey = mr->base_mr.rkey = mem->stag; in siw_mr_add_mem()
120 struct siw_mem *mem = mr->mem, *found; in siw_mr_drop_mem() local
122 mem->stag_valid = 0; in siw_mr_drop_mem()
127 found = xa_erase(&mem->sdev->mem_xa, mem->stag >> 8); in siw_mr_drop_mem()
128 WARN_ON(found != mem); in siw_mr_drop_mem()
129 siw_mem_put(mem); in siw_mr_drop_mem()
134 struct siw_mem *mem = container_of(ref, struct siw_mem, ref); in siw_free_mem() local
136 siw_dbg_mem(mem, "free mem, pbl: %s\n", mem->is_pbl ? "y" : "n"); in siw_free_mem()
138 if (!mem->is_mw && mem->mem_obj) { in siw_free_mem()
139 if (mem->is_pbl == 0) in siw_free_mem()
140 siw_umem_release(mem->umem); in siw_free_mem()
142 kfree(mem->pbl); in siw_free_mem()
144 kfree(mem); in siw_free_mem()
154 * @mem: memory to be checked
155 * @addr: starting addr of mem
160 int siw_check_mem(struct ib_pd *pd, struct siw_mem *mem, u64 addr, in siw_check_mem() argument
163 if (!mem->stag_valid) { in siw_check_mem()
164 siw_dbg_pd(pd, "STag 0x%08x invalid\n", mem->stag); in siw_check_mem()
167 if (mem->pd != pd) { in siw_check_mem()
168 siw_dbg_pd(pd, "STag 0x%08x: PD mismatch\n", mem->stag); in siw_check_mem()
174 if ((mem->perms & perms) < perms) { in siw_check_mem()
176 mem->perms, perms); in siw_check_mem()
182 if (addr < mem->va || addr + len > mem->va + mem->len) { in siw_check_mem()
183 siw_dbg_pd(pd, "MEM interval len %d\n", len); in siw_check_mem()
188 (void *)(uintptr_t)mem->va, in siw_check_mem()
189 (void *)(uintptr_t)(mem->va + mem->len), in siw_check_mem()
190 mem->stag); in siw_check_mem()
204 * @mem: location of memory reference within array
209 * NOTE: Function references SGE's memory object (mem->obj)
211 * released if check failed. If mem->obj is already valid, no new
212 * lookup is being done and mem is not released it check fails.
214 int siw_check_sge(struct ib_pd *pd, struct siw_sge *sge, struct siw_mem *mem[], in siw_check_sge() argument
225 if (*mem == NULL) { in siw_check_sge()
232 *mem = new; in siw_check_sge()
235 if (unlikely((*mem)->stag != sge->lkey)) { in siw_check_sge()
236 siw_dbg_mem((*mem), "STag mismatch: 0x%08x\n", sge->lkey); in siw_check_sge()
240 rv = siw_check_mem(pd, *mem, sge->laddr + off, perms, len); in siw_check_sge()
248 *mem = NULL; in siw_check_sge()
264 siw_unref_mem_sgl(wqe->mem, wqe->sqe.num_sge); in siw_wqe_put_mem()
268 siw_unref_mem_sgl(wqe->mem, wqe->rqe.num_sge); in siw_wqe_put_mem()
272 siw_unref_mem_sgl(wqe->mem, 1); in siw_wqe_put_mem()
287 struct siw_mem *mem = siw_mem_id2obj(sdev, stag >> 8); in siw_invalidate_stag() local
290 if (unlikely(!mem)) { in siw_invalidate_stag()
294 if (unlikely(mem->pd != pd)) { in siw_invalidate_stag()
303 mem->stag_valid = 0; in siw_invalidate_stag()
307 siw_mem_put(mem); in siw_invalidate_stag()