| 1179 | } |
| 1180 | |
| 1181 | struct rte_memseg_list * |
| 1182 | malloc_heap_create_external_seg(void *va_addr, rte_iova_t iova_addrs[], |
| 1183 | unsigned int n_pages, size_t page_sz, const char *seg_name, |
| 1184 | unsigned int socket_id) |
| 1185 | { |
| 1186 | struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; |
| 1187 | char fbarray_name[RTE_FBARRAY_NAME_LEN]; |
| 1188 | struct rte_memseg_list *msl = NULL; |
| 1189 | struct rte_fbarray *arr; |
| 1190 | size_t seg_len = n_pages * page_sz; |
| 1191 | unsigned int i; |
| 1192 | |
| 1193 | /* first, find a free memseg list */ |
| 1194 | for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) { |
| 1195 | struct rte_memseg_list *tmp = &mcfg->memsegs[i]; |
| 1196 | if (tmp->base_va == NULL) { |
| 1197 | msl = tmp; |
| 1198 | break; |
| 1199 | } |
| 1200 | } |
| 1201 | if (msl == NULL) { |
| 1202 | RTE_LOG(ERR, EAL, "Couldn't find empty memseg list\n"); |
| 1203 | rte_errno = ENOSPC; |
| 1204 | return NULL; |
| 1205 | } |
| 1206 | |
| 1207 | snprintf(fbarray_name, sizeof(fbarray_name), "%s_%p", |
| 1208 | seg_name, va_addr); |
| 1209 | |
| 1210 | /* create the backing fbarray */ |
| 1211 | if (rte_fbarray_init(&msl->memseg_arr, fbarray_name, n_pages, |
| 1212 | sizeof(struct rte_memseg)) < 0) { |
| 1213 | RTE_LOG(ERR, EAL, "Couldn't create fbarray backing the memseg list\n"); |
| 1214 | return NULL; |
| 1215 | } |
| 1216 | arr = &msl->memseg_arr; |
| 1217 | |
| 1218 | /* fbarray created, fill it up */ |
| 1219 | for (i = 0; i < n_pages; i++) { |
| 1220 | struct rte_memseg *ms; |
| 1221 | |
| 1222 | rte_fbarray_set_used(arr, i); |
| 1223 | ms = rte_fbarray_get(arr, i); |
| 1224 | ms->addr = RTE_PTR_ADD(va_addr, i * page_sz); |
| 1225 | ms->iova = iova_addrs == NULL ? RTE_BAD_IOVA : iova_addrs[i]; |
| 1226 | ms->hugepage_sz = page_sz; |
| 1227 | ms->len = page_sz; |
| 1228 | ms->nchannel = rte_memory_get_nchannel(); |
| 1229 | ms->nrank = rte_memory_get_nrank(); |
| 1230 | ms->socket_id = socket_id; |
| 1231 | } |
| 1232 | |
| 1233 | /* set up the memseg list */ |
| 1234 | msl->base_va = va_addr; |
| 1235 | msl->page_sz = page_sz; |
| 1236 | msl->socket_id = socket_id; |
| 1237 | msl->len = seg_len; |
| 1238 | msl->version = 0; |
no test coverage detected