mem: add length to memseg list
Previously, to calculate length of memory area covered by a memseg list, we would've needed to multiply page size by length of fbarray backing that memseg list. This is not obvious and unnecessarily low level, so store length in the memseg list itself. This breaks ABI, so bump the EAL ABI version and document the change. Also, while we're breaking ABI, pack the members a little better. Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com> Acked-by: Shreyansh Jain <shreyansh.jain@nxp.com>
This commit is contained in:
parent
850716bc57
commit
4104b2a485
@ -156,6 +156,11 @@ ABI Changes
|
||||
``rte_config`` structure on account of improving DPDK usability when
|
||||
using either ``--legacy-mem`` or ``--single-file-segments`` flags.
|
||||
|
||||
* eal: EAL library ABI version was changed due to previously announced work on
|
||||
supporting external memory in DPDK:
|
||||
- structure ``rte_memseg_list`` now has a new field indicating length
|
||||
of memory addressed by the segment list
|
||||
|
||||
|
||||
Removed Items
|
||||
-------------
|
||||
|
@ -119,7 +119,7 @@ rte_pci_unmap_device(struct rte_pci_device *dev)
|
||||
static int
|
||||
find_max_end_va(const struct rte_memseg_list *msl, void *arg)
|
||||
{
|
||||
size_t sz = msl->memseg_arr.len * msl->page_sz;
|
||||
size_t sz = msl->len;
|
||||
void *end_va = RTE_PTR_ADD(msl->base_va, sz);
|
||||
void **max_va = arg;
|
||||
|
||||
|
@ -22,7 +22,7 @@ LDLIBS += -lrte_kvargs
|
||||
|
||||
EXPORT_MAP := ../../rte_eal_version.map
|
||||
|
||||
LIBABIVER := 8
|
||||
LIBABIVER := 9
|
||||
|
||||
# specific to bsdapp exec-env
|
||||
SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) := eal.c
|
||||
|
@ -79,6 +79,7 @@ rte_eal_hugepage_init(void)
|
||||
}
|
||||
msl->base_va = addr;
|
||||
msl->page_sz = page_sz;
|
||||
msl->len = internal_config.memory;
|
||||
msl->socket_id = 0;
|
||||
|
||||
/* populate memsegs. each memseg is 1 page long */
|
||||
@ -370,6 +371,7 @@ alloc_va_space(struct rte_memseg_list *msl)
|
||||
return -1;
|
||||
}
|
||||
msl->base_va = addr;
|
||||
msl->len = mem_sz;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -171,7 +171,7 @@ virt2memseg(const void *addr, const struct rte_memseg_list *msl)
|
||||
|
||||
/* a memseg list was specified, check if it's the right one */
|
||||
start = msl->base_va;
|
||||
end = RTE_PTR_ADD(start, (size_t)msl->page_sz * msl->memseg_arr.len);
|
||||
end = RTE_PTR_ADD(start, msl->len);
|
||||
|
||||
if (addr < start || addr >= end)
|
||||
return NULL;
|
||||
@ -194,8 +194,7 @@ virt2memseg_list(const void *addr)
|
||||
msl = &mcfg->memsegs[msl_idx];
|
||||
|
||||
start = msl->base_va;
|
||||
end = RTE_PTR_ADD(start,
|
||||
(size_t)msl->page_sz * msl->memseg_arr.len);
|
||||
end = RTE_PTR_ADD(start, msl->len);
|
||||
if (addr >= start && addr < end)
|
||||
break;
|
||||
}
|
||||
|
@ -30,9 +30,10 @@ struct rte_memseg_list {
|
||||
uint64_t addr_64;
|
||||
/**< Makes sure addr is always 64-bits */
|
||||
};
|
||||
int socket_id; /**< Socket ID for all memsegs in this list. */
|
||||
uint64_t page_sz; /**< Page size for all memsegs in this list. */
|
||||
int socket_id; /**< Socket ID for all memsegs in this list. */
|
||||
volatile uint32_t version; /**< version number for multiprocess sync. */
|
||||
size_t len; /**< Length of memory area covered by this memseg list. */
|
||||
struct rte_fbarray memseg_arr;
|
||||
};
|
||||
|
||||
|
@ -986,7 +986,7 @@ free_seg_walk(const struct rte_memseg_list *msl, void *arg)
|
||||
int msl_idx, seg_idx, ret, dir_fd = -1;
|
||||
|
||||
start_addr = (uintptr_t) msl->base_va;
|
||||
end_addr = start_addr + msl->memseg_arr.len * (size_t)msl->page_sz;
|
||||
end_addr = start_addr + msl->len;
|
||||
|
||||
if ((uintptr_t)wa->ms->addr < start_addr ||
|
||||
(uintptr_t)wa->ms->addr >= end_addr)
|
||||
@ -1472,6 +1472,7 @@ secondary_msl_create_walk(const struct rte_memseg_list *msl,
|
||||
return -1;
|
||||
}
|
||||
local_msl->base_va = primary_msl->base_va;
|
||||
local_msl->len = primary_msl->len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -863,6 +863,7 @@ alloc_va_space(struct rte_memseg_list *msl)
|
||||
return -1;
|
||||
}
|
||||
msl->base_va = addr;
|
||||
msl->len = mem_sz;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1371,6 +1372,7 @@ eal_legacy_hugepage_init(void)
|
||||
msl->base_va = addr;
|
||||
msl->page_sz = page_sz;
|
||||
msl->socket_id = 0;
|
||||
msl->len = internal_config.memory;
|
||||
|
||||
/* populate memsegs. each memseg is one page long */
|
||||
for (cur_seg = 0; cur_seg < n_segs; cur_seg++) {
|
||||
@ -1617,7 +1619,7 @@ eal_legacy_hugepage_init(void)
|
||||
if (msl->memseg_arr.count > 0)
|
||||
continue;
|
||||
/* this is an unused list, deallocate it */
|
||||
mem_sz = (size_t)msl->page_sz * msl->memseg_arr.len;
|
||||
mem_sz = msl->len;
|
||||
munmap(msl->base_va, mem_sz);
|
||||
msl->base_va = NULL;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user