Lines Matching refs:mr
56 static int clean_mr(struct mlx5_ib_mr *mr);
58 static int destroy_mkey(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) in destroy_mkey() argument
60 int err = mlx5_core_destroy_mkey(dev->mdev, &mr->mmr); in destroy_mkey()
82 struct mlx5_ib_mr *mr = context; in reg_mr_callback() local
83 struct mlx5_ib_dev *dev = mr->dev; in reg_mr_callback()
85 int c = order2idx(dev, mr->order); in reg_mr_callback()
97 kfree(mr); in reg_mr_callback()
103 if (mr->out.hdr.status) { in reg_mr_callback()
105 mr->out.hdr.status, in reg_mr_callback()
106 be32_to_cpu(mr->out.hdr.syndrome)); in reg_mr_callback()
107 kfree(mr); in reg_mr_callback()
116 mr->mmr.key = mlx5_idx_to_mkey(be32_to_cpu(mr->out.mkey) & 0xffffff) | key; in reg_mr_callback()
121 list_add_tail(&mr->list, &ent->head); in reg_mr_callback()
127 err = radix_tree_insert(&table->tree, mlx5_base_mkey(mr->mmr.key), in reg_mr_callback()
128 &mr->mmr); in reg_mr_callback()
139 struct mlx5_ib_mr *mr; in add_keys() local
154 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in add_keys()
155 if (!mr) { in add_keys()
159 mr->order = ent->order; in add_keys()
160 mr->umred = 1; in add_keys()
161 mr->dev = dev; in add_keys()
171 err = mlx5_core_create_mkey(dev->mdev, &mr->mmr, in, in add_keys()
173 mr, &mr->out); in add_keys()
179 kfree(mr); in add_keys()
192 struct mlx5_ib_mr *mr; in remove_keys() local
202 mr = list_first_entry(&ent->head, struct mlx5_ib_mr, list); in remove_keys()
203 list_del(&mr->list); in remove_keys()
207 err = destroy_mkey(dev, mr); in remove_keys()
211 kfree(mr); in remove_keys()
426 struct mlx5_ib_mr *mr = NULL; in alloc_cached_mr() local
444 mr = list_first_entry(&ent->head, struct mlx5_ib_mr, in alloc_cached_mr()
446 list_del(&mr->list); in alloc_cached_mr()
458 if (!mr) in alloc_cached_mr()
461 return mr; in alloc_cached_mr()
464 static void free_cached_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) in free_cached_mr() argument
471 c = order2idx(dev, mr->order); in free_cached_mr()
473 mlx5_ib_warn(dev, "order %d, cache index %d\n", mr->order, c); in free_cached_mr()
478 list_add_tail(&mr->list, &ent->head); in free_cached_mr()
492 struct mlx5_ib_mr *mr; in clean_keys() local
502 mr = list_first_entry(&ent->head, struct mlx5_ib_mr, list); in clean_keys()
503 list_del(&mr->list); in clean_keys()
507 err = destroy_mkey(dev, mr); in clean_keys()
511 kfree(mr); in clean_keys()
641 struct mlx5_ib_mr *mr; in mlx5_ib_get_dma_mr() local
644 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in mlx5_ib_get_dma_mr()
645 if (!mr) in mlx5_ib_get_dma_mr()
660 err = mlx5_core_create_mkey(mdev, &mr->mmr, in, sizeof(*in), NULL, NULL, in mlx5_ib_get_dma_mr()
666 mr->ibmr.lkey = mr->mmr.key; in mlx5_ib_get_dma_mr()
667 mr->ibmr.rkey = mr->mmr.key; in mlx5_ib_get_dma_mr()
668 mr->umem = NULL; in mlx5_ib_get_dma_mr()
670 return &mr->ibmr; in mlx5_ib_get_dma_mr()
676 kfree(mr); in mlx5_ib_get_dma_mr()
769 struct mlx5_ib_mr *mr; in reg_umr() local
779 mr = alloc_cached_mr(dev, order); in reg_umr()
780 if (mr) in reg_umr()
790 if (!mr) in reg_umr()
816 prep_umr_reg_wqe(pd, &umrwr.wr, &sg, dma, npages, mr->mmr.key, in reg_umr()
833 mr->mmr.iova = virt_addr; in reg_umr()
834 mr->mmr.size = len; in reg_umr()
835 mr->mmr.pd = to_mpd(pd)->pdn; in reg_umr()
837 mr->live = 1; in reg_umr()
848 free_cached_mr(dev, mr); in reg_umr()
852 return mr; in reg_umr()
856 int mlx5_ib_update_mtt(struct mlx5_ib_mr *mr, u64 start_page_index, int npages, in mlx5_ib_update_mtt() argument
859 struct mlx5_ib_dev *dev = mr->dev; in mlx5_ib_update_mtt()
863 struct ib_umem *umem = mr->umem; in mlx5_ib_update_mtt()
947 wr.mkey = mr->mmr.key; in mlx5_ib_update_mtt()
984 struct mlx5_ib_mr *mr; in reg_create() local
989 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in reg_create()
990 if (!mr) in reg_create()
1016 err = mlx5_core_create_mkey(dev->mdev, &mr->mmr, in, inlen, NULL, in reg_create()
1022 mr->umem = umem; in reg_create()
1023 mr->dev = dev; in reg_create()
1024 mr->live = 1; in reg_create()
1027 mlx5_ib_dbg(dev, "mkey = 0x%x\n", mr->mmr.key); in reg_create()
1029 return mr; in reg_create()
1035 kfree(mr); in reg_create()
1045 struct mlx5_ib_mr *mr = NULL; in mlx5_ib_reg_user_mr() local
1073 mr = reg_umr(pd, umem, virt_addr, length, ncont, page_shift, in mlx5_ib_reg_user_mr()
1075 if (PTR_ERR(mr) == -EAGAIN) { in mlx5_ib_reg_user_mr()
1077 mr = NULL; in mlx5_ib_reg_user_mr()
1085 if (!mr) in mlx5_ib_reg_user_mr()
1086 mr = reg_create(pd, virt_addr, length, umem, ncont, page_shift, in mlx5_ib_reg_user_mr()
1089 if (IS_ERR(mr)) { in mlx5_ib_reg_user_mr()
1090 err = PTR_ERR(mr); in mlx5_ib_reg_user_mr()
1094 mlx5_ib_dbg(dev, "mkey 0x%x\n", mr->mmr.key); in mlx5_ib_reg_user_mr()
1096 mr->umem = umem; in mlx5_ib_reg_user_mr()
1097 mr->npages = npages; in mlx5_ib_reg_user_mr()
1099 mr->ibmr.lkey = mr->mmr.key; in mlx5_ib_reg_user_mr()
1100 mr->ibmr.rkey = mr->mmr.key; in mlx5_ib_reg_user_mr()
1112 mr->umem->odp_data->private = mr; in mlx5_ib_reg_user_mr()
1127 return &mr->ibmr; in mlx5_ib_reg_user_mr()
1134 static int unreg_umr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) in unreg_umr() argument
1144 prep_umr_unreg_wqe(dev, &umrwr.wr, mr->mmr.key); in unreg_umr()
1170 struct mlx5_ib_mr *mr, in mlx5_alloc_priv_descs() argument
1180 mr->descs_alloc = kzalloc(size + add_size, GFP_KERNEL); in mlx5_alloc_priv_descs()
1181 if (!mr->descs_alloc) in mlx5_alloc_priv_descs()
1184 mr->descs = PTR_ALIGN(mr->descs_alloc, MLX5_UMR_ALIGN); in mlx5_alloc_priv_descs()
1186 mr->desc_map = dma_map_single(device->dma_device, mr->descs, in mlx5_alloc_priv_descs()
1188 if (dma_mapping_error(device->dma_device, mr->desc_map)) { in mlx5_alloc_priv_descs()
1195 kfree(mr->descs_alloc); in mlx5_alloc_priv_descs()
1201 mlx5_free_priv_descs(struct mlx5_ib_mr *mr) in mlx5_free_priv_descs() argument
1203 if (mr->descs) { in mlx5_free_priv_descs()
1204 struct ib_device *device = mr->ibmr.device; in mlx5_free_priv_descs()
1205 int size = mr->max_descs * mr->desc_size; in mlx5_free_priv_descs()
1207 dma_unmap_single(device->dma_device, mr->desc_map, in mlx5_free_priv_descs()
1209 kfree(mr->descs_alloc); in mlx5_free_priv_descs()
1210 mr->descs = NULL; in mlx5_free_priv_descs()
1214 static int clean_mr(struct mlx5_ib_mr *mr) in clean_mr() argument
1216 struct mlx5_ib_dev *dev = to_mdev(mr->ibmr.device); in clean_mr()
1217 int umred = mr->umred; in clean_mr()
1220 if (mr->sig) { in clean_mr()
1222 mr->sig->psv_memory.psv_idx)) in clean_mr()
1224 mr->sig->psv_memory.psv_idx); in clean_mr()
1226 mr->sig->psv_wire.psv_idx)) in clean_mr()
1228 mr->sig->psv_wire.psv_idx); in clean_mr()
1229 kfree(mr->sig); in clean_mr()
1230 mr->sig = NULL; in clean_mr()
1233 mlx5_free_priv_descs(mr); in clean_mr()
1236 err = destroy_mkey(dev, mr); in clean_mr()
1239 mr->mmr.key, err); in clean_mr()
1243 err = unreg_umr(dev, mr); in clean_mr()
1248 free_cached_mr(dev, mr); in clean_mr()
1252 kfree(mr); in clean_mr()
1260 struct mlx5_ib_mr *mr = to_mmr(ibmr); in mlx5_ib_dereg_mr() local
1261 int npages = mr->npages; in mlx5_ib_dereg_mr()
1262 struct ib_umem *umem = mr->umem; in mlx5_ib_dereg_mr()
1267 mr->live = 0; in mlx5_ib_dereg_mr()
1286 clean_mr(mr); in mlx5_ib_dereg_mr()
1302 struct mlx5_ib_mr *mr; in mlx5_ib_alloc_mr() local
1306 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in mlx5_ib_alloc_mr()
1307 if (!mr) in mlx5_ib_alloc_mr()
1325 err = mlx5_alloc_priv_descs(pd->device, mr, in mlx5_ib_alloc_mr()
1330 mr->desc_size = sizeof(u64); in mlx5_ib_alloc_mr()
1331 mr->max_descs = ndescs; in mlx5_ib_alloc_mr()
1338 mr->sig = kzalloc(sizeof(*mr->sig), GFP_KERNEL); in mlx5_ib_alloc_mr()
1339 if (!mr->sig) { in mlx5_ib_alloc_mr()
1351 mr->sig->psv_memory.psv_idx = psv_index[0]; in mlx5_ib_alloc_mr()
1352 mr->sig->psv_wire.psv_idx = psv_index[1]; in mlx5_ib_alloc_mr()
1354 mr->sig->sig_status_checked = true; in mlx5_ib_alloc_mr()
1355 mr->sig->sig_err_exists = false; in mlx5_ib_alloc_mr()
1357 ++mr->sig->sigerr_count; in mlx5_ib_alloc_mr()
1365 err = mlx5_core_create_mkey(dev->mdev, &mr->mmr, in, sizeof(*in), in mlx5_ib_alloc_mr()
1370 mr->ibmr.lkey = mr->mmr.key; in mlx5_ib_alloc_mr()
1371 mr->ibmr.rkey = mr->mmr.key; in mlx5_ib_alloc_mr()
1372 mr->umem = NULL; in mlx5_ib_alloc_mr()
1375 return &mr->ibmr; in mlx5_ib_alloc_mr()
1378 if (mr->sig) { in mlx5_ib_alloc_mr()
1380 mr->sig->psv_memory.psv_idx)) in mlx5_ib_alloc_mr()
1382 mr->sig->psv_memory.psv_idx); in mlx5_ib_alloc_mr()
1384 mr->sig->psv_wire.psv_idx)) in mlx5_ib_alloc_mr()
1386 mr->sig->psv_wire.psv_idx); in mlx5_ib_alloc_mr()
1388 mlx5_free_priv_descs(mr); in mlx5_ib_alloc_mr()
1390 kfree(mr->sig); in mlx5_ib_alloc_mr()
1394 kfree(mr); in mlx5_ib_alloc_mr()
1441 struct mlx5_ib_mr *mr = to_mmr(ibmr); in mlx5_set_page() local
1444 if (unlikely(mr->ndescs == mr->max_descs)) in mlx5_set_page()
1447 descs = mr->descs; in mlx5_set_page()
1448 descs[mr->ndescs++] = cpu_to_be64(addr | MLX5_EN_RD | MLX5_EN_WR); in mlx5_set_page()
1457 struct mlx5_ib_mr *mr = to_mmr(ibmr); in mlx5_ib_map_mr_sg() local
1460 mr->ndescs = 0; in mlx5_ib_map_mr_sg()
1462 ib_dma_sync_single_for_cpu(ibmr->device, mr->desc_map, in mlx5_ib_map_mr_sg()
1463 mr->desc_size * mr->max_descs, in mlx5_ib_map_mr_sg()
1468 ib_dma_sync_single_for_device(ibmr->device, mr->desc_map, in mlx5_ib_map_mr_sg()
1469 mr->desc_size * mr->max_descs, in mlx5_ib_map_mr_sg()