DPDK patches and discussions
 help / color / mirror / Atom feed
From: Anatoly Burakov <anatoly.burakov@intel.com>
To: dev@dpdk.org
Cc: Thomas Monjalon <thomas@monjalon.net>,
	Yuanhan Liu <yliu@fridaylinux.org>,
	 Maxime Coquelin <maxime.coquelin@redhat.com>,
	Tiwei Bie <tiwei.bie@intel.com>,
	keith.wiles@intel.com, jianfeng.tan@intel.com,
	andras.kovacs@ericsson.com, laszlo.vadkeri@ericsson.com,
	benjamin.walker@intel.com, bruce.richardson@intel.com,
	konstantin.ananyev@intel.com,
	kuralamudhan.ramakrishnan@intel.com, louise.m.daly@intel.com,
	nelio.laranjeiro@6wind.com, yskoh@mellanox.com, pepperjo@japf.ch,
	jerin.jacob@caviumnetworks.com, hemant.agrawal@nxp.com,
	olivier.matz@6wind.com
Subject: [dpdk-dev] [PATCH 13/41] eal: replace memseg with memseg lists
Date: Sat,  3 Mar 2018 13:46:01 +0000	[thread overview]
Message-ID: <18f4ee0ba172f3bb80608694eb283cd496930675.1520083504.git.anatoly.burakov@intel.com> (raw)
In-Reply-To: <cover.1520083504.git.anatoly.burakov@intel.com>
In-Reply-To: <cover.1520083504.git.anatoly.burakov@intel.com>

Before, we were aggregating multiple pages into one memseg, so the
number of memsegs was small. Now, each page gets its own memseg,
so the list of memsegs is huge. To accommodate the new memseg list
size and to keep the under-the-hood workings sane, the memseg list
is now not just a single list, but multiple lists. To be precise,
each hugepage size available on the system gets one or more memseg
lists, per socket.

In order to support dynamic memory allocation, we reserve all
memory in advance. As in, we do an anonymous mmap() of the entire
maximum size of memory per hugepage size, per socket (which is
limited to either RTE_MAX_MEMSEG_PER_TYPE pages or
RTE_MAX_MEM_PER_TYPE gigabytes worth of memory, whichever is the
smaller one), split over multiple lists (which are limited to
either RTE_MAX_MEMSEG_PER_LIST memsegs or RTE_MAX_MEM_PER_LIST
gigabytes per list, whichever is the smaller one).

So, for each hugepage size, we get (by default) up to 128G worth
of memory, per socket, split into chunks of up to 32G in size.
The address space is claimed at the start, in eal_common_memory.c.
The actual page allocation code is in eal_memalloc.c (Linux-only
for now), and largely consists of copied EAL memory init code.

Pages in the list are also indexed by address. That is, for
non-legacy mode, in order to figure out where the page belongs,
one can simply look at base address for a memseg list. Similarly,
figuring out IOVA address of a memzone is a matter of finding the
right memseg list, getting offset and dividing by page size to get
the appropriate memseg. For legacy mode, old behavior of walking
the memseg list remains.

Due to switch to fbarray and to avoid any intrusive changes,
secondary processes are not supported in this commit. Also, one
particular API call (dump physmem layout) no longer makes sense
and was removed, according to deprecation notice [1].

In legacy mode, nothing is preallocated, and all memsegs are in
a list like before, but each segment still resides in an appropriate
memseg list.

The rest of the changes are really ripple effects from the memseg
change - heap changes, compile fixes, and rewrites to support
fbarray-backed memseg lists.

[1] http://dpdk.org/dev/patchwork/patch/34002/

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 config/common_base                                |  15 +-
 drivers/bus/pci/linux/pci.c                       |  29 +-
 drivers/net/virtio/virtio_user/vhost_kernel.c     | 108 +++++---
 lib/librte_eal/common/eal_common_memory.c         | 322 +++++++++++++++++++---
 lib/librte_eal/common/eal_common_memzone.c        |  12 +-
 lib/librte_eal/common/eal_hugepages.h             |   2 +
 lib/librte_eal/common/eal_internal_cfg.h          |   2 +-
 lib/librte_eal/common/include/rte_eal_memconfig.h |  22 +-
 lib/librte_eal/common/include/rte_memory.h        |  33 ++-
 lib/librte_eal/common/include/rte_memzone.h       |   1 -
 lib/librte_eal/common/malloc_elem.c               |   8 +-
 lib/librte_eal/common/malloc_elem.h               |   6 +-
 lib/librte_eal/common/malloc_heap.c               |  92 +++++--
 lib/librte_eal/common/rte_malloc.c                |  22 +-
 lib/librte_eal/linuxapp/eal/eal.c                 |  21 +-
 lib/librte_eal/linuxapp/eal/eal_memory.c          | 297 +++++++++++++-------
 lib/librte_eal/linuxapp/eal/eal_vfio.c            | 164 +++++++----
 lib/librte_eal/rte_eal_version.map                |   3 +-
 test/test/test_malloc.c                           |  29 +-
 test/test/test_memory.c                           |  43 ++-
 test/test/test_memzone.c                          |  17 +-
 21 files changed, 917 insertions(+), 331 deletions(-)

diff --git a/config/common_base b/config/common_base
index ad03cf4..e9c1d93 100644
--- a/config/common_base
+++ b/config/common_base
@@ -61,7 +61,20 @@ CONFIG_RTE_CACHE_LINE_SIZE=64
 CONFIG_RTE_LIBRTE_EAL=y
 CONFIG_RTE_MAX_LCORE=128
 CONFIG_RTE_MAX_NUMA_NODES=8
-CONFIG_RTE_MAX_MEMSEG=256
+CONFIG_RTE_MAX_MEMSEG_LISTS=32
+# each memseg list will be limited to either RTE_MAX_MEMSEG_PER_LIST pages
+# or RTE_MAX_MEM_PER_LIST gigabytes worth of memory, whichever is the smallest
+CONFIG_RTE_MAX_MEMSEG_PER_LIST=8192
+CONFIG_RTE_MAX_MEM_PER_LIST=32
+# a "type" is a combination of page size and NUMA node. total number of memseg
+# lists per type will be limited to either RTE_MAX_MEMSEG_PER_TYPE pages (split
+# over multiple lists of RTE_MAX_MEMSEG_PER_LIST pages), or RTE_MAX_MEM_PER_TYPE
+# gigabytes of memory (split over multiple lists of RTE_MAX_MEM_PER_LIST),
+# whichever is the smallest
+CONFIG_RTE_MAX_MEMSEG_PER_TYPE=32768
+CONFIG_RTE_MAX_MEM_PER_TYPE=128
+# legacy mem mode only
+CONFIG_RTE_MAX_LEGACY_MEMSEG=256
 CONFIG_RTE_MAX_MEMZONE=2560
 CONFIG_RTE_MAX_TAILQ=32
 CONFIG_RTE_ENABLE_ASSERT=n
diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c
index abde641..ec05d7c 100644
--- a/drivers/bus/pci/linux/pci.c
+++ b/drivers/bus/pci/linux/pci.c
@@ -119,19 +119,30 @@ rte_pci_unmap_device(struct rte_pci_device *dev)
 void *
 pci_find_max_end_va(void)
 {
-	const struct rte_memseg *seg = rte_eal_get_physmem_layout();
-	const struct rte_memseg *last = seg;
-	unsigned i = 0;
+	void *cur_end, *max_end = NULL;
+	int i = 0;
 
-	for (i = 0; i < RTE_MAX_MEMSEG; i++, seg++) {
-		if (seg->addr == NULL)
-			break;
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
+		struct rte_mem_config *mcfg =
+				rte_eal_get_configuration()->mem_config;
+		struct rte_memseg_list *msl = &mcfg->memsegs[i];
+		struct rte_fbarray *arr = &msl->memseg_arr;
 
-		if (seg->addr > last->addr)
-			last = seg;
+		if (arr->count == 0)
+			continue;
 
+		/*
+		 * we need to handle legacy mem case, so don't rely on page size
+		 * to calculate max VA end
+		 */
+		while ((i = rte_fbarray_find_next_used(arr, i)) >= 0) {
+			struct rte_memseg *ms = rte_fbarray_get(arr, i);
+			cur_end = RTE_PTR_ADD(ms->addr, ms->len);
+			if (cur_end > max_end)
+				max_end = cur_end;
+		}
 	}
-	return RTE_PTR_ADD(last->addr, last->len);
+	return max_end;
 }
 
 /* parse one line of the "resource" sysfs file (note that the 'line'
diff --git a/drivers/net/virtio/virtio_user/vhost_kernel.c b/drivers/net/virtio/virtio_user/vhost_kernel.c
index 8d0a1ab..23c5e1c 100644
--- a/drivers/net/virtio/virtio_user/vhost_kernel.c
+++ b/drivers/net/virtio/virtio_user/vhost_kernel.c
@@ -70,6 +70,42 @@ static uint64_t vhost_req_user_to_kernel[] = {
 	[VHOST_USER_SET_MEM_TABLE] = VHOST_SET_MEM_TABLE,
 };
 
+/* returns number of segments processed */
+static int
+add_memory_region(struct vhost_memory_region *mr, struct rte_fbarray *arr,
+		int reg_start_idx, int max)
+{
+	const struct rte_memseg *ms;
+	void *start_addr, *expected_addr;
+	uint64_t len;
+	int idx;
+
+	idx = reg_start_idx;
+	len = 0;
+	start_addr = NULL;
+	expected_addr = NULL;
+
+	/* we could've relied on page size, but we have to support legacy mem */
+	while (idx < max) {
+		ms = rte_fbarray_get(arr, idx);
+		if (expected_addr == NULL) {
+			start_addr = ms->addr;
+			expected_addr = RTE_PTR_ADD(ms->addr, ms->len);
+		} else if (ms->addr != expected_addr) {
+			break;
+		}
+		len += ms->len;
+		idx++;
+	}
+
+	mr->guest_phys_addr = (uint64_t)(uintptr_t)start_addr;
+	mr->userspace_addr = (uint64_t)(uintptr_t)start_addr;
+	mr->memory_size = len;
+	mr->mmap_offset = 0;
+
+	return idx;
+}
+
 /* By default, vhost kernel module allows 64 regions, but DPDK allows
  * 256 segments. As a relief, below function merges those virtually
  * adjacent memsegs into one region.
@@ -77,8 +113,7 @@ static uint64_t vhost_req_user_to_kernel[] = {
 static struct vhost_memory_kernel *
 prepare_vhost_memory_kernel(void)
 {
-	uint32_t i, j, k = 0;
-	struct rte_memseg *seg;
+	uint32_t list_idx, region_nr = 0;
 	struct vhost_memory_region *mr;
 	struct vhost_memory_kernel *vm;
 
@@ -88,52 +123,41 @@ prepare_vhost_memory_kernel(void)
 	if (!vm)
 		return NULL;
 
-	for (i = 0; i < RTE_MAX_MEMSEG; ++i) {
-		seg = &rte_eal_get_configuration()->mem_config->memseg[i];
-		if (!seg->addr)
-			break;
-
-		int new_region = 1;
+	for (list_idx = 0; list_idx < RTE_MAX_MEMSEG_LISTS; ++list_idx) {
+		struct rte_mem_config *mcfg =
+				rte_eal_get_configuration()->mem_config;
+		struct rte_memseg_list *msl = &mcfg->memsegs[list_idx];
+		struct rte_fbarray *arr = &msl->memseg_arr;
+		int reg_start_idx, search_idx;
 
-		for (j = 0; j < k; ++j) {
-			mr = &vm->regions[j];
-
-			if (mr->userspace_addr + mr->memory_size ==
-			    (uint64_t)(uintptr_t)seg->addr) {
-				mr->memory_size += seg->len;
-				new_region = 0;
-				break;
-			}
-
-			if ((uint64_t)(uintptr_t)seg->addr + seg->len ==
-			    mr->userspace_addr) {
-				mr->guest_phys_addr =
-					(uint64_t)(uintptr_t)seg->addr;
-				mr->userspace_addr =
-					(uint64_t)(uintptr_t)seg->addr;
-				mr->memory_size += seg->len;
-				new_region = 0;
-				break;
-			}
-		}
-
-		if (new_region == 0)
+		/* skip empty segment lists */
+		if (arr->count == 0)
 			continue;
 
-		mr = &vm->regions[k++];
-		/* use vaddr here! */
-		mr->guest_phys_addr = (uint64_t)(uintptr_t)seg->addr;
-		mr->userspace_addr = (uint64_t)(uintptr_t)seg->addr;
-		mr->memory_size = seg->len;
-		mr->mmap_offset = 0;
-
-		if (k >= max_regions) {
-			free(vm);
-			return NULL;
+		search_idx = 0;
+		while ((reg_start_idx = rte_fbarray_find_next_used(arr,
+				search_idx)) >= 0) {
+			int reg_n_pages;
+			if (region_nr >= max_regions) {
+				free(vm);
+				return NULL;
+			}
+			mr = &vm->regions[region_nr++];
+
+			/*
+			 * we know memseg starts at search_idx, check how many
+			 * segments there are
+			 */
+			reg_n_pages = rte_fbarray_find_contig_used(arr,
+					search_idx);
+
+			/* look at at most reg_n_pages of memsegs */
+			search_idx = add_memory_region(mr, arr, reg_start_idx,
+					search_idx + reg_n_pages);
 		}
 	}
 
-	vm->nregions = k;
+	vm->nregions = region_nr;
 	vm->padding = 0;
 	return vm;
 }
diff --git a/lib/librte_eal/common/eal_common_memory.c b/lib/librte_eal/common/eal_common_memory.c
index 042881b..457e239 100644
--- a/lib/librte_eal/common/eal_common_memory.c
+++ b/lib/librte_eal/common/eal_common_memory.c
@@ -13,6 +13,7 @@
 #include <sys/mman.h>
 #include <sys/queue.h>
 
+#include <rte_fbarray.h>
 #include <rte_memory.h>
 #include <rte_eal.h>
 #include <rte_eal_memconfig.h>
@@ -30,6 +31,8 @@
  * which is a multiple of hugepage size.
  */
 
+#define MEMSEG_LIST_FMT "memseg-%luk-%i-%i"
+
 static uint64_t baseaddr_offset;
 static uint64_t system_page_sz;
 
@@ -120,15 +123,245 @@ eal_get_virtual_area(void *requested_addr, uint64_t *size,
 	return aligned_addr;
 }
 
-/*
- * Return a pointer to a read-only table of struct rte_physmem_desc
- * elements, containing the layout of all addressable physical
- * memory. The last element of the table contains a NULL address.
- */
-const struct rte_memseg *
-rte_eal_get_physmem_layout(void)
+static uint64_t
+get_mem_amount(uint64_t page_sz)
+{
+	uint64_t area_sz, max_pages;
+
+	max_pages = internal_config.legacy_mem || internal_config.no_hugetlbfs ?
+			RTE_MAX_LEGACY_MEMSEG : RTE_MAX_MEMSEG_PER_LIST;
+
+	/* limit to RTE_MAX_MEMSEG_PER_LIST pages or RTE_MAX_MEM_PER_LIST GB */
+	area_sz = RTE_MIN(page_sz * max_pages,
+			(uint64_t) RTE_MAX_MEM_PER_LIST << 30);
+	/* make sure the list isn't smaller than the page size */
+	area_sz = RTE_MAX(area_sz, page_sz);
+
+	return rte_align64pow2(area_sz);
+}
+
+static int
+alloc_memseg_list(struct rte_memseg_list *msl, uint64_t page_sz,
+		int socket_id, int type_msl_idx)
+{
+	char name[RTE_FBARRAY_NAME_LEN];
+	int max_pages;
+	uint64_t mem_amount;
+	void *addr;
+
+	if (!internal_config.legacy_mem) {
+		mem_amount = get_mem_amount(page_sz);
+		max_pages = mem_amount / page_sz;
+
+		addr = eal_get_virtual_area(NULL, &mem_amount, page_sz, 0, 0);
+		if (addr == NULL) {
+			RTE_LOG(ERR, EAL, "Cannot reserve memory\n");
+			return -1;
+		}
+	} else {
+		addr = NULL;
+		/* numer of memsegs in each list, these will not be single-page
+		 * segments, so RTE_MAX_LEGACY_MEMSEG is like old default.
+		 */
+		max_pages = RTE_MAX_LEGACY_MEMSEG;
+	}
+
+	snprintf(name, sizeof(name), MEMSEG_LIST_FMT, page_sz >> 10, socket_id,
+		 type_msl_idx);
+	if (rte_fbarray_init(&msl->memseg_arr, name, max_pages,
+			sizeof(struct rte_memseg))) {
+		RTE_LOG(ERR, EAL, "Cannot allocate memseg list: %s\n",
+			rte_strerror(rte_errno));
+		return -1;
+	}
+
+	msl->hugepage_sz = page_sz;
+	msl->socket_id = socket_id;
+	msl->base_va = addr;
+
+	RTE_LOG(DEBUG, EAL, "Memseg list allocated: 0x%zxkB at socket %i\n",
+			page_sz >> 10, socket_id);
+
+	return 0;
+}
+
+static int
+memseg_init(void)
 {
-	return rte_eal_get_configuration()->mem_config->memseg;
+	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+	int socket_id, hpi_idx, msl_idx = 0;
+	struct rte_memseg_list *msl;
+
+	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
+		RTE_LOG(ERR, EAL, "Secondary process not supported\n");
+		return -1;
+	}
+
+	/* create memseg lists */
+	for (hpi_idx = 0; hpi_idx < (int) internal_config.num_hugepage_sizes;
+			hpi_idx++) {
+		struct hugepage_info *hpi;
+		uint64_t hugepage_sz;
+
+		hpi = &internal_config.hugepage_info[hpi_idx];
+		hugepage_sz = hpi->hugepage_sz;
+
+		for (socket_id = 0; socket_id < (int) rte_num_sockets();
+				socket_id++) {
+			uint64_t max_mem, total_mem = 0;
+			int type_msl_idx, max_segs, total_segs = 0;
+
+			max_mem = (uint64_t)RTE_MAX_MEM_PER_TYPE << 30;
+			/* no-huge behaves the same as legacy */
+			max_segs = internal_config.legacy_mem ||
+					internal_config.no_hugetlbfs ?
+					RTE_MAX_LEGACY_MEMSEG :
+					RTE_MAX_MEMSEG_PER_TYPE;
+
+			type_msl_idx = 0;
+			while (total_mem < max_mem && total_segs < max_segs) {
+				if (msl_idx >= RTE_MAX_MEMSEG_LISTS) {
+					RTE_LOG(ERR, EAL,
+						"No more space in memseg lists, please increase CONFIG_RTE_MAX_MEMSEG_LISTS\n");
+					return -1;
+				}
+
+				msl = &mcfg->memsegs[msl_idx++];
+
+				if (alloc_memseg_list(msl, hugepage_sz,
+						socket_id, type_msl_idx))
+					return -1;
+
+				total_segs += msl->memseg_arr.len;
+				total_mem = total_segs * msl->hugepage_sz;
+				type_msl_idx++;
+			}
+		}
+	}
+	return 0;
+}
+
+static struct rte_memseg *
+virt2memseg(const void *addr, const struct rte_memseg_list *msl)
+{
+	const struct rte_fbarray *arr;
+	int ms_idx;
+
+	/* a memseg list was specified, check if it's the right one */
+	void *start, *end;
+	start = msl->base_va;
+	end = RTE_PTR_ADD(start, msl->hugepage_sz *
+			msl->memseg_arr.len);
+
+	if (addr < start || addr >= end)
+		return NULL;
+
+	/* now, calculate index */
+	arr = &msl->memseg_arr;
+	ms_idx = RTE_PTR_DIFF(addr, msl->base_va) / msl->hugepage_sz;
+	return rte_fbarray_get(arr, ms_idx);
+}
+
+static struct rte_memseg_list *
+virt2memseg_list(const void *addr)
+{
+	struct rte_mem_config *mcfg =
+		rte_eal_get_configuration()->mem_config;
+	struct rte_memseg_list *msl;
+	int msl_idx;
+
+	for (msl_idx = 0; msl_idx < RTE_MAX_MEMSEG_LISTS; msl_idx++) {
+		void *start, *end;
+		msl = &mcfg->memsegs[msl_idx];
+
+		start = msl->base_va;
+		end = RTE_PTR_ADD(start, msl->hugepage_sz *
+				msl->memseg_arr.len);
+		if (addr >= start && addr < end)
+			break;
+	}
+	/* if we didn't find our memseg list */
+	if (msl_idx == RTE_MAX_MEMSEG_LISTS)
+		return NULL;
+	return msl;
+}
+
+static struct rte_memseg_list *
+virt2memseg_list_legacy(const void *addr)
+{
+	struct rte_mem_config *mcfg =
+		rte_eal_get_configuration()->mem_config;
+	struct rte_memseg_list *msl;
+	struct rte_fbarray *arr;
+	int msl_idx, ms_idx;
+	for (msl_idx = 0; msl_idx < RTE_MAX_MEMSEG_LISTS; msl_idx++) {
+		msl = &mcfg->memsegs[msl_idx];
+		arr = &msl->memseg_arr;
+
+		ms_idx = 0;
+		while ((ms_idx =
+				rte_fbarray_find_next_used(arr, ms_idx)) >= 0) {
+			const struct rte_memseg *ms;
+			void *start, *end;
+			ms = rte_fbarray_get(arr, ms_idx);
+			start = ms->addr;
+			end = RTE_PTR_ADD(start, ms->len);
+			if (addr >= start && addr < end)
+				return msl;
+			ms_idx++;
+		}
+	}
+	return NULL;
+}
+
+static struct rte_memseg *
+virt2memseg_legacy(const void *addr)
+{
+	struct rte_mem_config *mcfg =
+		rte_eal_get_configuration()->mem_config;
+	struct rte_memseg_list *msl;
+	struct rte_fbarray *arr;
+	int msl_idx, ms_idx;
+	for (msl_idx = 0; msl_idx < RTE_MAX_MEMSEG_LISTS; msl_idx++) {
+		msl = &mcfg->memsegs[msl_idx];
+		arr = &msl->memseg_arr;
+
+		ms_idx = 0;
+		while ((ms_idx =
+				rte_fbarray_find_next_used(arr, ms_idx)) >= 0) {
+			struct rte_memseg *ms;
+			void *start, *end;
+			ms = rte_fbarray_get(arr, ms_idx);
+			start = ms->addr;
+			end = RTE_PTR_ADD(start, ms->len);
+			if (addr >= start && addr < end)
+				return ms;
+			ms_idx++;
+		}
+	}
+	return NULL;
+}
+
+struct rte_memseg_list *
+rte_mem_virt2memseg_list(const void *addr)
+{
+	/* for legacy memory, we just walk the list, like in the old days. */
+	if (internal_config.legacy_mem)
+		return virt2memseg_list_legacy(addr);
+	else
+		return virt2memseg_list(addr);
+}
+
+struct rte_memseg *
+rte_mem_virt2memseg(const void *addr, const struct rte_memseg_list *msl)
+{
+	/* for legacy memory, we just walk the list, like in the old days. */
+	if (internal_config.legacy_mem)
+		/* ignore msl value */
+		return virt2memseg_legacy(addr);
+
+	return virt2memseg(addr, msl != NULL ? msl :
+			rte_mem_virt2memseg_list(addr));
 }
 
 
@@ -136,18 +369,32 @@ rte_eal_get_physmem_layout(void)
 uint64_t
 rte_eal_get_physmem_size(void)
 {
-	const struct rte_mem_config *mcfg;
+	struct rte_mem_config *mcfg;
 	unsigned i = 0;
 	uint64_t total_len = 0;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
 
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (mcfg->memseg[i].addr == NULL)
-			break;
-
-		total_len += mcfg->memseg[i].len;
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
+		struct rte_memseg_list *msl = &mcfg->memsegs[i];
+
+		if (msl->memseg_arr.count == 0)
+			continue;
+
+		/* for legacy mem mode, walk the memsegs */
+		if (internal_config.legacy_mem) {
+			struct rte_fbarray *arr = &msl->memseg_arr;
+			int ms_idx = 0;
+
+			while ((ms_idx = rte_fbarray_find_next_used(arr,
+					ms_idx) >= 0)) {
+				const struct rte_memseg *ms =
+						rte_fbarray_get(arr, ms_idx);
+				total_len += ms->len;
+			}
+		} else
+			total_len += msl->hugepage_sz * msl->memseg_arr.count;
 	}
 
 	return total_len;
@@ -157,27 +404,35 @@ rte_eal_get_physmem_size(void)
 void
 rte_dump_physmem_layout(FILE *f)
 {
-	const struct rte_mem_config *mcfg;
+	struct rte_mem_config *mcfg;
 	unsigned i = 0;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
 
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (mcfg->memseg[i].addr == NULL)
-			break;
-
-		fprintf(f, "Segment %u: IOVA:0x%"PRIx64", len:%zu, "
-		       "virt:%p, socket_id:%"PRId32", "
-		       "hugepage_sz:%"PRIu64", nchannel:%"PRIx32", "
-		       "nrank:%"PRIx32"\n", i,
-		       mcfg->memseg[i].iova,
-		       mcfg->memseg[i].len,
-		       mcfg->memseg[i].addr,
-		       mcfg->memseg[i].socket_id,
-		       mcfg->memseg[i].hugepage_sz,
-		       mcfg->memseg[i].nchannel,
-		       mcfg->memseg[i].nrank);
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
+		struct rte_memseg_list *msl = &mcfg->memsegs[i];
+		struct rte_fbarray *arr = &msl->memseg_arr;
+		int m_idx = 0;
+
+		if (arr->count == 0)
+			continue;
+
+		while ((m_idx = rte_fbarray_find_next_used(arr, m_idx)) >= 0) {
+			struct rte_memseg *ms = rte_fbarray_get(arr, m_idx);
+			fprintf(f, "Page %u-%u: iova:0x%"PRIx64", len:%zu, "
+			       "virt:%p, socket_id:%"PRId32", "
+			       "hugepage_sz:%"PRIu64", nchannel:%"PRIx32", "
+			       "nrank:%"PRIx32"\n", i, m_idx,
+			       ms->iova,
+			       ms->len,
+			       ms->addr,
+			       ms->socket_id,
+			       ms->hugepage_sz,
+			       ms->nchannel,
+			       ms->nrank);
+			m_idx++;
+		}
 	}
 }
 
@@ -222,9 +477,14 @@ rte_mem_lock_page(const void *virt)
 int
 rte_eal_memory_init(void)
 {
+	int retval;
 	RTE_LOG(DEBUG, EAL, "Setting up physically contiguous memory...\n");
 
-	const int retval = rte_eal_process_type() == RTE_PROC_PRIMARY ?
+	retval = memseg_init();
+	if (retval < 0)
+		return -1;
+
+	retval = rte_eal_process_type() == RTE_PROC_PRIMARY ?
 			rte_eal_hugepage_init() :
 			rte_eal_hugepage_attach();
 	if (retval < 0)
diff --git a/lib/librte_eal/common/eal_common_memzone.c b/lib/librte_eal/common/eal_common_memzone.c
index 1ab3ade..ed36174 100644
--- a/lib/librte_eal/common/eal_common_memzone.c
+++ b/lib/librte_eal/common/eal_common_memzone.c
@@ -226,10 +226,9 @@ memzone_reserve_aligned_thread_unsafe(const char *name, size_t len,
 	mz->iova = rte_malloc_virt2iova(mz_addr);
 	mz->addr = mz_addr;
 	mz->len = (requested_len == 0 ? elem->size : requested_len);
-	mz->hugepage_sz = elem->ms->hugepage_sz;
-	mz->socket_id = elem->ms->socket_id;
+	mz->hugepage_sz = elem->msl->hugepage_sz;
+	mz->socket_id = elem->msl->socket_id;
 	mz->flags = 0;
-	mz->memseg_id = elem->ms - rte_eal_get_configuration()->mem_config->memseg;
 
 	return mz;
 }
@@ -382,7 +381,6 @@ int
 rte_eal_memzone_init(void)
 {
 	struct rte_mem_config *mcfg;
-	const struct rte_memseg *memseg;
 
 	/* get pointer to global configuration */
 	mcfg = rte_eal_get_configuration()->mem_config;
@@ -391,12 +389,6 @@ rte_eal_memzone_init(void)
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY)
 		return 0;
 
-	memseg = rte_eal_get_physmem_layout();
-	if (memseg == NULL) {
-		RTE_LOG(ERR, EAL, "%s(): Cannot get physical layout\n", __func__);
-		return -1;
-	}
-
 	rte_rwlock_write_lock(&mcfg->mlock);
 
 	/* delete all zones */
diff --git a/lib/librte_eal/common/eal_hugepages.h b/lib/librte_eal/common/eal_hugepages.h
index 1d519bb..f963ae5 100644
--- a/lib/librte_eal/common/eal_hugepages.h
+++ b/lib/librte_eal/common/eal_hugepages.h
@@ -23,6 +23,8 @@ struct hugepage_file {
 	int socket_id;      /**< NUMA socket ID */
 	int file_id;        /**< the '%d' in HUGEFILE_FMT */
 	int memseg_id;      /**< the memory segment to which page belongs */
+	int memseg_list_id;
+	/**< the memory segment list to which page belongs */
 	char filepath[MAX_HUGEPAGE_PATH]; /**< path to backing file on filesystem */
 };
 
diff --git a/lib/librte_eal/common/eal_internal_cfg.h b/lib/librte_eal/common/eal_internal_cfg.h
index c8a0676..eea8b66 100644
--- a/lib/librte_eal/common/eal_internal_cfg.h
+++ b/lib/librte_eal/common/eal_internal_cfg.h
@@ -23,7 +23,7 @@ struct hugepage_info {
 	uint64_t hugepage_sz;   /**< size of a huge page */
 	const char *hugedir;    /**< dir where hugetlbfs is mounted */
 	uint32_t num_pages[RTE_MAX_NUMA_NODES];
-				/**< number of hugepages of that size on each socket */
+	/**< number of hugepages of that size on each socket */
 	int lock_descriptor;    /**< file descriptor for hugepage dir */
 };
 
diff --git a/lib/librte_eal/common/include/rte_eal_memconfig.h b/lib/librte_eal/common/include/rte_eal_memconfig.h
index 29fa0b6..31fc8e7 100644
--- a/lib/librte_eal/common/include/rte_eal_memconfig.h
+++ b/lib/librte_eal/common/include/rte_eal_memconfig.h
@@ -12,12 +12,30 @@
 #include <rte_malloc_heap.h>
 #include <rte_rwlock.h>
 #include <rte_pause.h>
+#include <rte_fbarray.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 /**
+ * memseg list is a special case as we need to store a bunch of other data
+ * together with the array itself.
+ */
+struct rte_memseg_list {
+	RTE_STD_C11
+	union {
+		void *base_va;
+		/**< Base virtual address for this 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 hugepage_sz; /**< page size for all memsegs in this list. */
+	struct rte_fbarray memseg_arr;
+};
+
+/**
  * the structure for the memory configuration for the RTE.
  * Used by the rte_config structure. It is separated out, as for multi-process
  * support, the memory details should be shared across instances
@@ -43,9 +61,11 @@ struct rte_mem_config {
 	uint32_t memzone_cnt; /**< Number of allocated memzones */
 
 	/* memory segments and zones */
-	struct rte_memseg memseg[RTE_MAX_MEMSEG];    /**< Physmem descriptors. */
 	struct rte_memzone memzone[RTE_MAX_MEMZONE]; /**< Memzone descriptors. */
 
+	struct rte_memseg_list memsegs[RTE_MAX_MEMSEG_LISTS];
+	/**< list of dynamic arrays holding memsegs */
+
 	struct rte_tailq_head tailq_head[RTE_MAX_TAILQ]; /**< Tailqs for objects */
 
 	/* Heaps of Malloc per socket */
diff --git a/lib/librte_eal/common/include/rte_memory.h b/lib/librte_eal/common/include/rte_memory.h
index 302f865..674d4cb 100644
--- a/lib/librte_eal/common/include/rte_memory.h
+++ b/lib/librte_eal/common/include/rte_memory.h
@@ -22,6 +22,9 @@ extern "C" {
 #include <rte_common.h>
 #include <rte_config.h>
 
+/* forward declaration for pointers */
+struct rte_memseg_list;
+
 __extension__
 enum rte_page_sizes {
 	RTE_PGSIZE_4K    = 1ULL << 12,
@@ -130,21 +133,27 @@ phys_addr_t rte_mem_virt2phy(const void *virt);
 rte_iova_t rte_mem_virt2iova(const void *virt);
 
 /**
- * Get the layout of the available physical memory.
+ * Get memseg corresponding to virtual memory address.
  *
- * It can be useful for an application to have the full physical
- * memory layout to decide the size of a memory zone to reserve. This
- * table is stored in rte_config (see rte_eal_get_configuration()).
+ * @param virt
+ *   The virtual address.
+ * @param msl
+ *   Memseg list in which to look for memsegs (can be NULL).
+ * @return
+ *   Memseg to which this virtual address belongs to.
+ */
+struct rte_memseg *rte_mem_virt2memseg(const void *virt,
+		const struct rte_memseg_list *msl);
+
+/**
+ * Get memseg list corresponding to virtual memory address.
  *
+ * @param virt
+ *   The virtual address.
  * @return
- *  - On success, return a pointer to a read-only table of struct
- *    rte_physmem_desc elements, containing the layout of all
- *    addressable physical memory. The last element of the table
- *    contains a NULL address.
- *  - On error, return NULL. This should not happen since it is a fatal
- *    error that will probably cause the entire system to panic.
- */
-const struct rte_memseg *rte_eal_get_physmem_layout(void);
+ *   Memseg list to which this virtual address belongs to.
+ */
+struct rte_memseg_list *rte_mem_virt2memseg_list(const void *virt);
 
 /**
  * Dump the physical memory layout to a file.
diff --git a/lib/librte_eal/common/include/rte_memzone.h b/lib/librte_eal/common/include/rte_memzone.h
index 2bfb273..a69f068 100644
--- a/lib/librte_eal/common/include/rte_memzone.h
+++ b/lib/librte_eal/common/include/rte_memzone.h
@@ -66,7 +66,6 @@ struct rte_memzone {
 	int32_t socket_id;                /**< NUMA socket ID. */
 
 	uint32_t flags;                   /**< Characteristics of this memzone. */
-	uint32_t memseg_id;               /**< Memseg it belongs. */
 } __attribute__((__packed__));
 
 /**
diff --git a/lib/librte_eal/common/malloc_elem.c b/lib/librte_eal/common/malloc_elem.c
index c18f050..701bffd 100644
--- a/lib/librte_eal/common/malloc_elem.c
+++ b/lib/librte_eal/common/malloc_elem.c
@@ -26,11 +26,11 @@
  * Initialize a general malloc_elem header structure
  */
 void
-malloc_elem_init(struct malloc_elem *elem,
-		struct malloc_heap *heap, const struct rte_memseg *ms, size_t size)
+malloc_elem_init(struct malloc_elem *elem, struct malloc_heap *heap,
+		struct rte_memseg_list *msl, size_t size)
 {
 	elem->heap = heap;
-	elem->ms = ms;
+	elem->msl = msl;
 	elem->prev = NULL;
 	elem->next = NULL;
 	memset(&elem->free_list, 0, sizeof(elem->free_list));
@@ -145,7 +145,7 @@ split_elem(struct malloc_elem *elem, struct malloc_elem *split_pt)
 	const size_t old_elem_size = (uintptr_t)split_pt - (uintptr_t)elem;
 	const size_t new_elem_size = elem->size - old_elem_size;
 
-	malloc_elem_init(split_pt, elem->heap, elem->ms, new_elem_size);
+	malloc_elem_init(split_pt, elem->heap, elem->msl, new_elem_size);
 	split_pt->prev = elem;
 	split_pt->next = next_elem;
 	if (next_elem)
diff --git a/lib/librte_eal/common/malloc_elem.h b/lib/librte_eal/common/malloc_elem.h
index 9c1614c..388c16f 100644
--- a/lib/librte_eal/common/malloc_elem.h
+++ b/lib/librte_eal/common/malloc_elem.h
@@ -5,7 +5,7 @@
 #ifndef MALLOC_ELEM_H_
 #define MALLOC_ELEM_H_
 
-#include <rte_memory.h>
+#include <rte_eal_memconfig.h>
 
 /* dummy definition of struct so we can use pointers to it in malloc_elem struct */
 struct malloc_heap;
@@ -24,7 +24,7 @@ struct malloc_elem {
 	/**< points to next elem in memseg */
 	LIST_ENTRY(malloc_elem) free_list;
 	/**< list of free elements in heap */
-	const struct rte_memseg *ms;
+	struct rte_memseg_list *msl;
 	volatile enum elem_state state;
 	uint32_t pad;
 	size_t size;
@@ -111,7 +111,7 @@ malloc_elem_from_data(const void *data)
 void
 malloc_elem_init(struct malloc_elem *elem,
 		struct malloc_heap *heap,
-		const struct rte_memseg *ms,
+		struct rte_memseg_list *msl,
 		size_t size);
 
 void
diff --git a/lib/librte_eal/common/malloc_heap.c b/lib/librte_eal/common/malloc_heap.c
index a2c2e4c..058ad75 100644
--- a/lib/librte_eal/common/malloc_heap.c
+++ b/lib/librte_eal/common/malloc_heap.c
@@ -21,6 +21,7 @@
 #include <rte_memcpy.h>
 #include <rte_atomic.h>
 
+#include "eal_internal_cfg.h"
 #include "malloc_elem.h"
 #include "malloc_heap.h"
 
@@ -62,22 +63,25 @@ check_hugepage_sz(unsigned flags, uint64_t hugepage_sz)
 }
 
 /*
- * Expand the heap with a memseg.
- * This reserves the zone and sets a dummy malloc_elem header at the end
- * to prevent overflow. The rest of the zone is added to free list as a single
- * large free block
+ * Expand the heap with a memory area.
  */
-static void
-malloc_heap_add_memseg(struct malloc_heap *heap, struct rte_memseg *ms)
+static struct malloc_elem *
+malloc_heap_add_memory(struct malloc_heap *heap, struct rte_memseg_list *msl,
+		void *start, size_t len)
 {
-	struct malloc_elem *start_elem = (struct malloc_elem *)ms->addr;
-	const size_t elem_size = ms->len - MALLOC_ELEM_OVERHEAD;
+	struct malloc_elem *elem = start;
+
+	malloc_elem_init(elem, heap, msl, len);
+
+	malloc_elem_insert(elem);
+
+	elem = malloc_elem_join_adjacent_free(elem);
 
-	malloc_elem_init(start_elem, heap, ms, elem_size);
-	malloc_elem_insert(start_elem);
-	malloc_elem_free_list_insert(start_elem);
+	malloc_elem_free_list_insert(elem);
 
-	heap->total_size += elem_size;
+	heap->total_size += len;
+
+	return elem;
 }
 
 /*
@@ -98,7 +102,8 @@ find_suitable_element(struct malloc_heap *heap, size_t size,
 		for (elem = LIST_FIRST(&heap->free_head[idx]);
 				!!elem; elem = LIST_NEXT(elem, free_list)) {
 			if (malloc_elem_can_hold(elem, size, align, bound)) {
-				if (check_hugepage_sz(flags, elem->ms->hugepage_sz))
+				if (check_hugepage_sz(flags,
+						elem->msl->hugepage_sz))
 					return elem;
 				if (alt_elem == NULL)
 					alt_elem = elem;
@@ -243,16 +248,65 @@ int
 rte_eal_malloc_heap_init(void)
 {
 	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
-	unsigned ms_cnt;
-	struct rte_memseg *ms;
+	int msl_idx;
+	struct rte_memseg_list *msl;
 
 	if (mcfg == NULL)
 		return -1;
 
-	for (ms = &mcfg->memseg[0], ms_cnt = 0;
-			(ms_cnt < RTE_MAX_MEMSEG) && (ms->len > 0);
-			ms_cnt++, ms++) {
-		malloc_heap_add_memseg(&mcfg->malloc_heaps[ms->socket_id], ms);
+	for (msl_idx = 0; msl_idx < RTE_MAX_MEMSEG_LISTS; msl_idx++) {
+		int start;
+		struct rte_fbarray *arr;
+		struct malloc_heap *heap;
+
+		msl = &mcfg->memsegs[msl_idx];
+		arr = &msl->memseg_arr;
+		heap = &mcfg->malloc_heaps[msl->socket_id];
+
+		if (arr->count == 0)
+			continue;
+
+		/* for legacy mode, just walk the list */
+		if (internal_config.legacy_mem) {
+			int ms_idx = 0;
+			while ((ms_idx = rte_fbarray_find_next_used(arr,
+					ms_idx)) >= 0) {
+				struct rte_memseg *ms =
+						rte_fbarray_get(arr, ms_idx);
+				malloc_heap_add_memory(heap, msl,
+						ms->addr, ms->len);
+				ms_idx++;
+				RTE_LOG(DEBUG, EAL, "Heap on socket %d was expanded by %zdMB\n",
+					msl->socket_id, ms->len >> 20ULL);
+			}
+			continue;
+		}
+
+		/* find first segment */
+		start = rte_fbarray_find_next_used(arr, 0);
+
+		while (start >= 0) {
+			int contig_segs;
+			struct rte_memseg *start_seg;
+			size_t len, hugepage_sz = msl->hugepage_sz;
+
+			/* find how many pages we can lump in together */
+			contig_segs = rte_fbarray_find_contig_used(arr, start);
+			start_seg = rte_fbarray_get(arr, start);
+			len = contig_segs * hugepage_sz;
+
+			/*
+			 * we've found (hopefully) a bunch of contiguous
+			 * segments, so add them to the heap.
+			 */
+			malloc_heap_add_memory(heap, msl, start_seg->addr, len);
+
+			RTE_LOG(DEBUG, EAL, "Heap on socket %d was expanded by %zdMB\n",
+				msl->socket_id, len >> 20ULL);
+
+			start = rte_fbarray_find_next_used(arr,
+					start + contig_segs);
+		}
 	}
 
 	return 0;
diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c
index 80fb6cc..bd7e757 100644
--- a/lib/librte_eal/common/rte_malloc.c
+++ b/lib/librte_eal/common/rte_malloc.c
@@ -238,17 +238,21 @@ rte_malloc_set_limit(__rte_unused const char *type,
 rte_iova_t
 rte_malloc_virt2iova(const void *addr)
 {
-	rte_iova_t iova;
-	const struct malloc_elem *elem = malloc_elem_from_data(addr);
+	const struct rte_memseg *ms;
+	struct malloc_elem *elem = malloc_elem_from_data(addr);
+
 	if (elem == NULL)
 		return RTE_BAD_IOVA;
-	if (elem->ms->iova == RTE_BAD_IOVA)
-		return RTE_BAD_IOVA;
 
 	if (rte_eal_iova_mode() == RTE_IOVA_VA)
-		iova = (uintptr_t)addr;
-	else
-		iova = elem->ms->iova +
-			RTE_PTR_DIFF(addr, elem->ms->addr);
-	return iova;
+		return (uintptr_t) addr;
+
+	ms = rte_mem_virt2memseg(addr, elem->msl);
+	if (ms == NULL)
+		return RTE_BAD_IOVA;
+
+	if (ms->iova == RTE_BAD_IOVA)
+		return RTE_BAD_IOVA;
+
+	return ms->iova + RTE_PTR_DIFF(addr, ms->addr);
 }
diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c
index 5207713..7851a7d 100644
--- a/lib/librte_eal/linuxapp/eal/eal.c
+++ b/lib/librte_eal/linuxapp/eal/eal.c
@@ -74,8 +74,8 @@ static int mem_cfg_fd = -1;
 static struct flock wr_lock = {
 		.l_type = F_WRLCK,
 		.l_whence = SEEK_SET,
-		.l_start = offsetof(struct rte_mem_config, memseg),
-		.l_len = sizeof(early_mem_config.memseg),
+		.l_start = offsetof(struct rte_mem_config, memsegs),
+		.l_len = sizeof(early_mem_config.memsegs),
 };
 
 /* Address of global and public configuration */
@@ -643,17 +643,20 @@ eal_parse_args(int argc, char **argv)
 static void
 eal_check_mem_on_local_socket(void)
 {
-	const struct rte_memseg *ms;
+	const struct rte_memseg_list *msl;
 	int i, socket_id;
 
 	socket_id = rte_lcore_to_socket_id(rte_config.master_lcore);
 
-	ms = rte_eal_get_physmem_layout();
-
-	for (i = 0; i < RTE_MAX_MEMSEG; i++)
-		if (ms[i].socket_id == socket_id &&
-				ms[i].len > 0)
-			return;
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
+		msl = &rte_eal_get_configuration()->mem_config->memsegs[i];
+		if (msl->socket_id != socket_id)
+			continue;
+		/* for legacy memory, check if there's anything allocated */
+		if (internal_config.legacy_mem && msl->memseg_arr.count == 0)
+			continue;
+		return;
+	}
 
 	RTE_LOG(WARNING, EAL, "WARNING: Master core has no "
 			"memory on local socket!\n");
diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c
index b9bcb75..9512da9 100644
--- a/lib/librte_eal/linuxapp/eal/eal_memory.c
+++ b/lib/librte_eal/linuxapp/eal/eal_memory.c
@@ -908,6 +908,28 @@ huge_recover_sigbus(void)
 	}
 }
 
+/* in legacy mode, each combination of socket and pagesize directly map to a
+ * single memseg list.
+ */
+static struct rte_memseg_list *
+get_memseg_list(int socket, uint64_t page_sz)
+{
+	struct rte_mem_config *mcfg =
+			rte_eal_get_configuration()->mem_config;
+	struct rte_memseg_list *msl;
+	int msl_idx;
+
+	for (msl_idx = 0; msl_idx < RTE_MAX_MEMSEG_LISTS; msl_idx++) {
+		msl = &mcfg->memsegs[msl_idx];
+		if (msl->hugepage_sz != page_sz)
+			continue;
+		if (msl->socket_id != socket)
+			continue;
+		return msl;
+	}
+	return NULL;
+}
+
 /*
  * Prepare physical memory mapping: fill configuration structure with
  * these infos, return 0 on success.
@@ -925,11 +947,14 @@ eal_legacy_hugepage_init(void)
 	struct rte_mem_config *mcfg;
 	struct hugepage_file *hugepage = NULL, *tmp_hp = NULL;
 	struct hugepage_info used_hp[MAX_HUGEPAGE_SIZES];
+	struct rte_fbarray *arr;
+	struct rte_memseg *ms;
 
 	uint64_t memory[RTE_MAX_NUMA_NODES];
 
 	unsigned hp_offset;
 	int i, j, new_memseg;
+	int ms_idx, msl_idx;
 	int nr_hugefiles, nr_hugepages = 0;
 	void *addr;
 
@@ -942,6 +967,12 @@ eal_legacy_hugepage_init(void)
 
 	/* hugetlbfs can be disabled */
 	if (internal_config.no_hugetlbfs) {
+		/* nohuge mode is legacy mode */
+		internal_config.legacy_mem = 1;
+
+		arr = &mcfg->memsegs[0].memseg_arr;
+		ms = rte_fbarray_get(arr, 0);
+
 		addr = mmap(NULL, internal_config.memory, PROT_READ | PROT_WRITE,
 				MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
 		if (addr == MAP_FAILED) {
@@ -949,14 +980,15 @@ eal_legacy_hugepage_init(void)
 					strerror(errno));
 			return -1;
 		}
+		rte_fbarray_set_used(arr, 0);
 		if (rte_eal_iova_mode() == RTE_IOVA_VA)
-			mcfg->memseg[0].iova = (uintptr_t)addr;
+			ms->iova = (uintptr_t)addr;
 		else
-			mcfg->memseg[0].iova = RTE_BAD_IOVA;
-		mcfg->memseg[0].addr = addr;
-		mcfg->memseg[0].hugepage_sz = RTE_PGSIZE_4K;
-		mcfg->memseg[0].len = internal_config.memory;
-		mcfg->memseg[0].socket_id = 0;
+			ms->iova = RTE_BAD_IOVA;
+		ms->addr = addr;
+		ms->hugepage_sz = RTE_PGSIZE_4K;
+		ms->len = internal_config.memory;
+		ms->socket_id = 0;
 		return 0;
 	}
 
@@ -1197,27 +1229,51 @@ eal_legacy_hugepage_init(void)
 #endif
 
 		if (new_memseg) {
-			j += 1;
-			if (j == RTE_MAX_MEMSEG)
+			struct rte_memseg_list *msl;
+			int socket;
+			uint64_t page_sz;
+
+			socket = hugepage[i].socket_id;
+			page_sz = hugepage[i].size;
+
+			if (page_sz == 0)
+				continue;
+
+			/* figure out where to put this memseg */
+			msl = get_memseg_list(socket, page_sz);
+			if (!msl)
+				rte_panic("Unknown socket or page sz: %i %lx\n",
+					socket, page_sz);
+			msl_idx = msl - &mcfg->memsegs[0];
+			arr = &msl->memseg_arr;
+
+			ms_idx = rte_fbarray_find_next_free(arr, arr->count);
+			if (ms_idx < 0) {
+				RTE_LOG(ERR, EAL, "No space in memseg list\n");
 				break;
+			}
+			ms = rte_fbarray_get(arr, ms_idx);
+
+			ms->iova = hugepage[i].physaddr;
+			ms->addr = hugepage[i].final_va;
+			ms->len = page_sz;
+			ms->socket_id = socket;
+			ms->hugepage_sz = page_sz;
 
-			mcfg->memseg[j].iova = hugepage[i].physaddr;
-			mcfg->memseg[j].addr = hugepage[i].final_va;
-			mcfg->memseg[j].len = hugepage[i].size;
-			mcfg->memseg[j].socket_id = hugepage[i].socket_id;
-			mcfg->memseg[j].hugepage_sz = hugepage[i].size;
+			rte_fbarray_set_used(arr, ms_idx);
 		}
 		/* continuation of previous memseg */
 		else {
 #ifdef RTE_ARCH_PPC_64
 		/* Use the phy and virt address of the last page as segment
 		 * address for IBM Power architecture */
-			mcfg->memseg[j].iova = hugepage[i].physaddr;
-			mcfg->memseg[j].addr = hugepage[i].final_va;
+			ms->iova = hugepage[i].physaddr;
+			ms->addr = hugepage[i].final_va;
 #endif
-			mcfg->memseg[j].len += mcfg->memseg[j].hugepage_sz;
+			ms->len += ms->hugepage_sz;
 		}
-		hugepage[i].memseg_id = j;
+		hugepage[i].memseg_id = ms_idx;
+		hugepage[i].memseg_list_id = msl_idx;
 	}
 
 	if (i < nr_hugefiles) {
@@ -1227,7 +1283,7 @@ eal_legacy_hugepage_init(void)
 			"Please either increase it or request less amount "
 			"of memory.\n",
 			i, nr_hugefiles, RTE_STR(CONFIG_RTE_MAX_MEMSEG),
-			RTE_MAX_MEMSEG);
+			RTE_MAX_MEMSEG_PER_LIST);
 		goto fail;
 	}
 
@@ -1265,11 +1321,12 @@ getFileSize(int fd)
 static int
 eal_legacy_hugepage_attach(void)
 {
-	const struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
+	struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config;
 	struct hugepage_file *hp = NULL;
-	unsigned num_hp = 0;
-	unsigned i, s = 0; /* s used to track the segment number */
-	unsigned max_seg = RTE_MAX_MEMSEG;
+	unsigned int num_hp = 0;
+	unsigned int i;
+	int ms_idx, msl_idx;
+	unsigned int cur_seg, max_seg;
 	off_t size = 0;
 	int fd, fd_hugepage = -1;
 
@@ -1289,46 +1346,57 @@ eal_legacy_hugepage_attach(void)
 	}
 
 	/* map all segments into memory to make sure we get the addrs */
-	for (s = 0; s < RTE_MAX_MEMSEG; ++s) {
-		void *base_addr;
+	max_seg = 0;
+	for (msl_idx = 0; msl_idx < RTE_MAX_MEMSEG_LISTS; msl_idx++) {
+		struct rte_memseg_list *msl = &mcfg->memsegs[msl_idx];
+		struct rte_fbarray *arr = &msl->memseg_arr;
 		uint64_t mmap_sz;
 		int mmap_flags = 0;
 
-		/*
-		 * the first memory segment with len==0 is the one that
-		 * follows the last valid segment.
-		 */
-		if (mcfg->memseg[s].len == 0)
-			break;
+		ms_idx = rte_fbarray_find_next_used(arr, 0);
+		while (ms_idx >= 0) {
+			struct rte_memseg *ms = rte_fbarray_get(arr, ms_idx);
+			void *base_addr;
 
-		/* get identical addresses as the primary process.
-		 */
+			ms = rte_fbarray_get(arr, ms_idx);
+
+			/*
+			 * the first memory segment with len==0 is the one that
+			 * follows the last valid segment.
+			 */
+			if (ms->len == 0)
+				break;
+
+			/* get identical addresses as the primary process.
+			 */
 #ifdef RTE_ARCH_PPC_64
-		mmap_flags |= MAP_HUGETLB;
+			mmap_flags |= MAP_HUGETLB;
 #endif
-		mmap_sz = mcfg->memseg[s].len;
-		base_addr = eal_get_virtual_area(mcfg->memseg[s].addr,
-				&mmap_sz, mcfg->memseg[s].hugepage_sz, 0,
-				mmap_flags);
-		if (base_addr == NULL) {
-			max_seg = s;
-			if (rte_errno == EADDRNOTAVAIL) {
-				RTE_LOG(ERR, EAL, "Could not mmap %llu bytes at [%p] - please use '--base-virtaddr' option\n",
-					(unsigned long long)mcfg->memseg[s].len,
-					mcfg->memseg[s].addr);
-			} else {
-				RTE_LOG(ERR, EAL, "Could not mmap %llu bytes at [%p]: '%s'\n",
-					(unsigned long long)mcfg->memseg[s].len,
-					mcfg->memseg[s].addr,
-					rte_strerror(rte_errno));
-			}
-			if (aslr_enabled() > 0) {
-				RTE_LOG(ERR, EAL, "It is recommended to "
-					"disable ASLR in the kernel "
-					"and retry running both primary "
-					"and secondary processes\n");
+			mmap_sz = ms->len;
+			base_addr = eal_get_virtual_area(ms->addr, &mmap_sz,
+					ms->hugepage_sz, 0, mmap_flags);
+			if (base_addr == NULL) {
+				if (rte_errno == EADDRNOTAVAIL) {
+					RTE_LOG(ERR, EAL, "Could not mmap %llu bytes at [%p] - please use '--base-virtaddr' option\n",
+						(unsigned long long)ms->len,
+						ms->addr);
+				} else {
+					RTE_LOG(ERR, EAL, "Could not mmap %llu bytes at [%p]: '%s'\n",
+						(unsigned long long)ms->len,
+						ms->addr, strerror(errno));
+				}
+				if (aslr_enabled() > 0) {
+					RTE_LOG(ERR, EAL, "It is recommended to "
+						"disable ASLR in the kernel "
+						"and retry running both primary "
+						"and secondary processes\n");
+				}
+				goto error;
 			}
-			goto error;
+			max_seg++;
+			ms_idx++;
+
+			ms_idx = rte_fbarray_find_next_used(arr, ms_idx);
 		}
 	}
 
@@ -1342,46 +1410,67 @@ eal_legacy_hugepage_attach(void)
 	num_hp = size / sizeof(struct hugepage_file);
 	RTE_LOG(DEBUG, EAL, "Analysing %u files\n", num_hp);
 
-	s = 0;
-	while (s < RTE_MAX_MEMSEG && mcfg->memseg[s].len > 0){
-		void *addr, *base_addr;
-		uintptr_t offset = 0;
-		size_t mapping_size;
-		/*
-		 * free previously mapped memory so we can map the
-		 * hugepages into the space
-		 */
-		base_addr = mcfg->memseg[s].addr;
-		munmap(base_addr, mcfg->memseg[s].len);
-
-		/* find the hugepages for this segment and map them
-		 * we don't need to worry about order, as the server sorted the
-		 * entries before it did the second mmap of them */
-		for (i = 0; i < num_hp && offset < mcfg->memseg[s].len; i++){
-			if (hp[i].memseg_id == (int)s){
-				fd = open(hp[i].filepath, O_RDWR);
-				if (fd < 0) {
-					RTE_LOG(ERR, EAL, "Could not open %s\n",
-						hp[i].filepath);
-					goto error;
-				}
-				mapping_size = hp[i].size;
-				addr = mmap(RTE_PTR_ADD(base_addr, offset),
-						mapping_size, PROT_READ | PROT_WRITE,
-						MAP_SHARED, fd, 0);
-				close(fd); /* close file both on success and on failure */
-				if (addr == MAP_FAILED ||
-						addr != RTE_PTR_ADD(base_addr, offset)) {
-					RTE_LOG(ERR, EAL, "Could not mmap %s\n",
-						hp[i].filepath);
-					goto error;
+	/* map all segments into memory to make sure we get the addrs */
+	for (msl_idx = 0; msl_idx < RTE_MAX_MEMSEG_LISTS; msl_idx++) {
+		struct rte_memseg_list *msl = &mcfg->memsegs[msl_idx];
+		struct rte_fbarray *arr = &msl->memseg_arr;
+
+		ms_idx = rte_fbarray_find_next_used(arr, 0);
+		while (ms_idx >= 0) {
+			struct rte_memseg *ms = rte_fbarray_get(arr, ms_idx);
+			void *addr, *base_addr;
+			uintptr_t offset = 0;
+			size_t mapping_size;
+
+			ms = rte_fbarray_get(arr, ms_idx);
+			/*
+			 * free previously mapped memory so we can map the
+			 * hugepages into the space
+			 */
+			base_addr = ms->addr;
+			munmap(base_addr, ms->len);
+
+			/*
+			 * find the hugepages for this segment and map them
+			 * we don't need to worry about order, as the server
+			 * sorted the entries before it did the second mmap of
+			 * them
+			 */
+			for (i = 0; i < num_hp && offset < ms->len; i++) {
+				if (hp[i].memseg_id == ms_idx &&
+						hp[i].memseg_list_id ==
+						msl_idx) {
+					fd = open(hp[i].filepath, O_RDWR);
+					if (fd < 0) {
+						RTE_LOG(ERR, EAL, "Could not open %s\n",
+							hp[i].filepath);
+						goto error;
+					}
+					mapping_size = hp[i].size;
+					addr = mmap(RTE_PTR_ADD(base_addr,
+							offset),
+							mapping_size,
+							PROT_READ | PROT_WRITE,
+							MAP_SHARED, fd, 0);
+					/*
+					 * close file both on success and on
+					 * failure
+					 */
+					close(fd);
+					if (addr == MAP_FAILED ||
+							addr != RTE_PTR_ADD(
+							base_addr, offset)) {
+						RTE_LOG(ERR, EAL, "Could not mmap %s\n",
+							hp[i].filepath);
+						goto error;
+					}
+					offset += mapping_size;
 				}
-				offset+=mapping_size;
 			}
+			RTE_LOG(DEBUG, EAL, "Mapped segment of size 0x%llx\n",
+					(unsigned long long)ms->len);
+			ms_idx = rte_fbarray_find_next_used(arr, ms_idx + 1);
 		}
-		RTE_LOG(DEBUG, EAL, "Mapped segment %u of size 0x%llx\n", s,
-				(unsigned long long)mcfg->memseg[s].len);
-		s++;
 	}
 	/* unmap the hugepage config file, since we are done using it */
 	munmap(hp, size);
@@ -1389,8 +1478,28 @@ eal_legacy_hugepage_attach(void)
 	return 0;
 
 error:
-	for (i = 0; i < max_seg && mcfg->memseg[i].len > 0; i++)
-		munmap(mcfg->memseg[i].addr, mcfg->memseg[i].len);
+	/* map all segments into memory to make sure we get the addrs */
+	cur_seg = 0;
+	for (msl_idx = 0; msl_idx < RTE_MAX_MEMSEG_LISTS; msl_idx++) {
+		struct rte_memseg_list *msl = &mcfg->memsegs[msl_idx];
+		struct rte_fbarray *arr = &msl->memseg_arr;
+
+		if (cur_seg >= max_seg)
+			break;
+
+		ms_idx = rte_fbarray_find_next_used(arr, 0);
+		while (ms_idx >= 0) {
+			struct rte_memseg *ms = rte_fbarray_get(arr, ms_idx);
+
+			if (cur_seg >= max_seg)
+				break;
+			ms = rte_fbarray_get(arr, i);
+			munmap(ms->addr, ms->len);
+
+			cur_seg++;
+			ms_idx = rte_fbarray_find_next_used(arr, ms_idx);
+		}
+	}
 	if (hp != NULL && hp != MAP_FAILED)
 		munmap(hp, size);
 	if (fd_hugepage >= 0)
diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c b/lib/librte_eal/linuxapp/eal/eal_vfio.c
index e44ae4d..5192763 100644
--- a/lib/librte_eal/linuxapp/eal/eal_vfio.c
+++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c
@@ -667,33 +667,53 @@ vfio_get_group_no(const char *sysfs_base,
 static int
 vfio_type1_dma_map(int vfio_container_fd)
 {
-	const struct rte_memseg *ms = rte_eal_get_physmem_layout();
 	int i, ret;
 
 	/* map all DPDK segments for DMA. use 1:1 PA to IOVA mapping */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
 		struct vfio_iommu_type1_dma_map dma_map;
+		struct rte_memseg_list *msl;
+		struct rte_fbarray *arr;
+		int ms_idx, next_idx;
 
-		if (ms[i].addr == NULL)
-			break;
+		msl = &rte_eal_get_configuration()->mem_config->memsegs[i];
+		arr = &msl->memseg_arr;
 
-		memset(&dma_map, 0, sizeof(dma_map));
-		dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
-		dma_map.vaddr = ms[i].addr_64;
-		dma_map.size = ms[i].len;
-		if (rte_eal_iova_mode() == RTE_IOVA_VA)
-			dma_map.iova = dma_map.vaddr;
-		else
-			dma_map.iova = ms[i].iova;
-		dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
+		/* skip empty memseg lists */
+		if (arr->count == 0)
+			continue;
 
-		ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
+		next_idx = 0;
 
-		if (ret) {
-			RTE_LOG(ERR, EAL, "  cannot set up DMA remapping, "
-					  "error %i (%s)\n", errno,
-					  strerror(errno));
-			return -1;
+		while ((ms_idx = rte_fbarray_find_next_used(arr,
+				next_idx) >= 0)) {
+			uint64_t addr, len, hw_addr;
+			const struct rte_memseg *ms;
+			next_idx = ms_idx + 1;
+
+			ms = rte_fbarray_get(arr, ms_idx);
+
+			addr = ms->addr_64;
+			len = ms->hugepage_sz;
+			hw_addr = ms->iova;
+
+			memset(&dma_map, 0, sizeof(dma_map));
+			dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
+			dma_map.vaddr = addr;
+			dma_map.size = len;
+			dma_map.iova = hw_addr;
+			dma_map.flags = VFIO_DMA_MAP_FLAG_READ |
+					VFIO_DMA_MAP_FLAG_WRITE;
+
+			ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA,
+					&dma_map);
+
+			if (ret) {
+				RTE_LOG(ERR, EAL, "  cannot set up DMA remapping, "
+						  "error %i (%s)\n", errno,
+						  strerror(errno));
+				return -1;
+			}
 		}
 	}
 
@@ -703,8 +723,8 @@ vfio_type1_dma_map(int vfio_container_fd)
 static int
 vfio_spapr_dma_map(int vfio_container_fd)
 {
-	const struct rte_memseg *ms = rte_eal_get_physmem_layout();
 	int i, ret;
+	uint64_t hugepage_sz = 0;
 
 	struct vfio_iommu_spapr_register_memory reg = {
 		.argsz = sizeof(reg),
@@ -738,17 +758,31 @@ vfio_spapr_dma_map(int vfio_container_fd)
 	}
 
 	/* create DMA window from 0 to max(phys_addr + len) */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (ms[i].addr == NULL)
-			break;
-
-		create.window_size = RTE_MAX(create.window_size,
-				ms[i].iova + ms[i].len);
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
+		struct rte_mem_config *mcfg =
+				rte_eal_get_configuration()->mem_config;
+		struct rte_memseg_list *msl = &mcfg->memsegs[i];
+		struct rte_fbarray *arr = &msl->memseg_arr;
+		int idx, next_idx;
+
+		if (msl->base_va == NULL)
+			continue;
+		if (msl->memseg_arr.count == 0)
+			continue;
+
+		next_idx = 0;
+		while ((idx = rte_fbarray_find_next_used(arr, next_idx)) >= 0) {
+			const struct rte_memseg *ms = rte_fbarray_get(arr, idx);
+			hugepage_sz = RTE_MAX(hugepage_sz, ms->hugepage_sz);
+			create.window_size = RTE_MAX(create.window_size,
+					ms[i].iova + ms[i].len);
+			next_idx = idx + 1;
+		}
 	}
 
 	/* sPAPR requires window size to be a power of 2 */
 	create.window_size = rte_align64pow2(create.window_size);
-	create.page_shift = __builtin_ctzll(ms->hugepage_sz);
+	create.page_shift = __builtin_ctzll(hugepage_sz);
 	create.levels = 1;
 
 	ret = ioctl(vfio_container_fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create);
@@ -764,41 +798,61 @@ vfio_spapr_dma_map(int vfio_container_fd)
 	}
 
 	/* map all DPDK segments for DMA. use 1:1 PA to IOVA mapping */
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
 		struct vfio_iommu_type1_dma_map dma_map;
+		struct rte_memseg_list *msl;
+		struct rte_fbarray *arr;
+		int ms_idx, next_idx;
 
-		if (ms[i].addr == NULL)
-			break;
+		msl = &rte_eal_get_configuration()->mem_config->memsegs[i];
+		arr = &msl->memseg_arr;
 
-		reg.vaddr = (uintptr_t) ms[i].addr;
-		reg.size = ms[i].len;
-		ret = ioctl(vfio_container_fd,
-			VFIO_IOMMU_SPAPR_REGISTER_MEMORY, &reg);
-		if (ret) {
-			RTE_LOG(ERR, EAL, "  cannot register vaddr for IOMMU, "
-				"error %i (%s)\n", errno, strerror(errno));
-			return -1;
-		}
+		/* skip empty memseg lists */
+		if (arr->count == 0)
+			continue;
 
-		memset(&dma_map, 0, sizeof(dma_map));
-		dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
-		dma_map.vaddr = ms[i].addr_64;
-		dma_map.size = ms[i].len;
-		if (rte_eal_iova_mode() == RTE_IOVA_VA)
-			dma_map.iova = dma_map.vaddr;
-		else
-			dma_map.iova = ms[i].iova;
-		dma_map.flags = VFIO_DMA_MAP_FLAG_READ |
-				 VFIO_DMA_MAP_FLAG_WRITE;
+		next_idx = 0;
 
-		ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
+		while ((ms_idx = rte_fbarray_find_next_used(arr,
+				next_idx) >= 0)) {
+			uint64_t addr, len, hw_addr;
+			const struct rte_memseg *ms;
+			next_idx = ms_idx + 1;
 
-		if (ret) {
-			RTE_LOG(ERR, EAL, "  cannot set up DMA remapping, "
-				"error %i (%s)\n", errno, strerror(errno));
-			return -1;
-		}
+			ms = rte_fbarray_get(arr, ms_idx);
+
+			addr = ms->addr_64;
+			len = ms->hugepage_sz;
+			hw_addr = ms->iova;
 
+			reg.vaddr = (uintptr_t) addr;
+			reg.size = len;
+			ret = ioctl(vfio_container_fd,
+				VFIO_IOMMU_SPAPR_REGISTER_MEMORY, &reg);
+			if (ret) {
+				RTE_LOG(ERR, EAL, "  cannot register vaddr for IOMMU, error %i (%s)\n",
+						errno, strerror(errno));
+				return -1;
+			}
+
+			memset(&dma_map, 0, sizeof(dma_map));
+			dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map);
+			dma_map.vaddr = addr;
+			dma_map.size = len;
+			dma_map.iova = hw_addr;
+			dma_map.flags = VFIO_DMA_MAP_FLAG_READ |
+					VFIO_DMA_MAP_FLAG_WRITE;
+
+			ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA,
+					&dma_map);
+
+			if (ret) {
+				RTE_LOG(ERR, EAL, "  cannot set up DMA remapping, "
+						  "error %i (%s)\n", errno,
+						  strerror(errno));
+				return -1;
+			}
+		}
 	}
 
 	return 0;
diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map
index a938a2f..4c2e959 100644
--- a/lib/librte_eal/rte_eal_version.map
+++ b/lib/librte_eal/rte_eal_version.map
@@ -25,7 +25,6 @@ DPDK_2.0 {
 	rte_eal_devargs_type_count;
 	rte_eal_get_configuration;
 	rte_eal_get_lcore_state;
-	rte_eal_get_physmem_layout;
 	rte_eal_get_physmem_size;
 	rte_eal_has_hugepages;
 	rte_eal_hpet_init;
@@ -215,6 +214,8 @@ DPDK_18.05 {
 	global:
 
 	rte_num_sockets;
+	rte_mem_virt2memseg;
+	rte_mem_virt2memseg_list;
 	rte_malloc_dump_heaps;
 	rte_fbarray_init;
 	rte_fbarray_destroy;
diff --git a/test/test/test_malloc.c b/test/test/test_malloc.c
index d23192c..8484fb6 100644
--- a/test/test/test_malloc.c
+++ b/test/test/test_malloc.c
@@ -12,6 +12,7 @@
 
 #include <rte_common.h>
 #include <rte_memory.h>
+#include <rte_eal_memconfig.h>
 #include <rte_per_lcore.h>
 #include <rte_launch.h>
 #include <rte_eal.h>
@@ -705,15 +706,23 @@ test_malloc_bad_params(void)
 	return -1;
 }
 
-/* Check if memory is available on a specific socket */
+/* Check if memory is avilable on a specific socket */
 static int
 is_mem_on_socket(int32_t socket)
 {
-	const struct rte_memseg *ms = rte_eal_get_physmem_layout();
+	const struct rte_mem_config *mcfg =
+			rte_eal_get_configuration()->mem_config;
 	unsigned i;
 
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (socket == ms[i].socket_id)
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
+		const struct rte_memseg_list *msl =
+				&mcfg->memsegs[i];
+		const struct rte_fbarray *arr = &msl->memseg_arr;
+
+		if (msl->socket_id != socket)
+			continue;
+
+		if (arr->count)
 			return 1;
 	}
 	return 0;
@@ -726,16 +735,8 @@ is_mem_on_socket(int32_t socket)
 static int32_t
 addr_to_socket(void * addr)
 {
-	const struct rte_memseg *ms = rte_eal_get_physmem_layout();
-	unsigned i;
-
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if ((ms[i].addr <= addr) &&
-				((uintptr_t)addr <
-				((uintptr_t)ms[i].addr + (uintptr_t)ms[i].len)))
-			return ms[i].socket_id;
-	}
-	return -1;
+	const struct rte_memseg *ms = rte_mem_virt2memseg(addr, NULL);
+	return ms == NULL ? -1 : ms->socket_id;
 }
 
 /* Test using rte_[c|m|zm]alloc_socket() on a specific socket */
diff --git a/test/test/test_memory.c b/test/test/test_memory.c
index 972321f..8cb52d7 100644
--- a/test/test/test_memory.c
+++ b/test/test/test_memory.c
@@ -5,8 +5,11 @@
 #include <stdio.h>
 #include <stdint.h>
 
+#include <rte_eal.h>
+#include <rte_eal_memconfig.h>
 #include <rte_memory.h>
 #include <rte_common.h>
+#include <rte_memzone.h>
 
 #include "test.h"
 
@@ -25,10 +28,12 @@
 static int
 test_memory(void)
 {
+	const struct rte_memzone *mz = NULL;
 	uint64_t s;
 	unsigned i;
 	size_t j;
-	const struct rte_memseg *mem;
+	struct rte_mem_config *mcfg =
+			rte_eal_get_configuration()->mem_config;
 
 	/*
 	 * dump the mapped memory: the python-expect script checks
@@ -40,20 +45,42 @@ test_memory(void)
 	/* check that memory size is != 0 */
 	s = rte_eal_get_physmem_size();
 	if (s == 0) {
-		printf("No memory detected\n");
-		return -1;
+		printf("No memory detected, attempting to allocate\n");
+		mz = rte_memzone_reserve("tmp", 1000, SOCKET_ID_ANY, 0);
+
+		if (!mz) {
+			printf("Failed to allocate a memzone\n");
+			return -1;
+		}
 	}
 
 	/* try to read memory (should not segfault) */
-	mem = rte_eal_get_physmem_layout();
-	for (i = 0; i < RTE_MAX_MEMSEG && mem[i].addr != NULL ; i++) {
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
+		struct rte_memseg_list *msl = &mcfg->memsegs[i];
+		struct rte_fbarray *arr = &msl->memseg_arr;
+		int search_idx, cur_idx;
+
+		if (arr->count == 0)
+			continue;
+
+		search_idx = 0;
 
-		/* check memory */
-		for (j = 0; j<mem[i].len; j++) {
-			*((volatile uint8_t *) mem[i].addr + j);
+		while ((cur_idx = rte_fbarray_find_next_used(arr,
+				search_idx)) >= 0) {
+			const struct rte_memseg *ms;
+
+			ms = rte_fbarray_get(arr, cur_idx);
+
+			/* check memory */
+			for (j = 0; j < ms->len; j++)
+				*((volatile uint8_t *) ms->addr + j);
+			search_idx = cur_idx + 1;
 		}
 	}
 
+	if (mz)
+		rte_memzone_free(mz);
+
 	return 0;
 }
 
diff --git a/test/test/test_memzone.c b/test/test/test_memzone.c
index 8ece1ac..47f4de8 100644
--- a/test/test/test_memzone.c
+++ b/test/test/test_memzone.c
@@ -108,22 +108,25 @@ static int
 test_memzone_reserve_flags(void)
 {
 	const struct rte_memzone *mz;
-	const struct rte_memseg *ms;
 	int hugepage_2MB_avail = 0;
 	int hugepage_1GB_avail = 0;
 	int hugepage_16MB_avail = 0;
 	int hugepage_16GB_avail = 0;
 	const size_t size = 100;
 	int i = 0;
-	ms = rte_eal_get_physmem_layout();
-	for (i = 0; i < RTE_MAX_MEMSEG; i++) {
-		if (ms[i].hugepage_sz == RTE_PGSIZE_2M)
+
+	for (i = 0; i < RTE_MAX_MEMSEG_LISTS; i++) {
+		struct rte_mem_config *mcfg =
+				rte_eal_get_configuration()->mem_config;
+		struct rte_memseg_list *msl = &mcfg->memsegs[i];
+
+		if (msl->hugepage_sz == RTE_PGSIZE_2M)
 			hugepage_2MB_avail = 1;
-		if (ms[i].hugepage_sz == RTE_PGSIZE_1G)
+		if (msl->hugepage_sz == RTE_PGSIZE_1G)
 			hugepage_1GB_avail = 1;
-		if (ms[i].hugepage_sz == RTE_PGSIZE_16M)
+		if (msl->hugepage_sz == RTE_PGSIZE_16M)
 			hugepage_16MB_avail = 1;
-		if (ms[i].hugepage_sz == RTE_PGSIZE_16G)
+		if (msl->hugepage_sz == RTE_PGSIZE_16G)
 			hugepage_16GB_avail = 1;
 	}
 	/* Display the availability of 2MB ,1GB, 16MB, 16GB pages */
-- 
2.7.4

  parent reply	other threads:[~2018-03-03 13:46 UTC|newest]

Thread overview: 471+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-03 13:45 [dpdk-dev] [PATCH 00/41] Memory Hotplug for DPDK Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 01/41] eal: move get_virtual_area out of linuxapp eal_memory.c Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 02/41] eal: move all locking to heap Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 03/41] eal: make malloc heap a doubly-linked list Anatoly Burakov
2018-03-19 17:33   ` Olivier Matz
2018-03-20  9:39     ` Burakov, Anatoly
2018-03-03 13:45 ` [dpdk-dev] [PATCH 04/41] eal: add function to dump malloc heap contents Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 05/41] test: add command " Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 06/41] eal: make malloc_elem_join_adjacent_free public Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 07/41] eal: make malloc free list remove public Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 08/41] eal: make malloc free return resulting malloc element Anatoly Burakov
2018-03-19 17:34   ` Olivier Matz
2018-03-20  9:40     ` Burakov, Anatoly
2018-03-03 13:45 ` [dpdk-dev] [PATCH 09/41] eal: add rte_fbarray Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 10/41] eal: add "single file segments" command-line option Anatoly Burakov
2018-03-03 13:45 ` [dpdk-dev] [PATCH 11/41] eal: add "legacy memory" option Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 12/41] eal: read hugepage counts from node-specific sysfs path Anatoly Burakov
2018-03-03 13:46 ` Anatoly Burakov [this message]
2018-03-19 17:39   ` [dpdk-dev] [PATCH 13/41] eal: replace memseg with memseg lists Olivier Matz
2018-03-20  9:47     ` Burakov, Anatoly
2018-03-03 13:46 ` [dpdk-dev] [PATCH 14/41] eal: add support for mapping hugepages at runtime Anatoly Burakov
2018-03-19 17:42   ` Olivier Matz
2018-03-03 13:46 ` [dpdk-dev] [PATCH 15/41] eal: add support for unmapping pages " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 16/41] eal: make use of memory hotplug for init Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 17/41] eal: enable memory hotplug support in rte_malloc Anatoly Burakov
2018-03-19 17:46   ` Olivier Matz
2018-03-03 13:46 ` [dpdk-dev] [PATCH 18/41] test: fix malloc autotest to support memory hotplug Anatoly Burakov
2018-03-19 17:49   ` Olivier Matz
2018-03-03 13:46 ` [dpdk-dev] [PATCH 19/41] eal: add API to check if memory is contiguous Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 20/41] eal: add backend support for contiguous allocation Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 21/41] eal: enable reserving physically contiguous memzones Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 22/41] eal: replace memzone array with fbarray Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 23/41] mempool: add support for the new allocation methods Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 24/41] vfio: allow to map other memory regions Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 25/41] eal: map/unmap memory with VFIO when alloc/free pages Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 26/41] eal: prepare memseg lists for multiprocess sync Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 27/41] eal: add multiprocess init with memory hotplug Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 28/41] eal: add support for multiprocess " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 29/41] eal: add support for callbacks on " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 30/41] eal: enable callbacks on malloc/free and mp sync Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 31/41] ethdev: use contiguous allocation for DMA memory Anatoly Burakov
2018-03-03 14:05   ` Andrew Rybchenko
2018-03-05  9:08     ` Burakov, Anatoly
2018-03-05  9:15       ` Andrew Rybchenko
2018-03-05 10:00         ` Burakov, Anatoly
2018-03-03 13:46 ` [dpdk-dev] [PATCH 32/41] crypto/qat: " Anatoly Burakov
2018-03-05 11:06   ` Trahe, Fiona
2018-03-03 13:46 ` [dpdk-dev] [PATCH 33/41] net/avf: " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 34/41] net/bnx2x: " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 35/41] net/cxgbe: " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 36/41] net/ena: " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 37/41] net/enic: " Anatoly Burakov
2018-03-05 19:45   ` John Daley (johndale)
2018-03-03 13:46 ` [dpdk-dev] [PATCH 38/41] net/i40e: " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 39/41] net/qede: " Anatoly Burakov
2018-03-03 13:46 ` [dpdk-dev] [PATCH 40/41] net/virtio: " Anatoly Burakov
2018-03-03 16:52   ` Venkatesh Srinivas
2018-03-03 13:46 ` [dpdk-dev] [PATCH 41/41] net/vmxnet3: " Anatoly Burakov
2018-03-06 11:04 ` [dpdk-dev] [PATCH 00/41] Memory Hotplug for DPDK Burakov, Anatoly
2018-03-07 15:27 ` Nélio Laranjeiro
2018-03-07 16:05   ` Burakov, Anatoly
2018-03-08  9:37     ` Burakov, Anatoly
2018-03-08 10:53       ` Nélio Laranjeiro
2018-03-08 12:12         ` Burakov, Anatoly
2018-03-08 12:14           ` Bruce Richardson
2018-03-07 16:11   ` Burakov, Anatoly
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 " Anatoly Burakov
2018-03-08 10:18   ` Pavan Nikhilesh
2018-03-08 10:46     ` Burakov, Anatoly
2018-03-08 11:13       ` Pavan Nikhilesh
2018-03-08 13:36         ` Pavan Nikhilesh
2018-03-08 14:36           ` Burakov, Anatoly
2018-03-08 20:11             ` Burakov, Anatoly
2018-03-08 20:33               ` Burakov, Anatoly
2018-03-09  9:15                 ` Pavan Nikhilesh
2018-03-09 10:42                   ` Burakov, Anatoly
2018-03-12 15:58                     ` Nélio Laranjeiro
2018-03-13  5:17                     ` Shreyansh Jain
2018-03-15 14:01                       ` Shreyansh Jain
2018-03-21 13:45                         ` Shreyansh Jain
2018-03-21 14:48                           ` Burakov, Anatoly
2018-03-22  5:09                             ` Shreyansh Jain
2018-03-22  9:24                               ` Burakov, Anatoly
2018-03-19  8:58   ` Shreyansh Jain
2018-03-20 10:07     ` Burakov, Anatoly
2018-03-29 10:57       ` Shreyansh Jain
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 00/68] " Anatoly Burakov
2018-04-05 14:24     ` Shreyansh Jain
2018-04-05 14:12       ` Thomas Monjalon
2018-04-05 14:20         ` Hemant Agrawal
2018-04-06 12:01           ` Hemant Agrawal
2018-04-06 12:55             ` Burakov, Anatoly
2018-04-05 18:59     ` santosh
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 00/70] " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 " Anatoly Burakov
2018-04-09 18:35         ` gowrishankar muthukrishnan
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 " Anatoly Burakov
2018-04-11 18:07           ` Thomas Monjalon
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 01/70] eal: move get_virtual_area out of linuxapp eal_memory.c Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 02/70] malloc: move all locking to heap Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 03/70] malloc: make heap a doubly-linked list Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 04/70] malloc: add function to dump heap contents Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 05/70] test: add command to dump malloc " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 06/70] malloc: make malloc_elem_join_adjacent_free public Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 07/70] malloc: make elem_free_list_remove public Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 08/70] malloc: make free return resulting element Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 09/70] malloc: replace panics with error messages Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 10/70] malloc: add support for contiguous allocation Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 11/70] memzone: enable reserving IOVA-contiguous memzones Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 12/70] ethdev: use contiguous allocation for DMA memory Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 13/70] crypto/qat: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 14/70] net/avf: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 15/70] net/bnx2x: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 16/70] net/bnxt: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 17/70] net/cxgbe: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 18/70] net/ena: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 19/70] net/enic: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 20/70] net/i40e: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 21/70] net/qede: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 22/70] net/virtio: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 23/70] net/vmxnet3: " Anatoly Burakov
2018-04-11 12:29         ` [dpdk-dev] [PATCH v6 24/70] mempool: add support for the new allocation methods Anatoly Burakov
2018-04-11 14:35           ` Olivier Matz
2018-04-11 14:35           ` Olivier Matz
2018-04-11 14:43           ` Andrew Rybchenko
2018-04-11 15:03             ` Burakov, Anatoly
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 25/70] eal: add function to walk all memsegs Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 26/70] bus/fslmc: use memseg walk instead of iteration Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 27/70] bus/pci: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 28/70] net/mlx5: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 29/70] eal: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 30/70] mempool: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 31/70] test: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 32/70] vfio/type1: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 33/70] vfio/spapr: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 34/70] eal: add contig walk function Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 35/70] virtio: use memseg contig walk instead of iteration Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 36/70] eal: add iova2virt function Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 37/70] bus/dpaa: use iova2virt instead of memseg iteration Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 38/70] bus/fslmc: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 39/70] crypto/dpaa_sec: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 40/70] eal: add virt2memseg function Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 41/70] bus/fslmc: use virt2memseg instead of iteration Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 42/70] crypto/dpaa_sec: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 43/70] net/mlx4: " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 44/70] net/mlx5: " Anatoly Burakov
2018-04-17  2:48           ` Yongseok Koh
2018-04-17  9:03             ` Burakov, Anatoly
2018-04-17 18:08               ` Yongseok Koh
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 45/70] memzone: use walk instead of iteration for dumping Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 46/70] vfio: allow to map other memory regions Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 47/70] eal: add legacy memory option Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 48/70] eal: add shared indexed file-backed array Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 49/70] eal: replace memseg with memseg lists Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 50/70] eal: replace memzone array with fbarray Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 51/70] mem: add support for mapping hugepages at runtime Anatoly Burakov
2018-04-17  2:06           ` Yongseok Koh
2018-04-17  7:20             ` Thomas Monjalon
2018-04-17 18:13               ` Yongseok Koh
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 52/70] mem: add support for unmapping pages " Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 53/70] eal: add single file segments command-line option Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 54/70] mem: add internal API to check if memory is contiguous Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 55/70] mem: prepare memseg lists for multiprocess sync Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 56/70] eal: read hugepage counts from node-specific sysfs path Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 57/70] eal: make use of memory hotplug for init Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 58/70] eal: share hugepage info primary and secondary Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 59/70] eal: add secondary process init with memory hotplug Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 60/70] malloc: enable memory hotplug support Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 61/70] malloc: add support for multiprocess memory hotplug Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 62/70] malloc: add support for callbacks on memory events Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 63/70] malloc: enable callbacks on alloc/free and mp sync Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 64/70] vfio: enable support for mem event callbacks Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 65/70] bus/fslmc: move vfio DMA map into bus probe Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 66/70] bus/fslmc: enable support for mem event callbacks for vfio Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 67/70] eal: enable non-legacy memory mode Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 68/70] eal: add memory validator callback Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 69/70] malloc: enable validation before new page allocation Anatoly Burakov
2018-04-11 12:30         ` [dpdk-dev] [PATCH v6 70/70] mem: prevent preallocated pages from being freed Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 01/70] eal: move get_virtual_area out of linuxapp eal_memory.c Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 02/70] eal: move all locking to heap Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 03/70] eal: make malloc heap a doubly-linked list Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 04/70] eal: add function to dump malloc heap contents Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 05/70] test: add command " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 06/70] eal: make malloc_elem_join_adjacent_free public Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 07/70] eal: make malloc free list remove public Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 08/70] eal: make malloc free return resulting malloc element Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 09/70] eal: replace panics with error messages in malloc Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 10/70] eal: add backend support for contiguous allocation Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 11/70] eal: enable reserving physically contiguous memzones Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 12/70] ethdev: use contiguous allocation for DMA memory Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 13/70] crypto/qat: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 14/70] net/avf: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 15/70] net/bnx2x: " Anatoly Burakov
2018-04-11  9:12         ` Thomas Monjalon
2018-04-11  9:18           ` Burakov, Anatoly
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 16/70] net/bnxt: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 17/70] net/cxgbe: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 18/70] net/ena: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 19/70] net/enic: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 20/70] net/i40e: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 21/70] net/qede: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 22/70] net/virtio: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 23/70] net/vmxnet3: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 24/70] mempool: add support for the new allocation methods Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 25/70] eal: add function to walk all memsegs Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 26/70] bus/fslmc: use memseg walk instead of iteration Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 27/70] bus/pci: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 28/70] net/mlx5: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 29/70] eal: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 30/70] mempool: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 31/70] test: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 32/70] vfio/type1: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 33/70] vfio/spapr: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 34/70] eal: add contig walk function Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 35/70] virtio: use memseg contig walk instead of iteration Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 36/70] eal: add iova2virt function Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 37/70] bus/dpaa: use iova2virt instead of memseg iteration Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 38/70] bus/fslmc: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 39/70] crypto/dpaa_sec: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 40/70] eal: add virt2memseg function Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 41/70] bus/fslmc: use virt2memseg instead of iteration Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 42/70] crypto/dpaa_sec: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 43/70] net/mlx4: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 44/70] net/mlx5: " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 45/70] eal: use memzone walk " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 46/70] vfio: allow to map other memory regions Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 47/70] eal: add "legacy memory" option Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 48/70] eal: add rte_fbarray Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 49/70] eal: replace memseg with memseg lists Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 50/70] eal: replace memzone array with fbarray Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 51/70] eal: add support for mapping hugepages at runtime Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 52/70] eal: add support for unmapping pages " Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 53/70] eal: add "single file segments" command-line option Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 54/70] eal: add API to check if memory is contiguous Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 55/70] eal: prepare memseg lists for multiprocess sync Anatoly Burakov
2018-04-09 18:00       ` [dpdk-dev] [PATCH v5 56/70] eal: read hugepage counts from node-specific sysfs path Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 57/70] eal: make use of memory hotplug for init Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 58/70] eal: share hugepage info primary and secondary Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 59/70] eal: add secondary process init with memory hotplug Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 60/70] eal: enable memory hotplug support in rte_malloc Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 61/70] eal: add support for multiprocess memory hotplug Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 62/70] eal: add support for callbacks on " Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 63/70] eal: enable callbacks on malloc/free and mp sync Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 64/70] vfio: enable support for mem event callbacks Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 65/70] bus/fslmc: move vfio DMA map into bus probe Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 66/70] bus/fslmc: enable support for mem event callbacks for vfio Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 67/70] eal: enable non-legacy memory mode Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 68/70] eal: add memory validator callback Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 69/70] eal: enable validation before new page allocation Anatoly Burakov
2018-04-09 18:01       ` [dpdk-dev] [PATCH v5 70/70] eal: prevent preallocated pages from being freed Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 01/70] eal: move get_virtual_area out of linuxapp eal_memory.c Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 02/70] eal: move all locking to heap Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 03/70] eal: make malloc heap a doubly-linked list Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 04/70] eal: add function to dump malloc heap contents Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 05/70] test: add command " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 06/70] eal: make malloc_elem_join_adjacent_free public Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 07/70] eal: make malloc free list remove public Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 08/70] eal: make malloc free return resulting malloc element Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 09/70] eal: replace panics with error messages in malloc Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 10/70] eal: add backend support for contiguous allocation Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 11/70] eal: enable reserving physically contiguous memzones Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 12/70] ethdev: use contiguous allocation for DMA memory Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 13/70] crypto/qat: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 14/70] net/avf: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 15/70] net/bnx2x: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 16/70] net/bnxt: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 17/70] net/cxgbe: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 18/70] net/ena: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 19/70] net/enic: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 20/70] net/i40e: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 21/70] net/qede: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 22/70] net/virtio: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 23/70] net/vmxnet3: " Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 24/70] mempool: add support for the new allocation methods Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 25/70] eal: add function to walk all memsegs Anatoly Burakov
2018-04-08 20:17     ` [dpdk-dev] [PATCH v4 26/70] bus/fslmc: use memseg walk instead of iteration Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 27/70] bus/pci: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 28/70] net/mlx5: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 29/70] eal: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 30/70] mempool: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 31/70] test: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 32/70] vfio/type1: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 33/70] vfio/spapr: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 34/70] eal: add contig walk function Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 35/70] virtio: use memseg contig walk instead of iteration Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 36/70] eal: add iova2virt function Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 37/70] bus/dpaa: use iova2virt instead of memseg iteration Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 38/70] bus/fslmc: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 39/70] crypto/dpaa_sec: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 40/70] eal: add virt2memseg function Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 41/70] bus/fslmc: use virt2memseg instead of iteration Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 42/70] crypto/dpaa_sec: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 43/70] net/mlx4: " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 44/70] net/mlx5: " Anatoly Burakov
2018-04-09 10:26       ` gowrishankar muthukrishnan
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 45/70] eal: use memzone walk " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 46/70] vfio: allow to map other memory regions Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 47/70] eal: add "legacy memory" option Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 48/70] eal: add rte_fbarray Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 49/70] eal: replace memseg with memseg lists Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 50/70] eal: replace memzone array with fbarray Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 51/70] eal: add support for mapping hugepages at runtime Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 52/70] eal: add support for unmapping pages " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 53/70] eal: add "single file segments" command-line option Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 54/70] eal: add API to check if memory is contiguous Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 55/70] eal: prepare memseg lists for multiprocess sync Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 56/70] eal: read hugepage counts from node-specific sysfs path Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 57/70] eal: make use of memory hotplug for init Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 58/70] eal: share hugepage info primary and secondary Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 59/70] eal: add secondary process init with memory hotplug Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 60/70] eal: enable memory hotplug support in rte_malloc Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 61/70] eal: add support for multiprocess memory hotplug Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 62/70] eal: add support for callbacks on " Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 63/70] eal: enable callbacks on malloc/free and mp sync Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 64/70] vfio: enable support for mem event callbacks Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 65/70] bus/fslmc: move vfio DMA map into bus probe Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 66/70] bus/fslmc: enable support for mem event callbacks for vfio Anatoly Burakov
2018-04-09 10:01       ` Shreyansh Jain
2018-04-09 10:55         ` Burakov, Anatoly
2018-04-09 12:09           ` Shreyansh Jain
2018-04-09 12:35             ` Burakov, Anatoly
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 67/70] eal: enable non-legacy memory mode Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 68/70] eal: add memory validator callback Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 69/70] eal: enable validation before new page allocation Anatoly Burakov
2018-04-08 20:18     ` [dpdk-dev] [PATCH v4 70/70] eal: prevent preallocated pages from being freed Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 01/68] eal: move get_virtual_area out of linuxapp eal_memory.c Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 02/68] eal: move all locking to heap Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 03/68] eal: make malloc heap a doubly-linked list Anatoly Burakov
2018-04-03 23:32     ` Stephen Hemminger
2018-04-04  8:05       ` Burakov, Anatoly
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 04/68] eal: add function to dump malloc heap contents Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 05/68] test: add command " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 06/68] eal: make malloc_elem_join_adjacent_free public Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 07/68] eal: make malloc free list remove public Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 08/68] eal: make malloc free return resulting malloc element Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 09/68] eal: replace panics with error messages in malloc Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 10/68] eal: add backend support for contiguous allocation Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 11/68] eal: enable reserving physically contiguous memzones Anatoly Burakov
2018-04-03 23:41     ` Stephen Hemminger
2018-04-04  8:01       ` Burakov, Anatoly
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 12/68] ethdev: use contiguous allocation for DMA memory Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 13/68] crypto/qat: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 14/68] net/avf: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 15/68] net/bnx2x: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 16/68] net/cxgbe: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 17/68] net/ena: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 18/68] net/enic: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 19/68] net/i40e: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 20/68] net/qede: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 21/68] net/virtio: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 22/68] net/vmxnet3: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 23/68] net/bnxt: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 24/68] mempool: add support for the new allocation methods Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 25/68] eal: add function to walk all memsegs Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 26/68] bus/fslmc: use memseg walk instead of iteration Anatoly Burakov
2018-04-05 14:06     ` Shreyansh Jain
2018-04-05 14:14     ` [dpdk-dev] [PATCH] bus/fslmc: support for hotplugging of memory Shreyansh Jain
2018-04-08 17:14       ` Burakov, Anatoly
2018-04-09  7:49         ` Shreyansh Jain
2018-04-09 15:49           ` Burakov, Anatoly
2018-04-09 16:06             ` Shreyansh Jain
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 27/68] bus/pci: use memseg walk instead of iteration Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 28/68] net/mlx5: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 29/68] eal: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 30/68] mempool: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 31/68] test: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 32/68] vfio/type1: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 33/68] vfio/spapr: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 34/68] eal: add contig walk function Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 35/68] virtio: use memseg contig walk instead of iteration Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 36/68] eal: add iova2virt function Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 37/68] bus/dpaa: use iova2virt instead of memseg iteration Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 38/68] bus/fslmc: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 39/68] crypto/dpaa_sec: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 40/68] eal: add virt2memseg function Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 41/68] bus/fslmc: use virt2memseg instead of iteration Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 42/68] net/mlx4: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 43/68] net/mlx5: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 44/68] crypto/dpaa_sec: " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 45/68] eal: use memzone walk " Anatoly Burakov
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 46/68] vfio: allow to map other memory regions Anatoly Burakov
2018-04-04 11:27     ` Burakov, Anatoly
2018-04-05 11:30     ` Burakov, Anatoly
2018-04-03 23:21   ` [dpdk-dev] [PATCH v3 47/68] eal: add "legacy memory" option Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 48/68] eal: add rte_fbarray Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 49/68] eal: replace memseg with memseg lists Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 50/68] eal: replace memzone array with fbarray Anatoly Burakov
2018-04-05 14:23     ` Shreyansh Jain
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 51/68] eal: add support for mapping hugepages at runtime Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 52/68] eal: add support for unmapping pages " Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 53/68] eal: add "single file segments" command-line option Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 54/68] eal: add API to check if memory is contiguous Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 55/68] eal: prepare memseg lists for multiprocess sync Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 56/68] eal: read hugepage counts from node-specific sysfs path Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 57/68] eal: make use of memory hotplug for init Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 58/68] eal: share hugepage info primary and secondary Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 59/68] eal: add secondary process init with memory hotplug Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 60/68] eal: enable memory hotplug support in rte_malloc Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 61/68] eal: add support for multiprocess memory hotplug Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 62/68] eal: add support for callbacks on " Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 63/68] eal: enable callbacks on malloc/free and mp sync Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 64/68] vfio: enable support for mem event callbacks Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 65/68] eal: enable non-legacy memory mode Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 66/68] eal: add memory validator callback Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 67/68] eal: enable validation before new page allocation Anatoly Burakov
2018-04-03 23:22   ` [dpdk-dev] [PATCH v3 68/68] eal: prevent preallocated pages from being freed Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 01/41] eal: move get_virtual_area out of linuxapp eal_memory.c Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 02/41] eal: move all locking to heap Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 03/41] eal: make malloc heap a doubly-linked list Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 04/41] eal: add function to dump malloc heap contents Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 05/41] test: add command " Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 06/41] eal: make malloc_elem_join_adjacent_free public Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 07/41] eal: make malloc free list remove public Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 08/41] eal: make malloc free return resulting malloc element Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 09/41] eal: add rte_fbarray Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 10/41] eal: add "single file segments" command-line option Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 11/41] eal: add "legacy memory" option Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 12/41] eal: read hugepage counts from node-specific sysfs path Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 13/41] eal: replace memseg with memseg lists Anatoly Burakov
2018-03-24  6:01   ` santosh
2018-03-24 11:08     ` Burakov, Anatoly
2018-03-24 12:23       ` santosh
2018-03-24 12:32         ` Burakov, Anatoly
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 14/41] eal: add support for mapping hugepages at runtime Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 15/41] eal: add support for unmapping pages " Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 16/41] eal: make use of memory hotplug for init Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 17/41] eal: enable memory hotplug support in rte_malloc Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 18/41] test: fix malloc autotest to support memory hotplug Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 19/41] eal: add API to check if memory is contiguous Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 20/41] eal: add backend support for contiguous allocation Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 21/41] eal: enable reserving physically contiguous memzones Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 22/41] eal: replace memzone array with fbarray Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 23/41] mempool: add support for the new allocation methods Anatoly Burakov
2018-03-19 17:11   ` Olivier Matz
2018-03-21  7:49     ` Andrew Rybchenko
2018-03-21  8:32       ` Olivier Matz
2018-03-20 11:35   ` Shreyansh Jain
2018-03-20 12:17     ` Burakov, Anatoly
2018-03-23 11:25     ` Burakov, Anatoly
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 24/41] vfio: allow to map other memory regions Anatoly Burakov
2018-03-30  9:42   ` Gowrishankar
2018-04-02 11:36   ` Gowrishankar
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 25/41] eal: map/unmap memory with VFIO when alloc/free pages Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 26/41] eal: prepare memseg lists for multiprocess sync Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 27/41] eal: add multiprocess init with memory hotplug Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 28/41] eal: add support for multiprocess " Anatoly Burakov
2018-03-23 15:44   ` Tan, Jianfeng
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 29/41] eal: add support for callbacks on " Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 30/41] eal: enable callbacks on malloc/free and mp sync Anatoly Burakov
2018-03-07 16:56 ` [dpdk-dev] [PATCH v2 31/41] ethdev: use contiguous allocation for DMA memory Anatoly Burakov
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 32/41] crypto/qat: " Anatoly Burakov
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 33/41] net/avf: " Anatoly Burakov
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 34/41] net/bnx2x: " Anatoly Burakov
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 35/41] net/cxgbe: " Anatoly Burakov
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 36/41] net/ena: " Anatoly Burakov
2018-03-08  9:40   ` Michał Krawczyk
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 37/41] net/enic: " Anatoly Burakov
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 38/41] net/i40e: " Anatoly Burakov
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 39/41] net/qede: " Anatoly Burakov
2018-03-07 22:55   ` Patil, Harish
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 40/41] net/virtio: " Anatoly Burakov
2018-03-28 11:58   ` Maxime Coquelin
2018-03-07 16:57 ` [dpdk-dev] [PATCH v2 41/41] net/vmxnet3: " Anatoly Burakov
2018-03-08 14:40 ` [dpdk-dev] [PATCH 00/41] Memory Hotplug for DPDK Burakov, Anatoly
2018-03-19 17:30 ` Olivier Matz
2018-03-20 10:27   ` Burakov, Anatoly
2018-03-20 12:42     ` Olivier Matz
2018-03-20 13:51       ` Burakov, Anatoly
2018-03-20 14:18         ` Olivier Matz
2018-03-20 14:46           ` Burakov, Anatoly
2018-03-21  9:09 ` gowrishankar muthukrishnan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=18f4ee0ba172f3bb80608694eb283cd496930675.1520083504.git.anatoly.burakov@intel.com \
    --to=anatoly.burakov@intel.com \
    --cc=andras.kovacs@ericsson.com \
    --cc=benjamin.walker@intel.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=hemant.agrawal@nxp.com \
    --cc=jerin.jacob@caviumnetworks.com \
    --cc=jianfeng.tan@intel.com \
    --cc=keith.wiles@intel.com \
    --cc=konstantin.ananyev@intel.com \
    --cc=kuralamudhan.ramakrishnan@intel.com \
    --cc=laszlo.vadkeri@ericsson.com \
    --cc=louise.m.daly@intel.com \
    --cc=maxime.coquelin@redhat.com \
    --cc=nelio.laranjeiro@6wind.com \
    --cc=olivier.matz@6wind.com \
    --cc=pepperjo@japf.ch \
    --cc=thomas@monjalon.net \
    --cc=tiwei.bie@intel.com \
    --cc=yliu@fridaylinux.org \
    --cc=yskoh@mellanox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).