* Creates a memory region for external memory, that is memory which is not * part of the DPDK memory segments. * * @param pd * Pointer to pd of a device (net, regex, vdpa,...). * @param addr * Starting virtual address of memory. * @param len * Length of memory segment being mapped. * @param socked_id * Socket to allocate heap memory for the control structures. * * @return *
| 1182 | * Pointer to MR structure on success, NULL otherwise. |
| 1183 | */ |
| 1184 | struct mlx5_mr * |
| 1185 | mlx5_create_mr_ext(void *pd, uintptr_t addr, size_t len, int socket_id, |
| 1186 | mlx5_reg_mr_t reg_mr_cb) |
| 1187 | { |
| 1188 | struct mlx5_mr *mr = NULL; |
| 1189 | |
| 1190 | mr = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, |
| 1191 | RTE_ALIGN_CEIL(sizeof(*mr), RTE_CACHE_LINE_SIZE), |
| 1192 | RTE_CACHE_LINE_SIZE, socket_id); |
| 1193 | if (mr == NULL) |
| 1194 | return NULL; |
| 1195 | reg_mr_cb(pd, (void *)addr, len, &mr->pmd_mr); |
| 1196 | if (mr->pmd_mr.obj == NULL) { |
| 1197 | DRV_LOG(WARNING, |
| 1198 | "Fail to create MR for address (%p)", |
| 1199 | (void *)addr); |
| 1200 | mlx5_free(mr); |
| 1201 | return NULL; |
| 1202 | } |
| 1203 | mr->msl = NULL; /* Mark it is external memory. */ |
| 1204 | mr->ms_bmp = NULL; |
| 1205 | mr->ms_n = 1; |
| 1206 | mr->ms_bmp_n = 1; |
| 1207 | DRV_LOG(DEBUG, |
| 1208 | "MR CREATED (%p) for external memory %p:\n" |
| 1209 | " [0x%" PRIxPTR ", 0x%" PRIxPTR ")," |
| 1210 | " lkey=0x%x base_idx=%u ms_n=%u, ms_bmp_n=%u", |
| 1211 | (void *)mr, (void *)addr, |
| 1212 | addr, addr + len, rte_cpu_to_be_32(mr->pmd_mr.lkey), |
| 1213 | mr->ms_base_idx, mr->ms_n, mr->ms_bmp_n); |
| 1214 | return mr; |
| 1215 | } |
| 1216 | |
| 1217 | /** |
| 1218 | * Callback for memory free event. Iterate freed memsegs and check whether it |
no test coverage detected