]> git.droids-corp.org - dpdk.git/commitdiff
mem: add length to memseg list
authorAnatoly Burakov <anatoly.burakov@intel.com>
Tue, 2 Oct 2018 13:34:39 +0000 (14:34 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 11 Oct 2018 08:24:16 +0000 (10:24 +0200)
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>
doc/guides/rel_notes/release_18_11.rst
drivers/bus/pci/linux/pci.c
lib/librte_eal/bsdapp/eal/Makefile
lib/librte_eal/bsdapp/eal/eal_memory.c
lib/librte_eal/common/eal_common_memory.c
lib/librte_eal/common/include/rte_eal_memconfig.h
lib/librte_eal/linuxapp/eal/eal_memalloc.c
lib/librte_eal/linuxapp/eal/eal_memory.c

index 2133a5b9bb2e0372c47362c974ede2f3e5de60bf..24803312d4e30d6e4374bdf8c19c03d9d3b89916 100644 (file)
@@ -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
 -------------
index 04648ac9350c5a800d934f59a0a596ba92af5fdc..d6e1027ab78ac23599011eed89a4f180bc1b3e05 100644 (file)
@@ -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;
 
index d27da3d15b5239e9dee120e33d8efe920c1c253d..97bff48529ef2aa94467b1e9f15ddc1cc7ba1181 100644 (file)
@@ -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
index 16d2bc7c305b26dcf44bdc52380b45529fdfcc47..65ea670f94fe3bdc0ef8da0f1e6b6b3c2131cf6f 100644 (file)
@@ -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;
 }
index 0b69804ff86d0ef0158027552724ad86af3ea4ac..30d018209296f717abb2a1bfe3c0d9a11026b964 100644 (file)
@@ -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;
        }
index 62a21c2dca7d3a63130fbf2840caaa9817eb334f..67f4851f3143116a95bf08fa631272ae82e574db 100644 (file)
@@ -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;
 };
 
index b2e2a959936c40f32390390379998dbea1346d5c..71a6e0fd9aac04af2769de1ccd45d312a2182084 100644 (file)
@@ -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;
 }
index 78bfa224161e974dfbc22fd8b2e29e13b609c714..4913fb05e3c038f30bcfc9c1501690f9e9db14dd 100644 (file)
@@ -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;