Lines Matching refs:mem
27 int mem_check_range(struct rxe_mem *mem, u64 iova, size_t length)
29 switch (mem->type) {
35 if (iova < mem->iova ||
36 length > mem->length ||
37 iova > mem->iova + mem->length - length)
50 static void rxe_mem_init(int access, struct rxe_mem *mem)
52 u32 lkey = mem->pelem.index << 8 | rxe_get_key();
55 mem->ibmr.lkey = lkey;
56 mem->ibmr.rkey = rkey;
57 mem->state = RXE_MEM_STATE_INVALID;
58 mem->type = RXE_MEM_TYPE_NONE;
59 mem->map_shift = ilog2(RXE_BUF_PER_MAP);
64 struct rxe_mem *mem = container_of(arg, typeof(*mem), pelem);
67 ib_umem_release(mem->umem);
69 if (mem->map) {
70 for (i = 0; i < mem->num_map; i++)
71 kfree(mem->map[i]);
73 kfree(mem->map);
77 static int rxe_mem_alloc(struct rxe_mem *mem, int num_buf)
81 struct rxe_map **map = mem->map;
85 mem->map = kmalloc_array(num_map, sizeof(*map), GFP_KERNEL);
86 if (!mem->map)
90 mem->map[i] = kmalloc(sizeof(**map), GFP_KERNEL);
91 if (!mem->map[i])
97 mem->map_shift = ilog2(RXE_BUF_PER_MAP);
98 mem->map_mask = RXE_BUF_PER_MAP - 1;
100 mem->num_buf = num_buf;
101 mem->num_map = num_map;
102 mem->max_buf = num_map * RXE_BUF_PER_MAP;
108 kfree(mem->map[i]);
110 kfree(mem->map);
116 int access, struct rxe_mem *mem)
118 rxe_mem_init(access, mem);
120 mem->ibmr.pd = &pd->ibpd;
121 mem->access = access;
122 mem->state = RXE_MEM_STATE_VALID;
123 mem->type = RXE_MEM_TYPE_DMA;
128 struct rxe_mem *mem)
146 mem->umem = umem;
149 rxe_mem_init(access, mem);
151 err = rxe_mem_alloc(mem, num_buf);
158 mem->page_shift = PAGE_SHIFT;
159 mem->page_mask = PAGE_SIZE - 1;
162 map = mem->map;
189 mem->ibmr.pd = &pd->ibpd;
190 mem->umem = umem;
191 mem->access = access;
192 mem->length = length;
193 mem->iova = iova;
194 mem->va = start;
195 mem->offset = ib_umem_offset(umem);
196 mem->state = RXE_MEM_STATE_VALID;
197 mem->type = RXE_MEM_TYPE_MR;
206 int max_pages, struct rxe_mem *mem)
210 rxe_mem_init(0, mem);
213 mem->ibmr.rkey = mem->ibmr.lkey;
215 err = rxe_mem_alloc(mem, max_pages);
219 mem->ibmr.pd = &pd->ibpd;
220 mem->max_buf = max_pages;
221 mem->state = RXE_MEM_STATE_FREE;
222 mem->type = RXE_MEM_TYPE_MR;
231 struct rxe_mem *mem,
237 size_t offset = iova - mem->iova + mem->offset;
242 if (likely(mem->page_shift)) {
243 *offset_out = offset & mem->page_mask;
244 offset >>= mem->page_shift;
245 *n_out = offset & mem->map_mask;
246 *m_out = offset >> mem->map_shift;
251 length = mem->map[map_index]->buf[buf_index].size;
261 length = mem->map[map_index]->buf[buf_index].size;
270 void *iova_to_vaddr(struct rxe_mem *mem, u64 iova, int length)
276 if (mem->state != RXE_MEM_STATE_VALID) {
277 pr_warn("mem not in valid state\n");
282 if (!mem->map) {
287 if (mem_check_range(mem, iova, length)) {
293 lookup_iova(mem, iova, &m, &n, &offset);
295 if (offset + length > mem->map[m]->buf[n].size) {
301 addr = (void *)(uintptr_t)mem->map[m]->buf[n].addr + offset;
308 * a mem object starting at iova. Compute incremental value of
309 * crc32 if crcp is not zero. caller must hold a reference to mem
311 int rxe_mem_copy(struct rxe_mem *mem, u64 iova, void *addr, int length,
327 if (mem->type == RXE_MEM_TYPE_DMA) {
339 *crcp = rxe_crc32(to_rdev(mem->ibmr.device),
345 WARN_ON_ONCE(!mem->map);
347 err = mem_check_range(mem, iova, length);
353 lookup_iova(mem, iova, &m, &i, &offset);
355 map = mem->map + m;
373 crc = rxe_crc32(to_rdev(mem->ibmr.device),
415 struct rxe_mem *mem = NULL;
428 mem = lookup_mem(pd, access, sge->lkey, lookup_local);
429 if (!mem) {
439 if (mem) {
440 rxe_drop_ref(mem);
441 mem = NULL;
453 mem = lookup_mem(pd, access, sge->lkey,
455 if (!mem) {
470 err = rxe_mem_copy(mem, iova, addr, bytes, dir, crcp);
484 if (mem)
485 rxe_drop_ref(mem);
490 if (mem)
491 rxe_drop_ref(mem);
529 /* (1) find the mem (mr or mw) corresponding to lkey/rkey
531 * (2) verify that the (qp) pd matches the mem pd
532 * (3) verify that the mem can support the requested access
533 * (4) verify that mem state is valid
538 struct rxe_mem *mem;
542 mem = rxe_pool_get_index(&rxe->mr_pool, index);
543 if (!mem)
546 if (unlikely((type == lookup_local && mr_lkey(mem) != key) ||
547 (type == lookup_remote && mr_rkey(mem) != key) ||
548 mr_pd(mem) != pd ||
549 (access && !(access & mem->access)) ||
550 mem->state != RXE_MEM_STATE_VALID)) {
551 rxe_drop_ref(mem);
552 mem = NULL;
555 return mem;