All of lore.kernel.org
 help / color / mirror / Atom feed
From: Olivier Matz <olivier.matz@6wind.com>
To: dev@dpdk.org
Subject: [RFC 16/35] mempool: store memory chunks in a list
Date: Wed,  9 Mar 2016 17:19:22 +0100	[thread overview]
Message-ID: <1457540381-20274-17-git-send-email-olivier.matz@6wind.com> (raw)
In-Reply-To: <1457540381-20274-1-git-send-email-olivier.matz@6wind.com>

Do not use paddr table to store the mempool memory chunks.
This will allow to have several chunks with different virtual addresses.

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
---
 app/test/test_mempool.c          |   2 +-
 lib/librte_mempool/rte_mempool.c | 205 ++++++++++++++++++++++++++-------------
 lib/librte_mempool/rte_mempool.h |  51 +++++-----
 3 files changed, 165 insertions(+), 93 deletions(-)

diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c
index 1503bcf..80d95d5 100644
--- a/app/test/test_mempool.c
+++ b/app/test/test_mempool.c
@@ -123,7 +123,7 @@ test_mempool_basic(void)
 
 	printf("get private data\n");
 	if (rte_mempool_get_priv(mp) != (char *)mp +
-			MEMPOOL_HEADER_SIZE(mp, mp->pg_num, mp->cache_size))
+			MEMPOOL_HEADER_SIZE(mp, mp->cache_size))
 		return -1;
 
 #ifndef RTE_EXEC_ENV_BSD /* rte_mem_virt2phy() not supported on bsd */
diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c
index 7aedc89..ff84f81 100644
--- a/lib/librte_mempool/rte_mempool.c
+++ b/lib/librte_mempool/rte_mempool.c
@@ -141,14 +141,12 @@ mempool_add_elem(struct rte_mempool *mp, void *obj, phys_addr_t physaddr)
 	struct rte_mempool_objhdr *hdr;
 	struct rte_mempool_objtlr *tlr __rte_unused;
 
-	obj = (char *)obj + mp->header_size;
-	physaddr += mp->header_size;
-
 	/* set mempool ptr in header */
 	hdr = RTE_PTR_SUB(obj, sizeof(*hdr));
 	hdr->mp = mp;
 	hdr->physaddr = physaddr;
 	STAILQ_INSERT_TAIL(&mp->elt_list, hdr, next);
+	mp->populated_size++;
 
 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
 	hdr->cookie = RTE_MEMPOOL_HEADER_COOKIE2;
@@ -246,33 +244,6 @@ rte_mempool_obj_iter(struct rte_mempool *mp,
 	return n;
 }
 
-/*
- * Populate  mempool with the objects.
- */
-
-static void
-mempool_obj_populate(void *arg, void *start, void *end,
-	__rte_unused uint32_t idx, phys_addr_t physaddr)
-{
-	struct rte_mempool *mp = arg;
-
-	mempool_add_elem(mp, start, physaddr);
-	mp->elt_va_end = (uintptr_t)end;
-}
-
-static void
-mempool_populate(struct rte_mempool *mp, size_t num, size_t align)
-{
-	uint32_t elt_sz;
-
-	elt_sz = mp->elt_size + mp->header_size + mp->trailer_size;
-
-	mp->size = rte_mempool_obj_mem_iter((void *)mp->elt_va_start,
-		num, elt_sz, align,
-		mp->elt_pa, mp->pg_num, mp->pg_shift,
-		mempool_obj_populate, mp);
-}
-
 /* get the header, trailer and total size of a mempool element. */
 uint32_t
 rte_mempool_calc_obj_size(uint32_t elt_size, uint32_t flags,
@@ -465,6 +436,108 @@ rte_mempool_ring_create(struct rte_mempool *mp)
 	return 0;
 }
 
+/* Free memory chunks used by a mempool. Objects must be in pool */
+static void
+rte_mempool_free_memchunks(struct rte_mempool *mp)
+{
+	struct rte_mempool_memhdr *memhdr;
+	void *elt;
+
+	while (!STAILQ_EMPTY(&mp->elt_list)) {
+		rte_ring_sc_dequeue(mp->ring, &elt);
+		(void)elt;
+		STAILQ_REMOVE_HEAD(&mp->elt_list, next);
+		mp->populated_size--;
+	}
+
+	while (!STAILQ_EMPTY(&mp->mem_list)) {
+		memhdr = STAILQ_FIRST(&mp->mem_list);
+		STAILQ_REMOVE_HEAD(&mp->mem_list, next);
+		rte_free(memhdr);
+		mp->nb_mem_chunks--;
+	}
+}
+
+/* Add objects in the pool, using a physically contiguous memory
+ * zone. Return the number of objects added, or a negative value
+ * on error. */
+static int
+rte_mempool_populate_phys(struct rte_mempool *mp, char *vaddr,
+	phys_addr_t paddr, size_t len)
+{
+	unsigned total_elt_sz;
+	unsigned i = 0;
+	size_t off;
+	struct rte_mempool_memhdr *memhdr;
+
+	/* mempool is already populated */
+	if (mp->populated_size >= mp->size)
+		return -ENOSPC;
+
+	total_elt_sz = mp->header_size + mp->elt_size + mp->trailer_size;
+
+	memhdr = rte_zmalloc("MEMPOOL_MEMHDR", sizeof(*memhdr), 0);
+	if (memhdr == NULL)
+		return -ENOMEM;
+
+	memhdr->mp = mp;
+	memhdr->addr = vaddr;
+	memhdr->phys_addr = paddr;
+	memhdr->len = len;
+
+	if (mp->flags & MEMPOOL_F_NO_CACHE_ALIGN)
+		off = RTE_PTR_ALIGN_CEIL(vaddr, 8) - vaddr;
+	else
+		off = RTE_PTR_ALIGN_CEIL(vaddr, RTE_CACHE_LINE_SIZE) - vaddr;
+
+	while (off + total_elt_sz <= len && mp->populated_size < mp->size) {
+		off += mp->header_size;
+		mempool_add_elem(mp, (char *)vaddr + off, paddr + off);
+		off += mp->elt_size + mp->trailer_size;
+		i++;
+	}
+
+	/* not enough room to store one object */
+	if (i == 0)
+		return -EINVAL;
+
+	STAILQ_INSERT_TAIL(&mp->mem_list, memhdr, next);
+	mp->nb_mem_chunks++;
+	return i;
+}
+
+/* Add objects in the pool, using a table of physical pages. Return the
+ * number of objects added, or a negative value on error. */
+static int
+rte_mempool_populate_phys_tab(struct rte_mempool *mp, char *vaddr,
+	const phys_addr_t paddr[], uint32_t pg_num, uint32_t pg_shift)
+{
+	uint32_t i, n;
+	int ret, cnt = 0;
+	size_t pg_sz = (size_t)1 << pg_shift;
+
+	/* mempool must not be populated */
+	if (mp->nb_mem_chunks != 0)
+		return -EEXIST;
+
+	for (i = 0; i < pg_num && mp->populated_size < mp->size; i += n) {
+
+		/* populate with the largest group of contiguous pages */
+		for (n = 1; (i + n) < pg_num &&
+			     paddr[i] + pg_sz == paddr[i+n]; n++)
+			;
+
+		ret = rte_mempool_populate_phys(mp, vaddr + i * pg_sz,
+			paddr[i], n * pg_sz);
+		if (ret < 0) {
+			rte_mempool_free_memchunks(mp);
+			return ret;
+		}
+		cnt += ret;
+	}
+	return cnt;
+}
+
 /*
  * Create the mempool over already allocated chunk of memory.
  * That external memory buffer can consists of physically disjoint pages.
@@ -491,6 +564,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
 	struct rte_mempool_objsz objsz;
 	void *startaddr;
 	int page_size = getpagesize();
+	int ret;
 
 	/* compilation-time checks */
 	RTE_BUILD_BUG_ON((sizeof(struct rte_mempool) &
@@ -520,7 +594,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
 	}
 
 	/* Check that pg_num and pg_shift parameters are valid. */
-	if (pg_num < RTE_DIM(mp->elt_pa) || pg_shift > MEMPOOL_PG_SHIFT_MAX) {
+	if (pg_num == 0 || pg_shift > MEMPOOL_PG_SHIFT_MAX) {
 		rte_errno = EINVAL;
 		return NULL;
 	}
@@ -567,7 +641,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
 	 * store mempool objects. Otherwise reserve a memzone that is large
 	 * enough to hold mempool header and metadata plus mempool objects.
 	 */
-	mempool_size = MEMPOOL_HEADER_SIZE(mp, pg_num, cache_size);
+	mempool_size = MEMPOOL_HEADER_SIZE(mp, cache_size);
 	mempool_size += private_data_size;
 	mempool_size = RTE_ALIGN_CEIL(mempool_size, RTE_MEMPOOL_ALIGN);
 	if (vaddr == NULL)
@@ -615,6 +689,7 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
 	mp->cache_flushthresh = CALC_CACHE_FLUSHTHRESH(cache_size);
 	mp->private_data_size = private_data_size;
 	STAILQ_INIT(&mp->elt_list);
+	STAILQ_INIT(&mp->mem_list);
 
 	if (rte_mempool_ring_create(mp) < 0)
 		goto exit_unlock;
@@ -624,37 +699,31 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
 	 * The local_cache points to just past the elt_pa[] array.
 	 */
 	mp->local_cache = (struct rte_mempool_cache *)
-			((char *)mp + MEMPOOL_HEADER_SIZE(mp, pg_num, 0));
+			((char *)mp + MEMPOOL_HEADER_SIZE(mp, 0));
 
-	/* calculate address of the first element for continuous mempool. */
-	obj = (char *)mp + MEMPOOL_HEADER_SIZE(mp, pg_num, cache_size) +
-		private_data_size;
-	obj = RTE_PTR_ALIGN_CEIL(obj, RTE_MEMPOOL_ALIGN);
-
-	/* populate address translation fields. */
-	mp->pg_num = pg_num;
-	mp->pg_shift = pg_shift;
-	mp->pg_mask = RTE_LEN2MASK(mp->pg_shift, typeof(mp->pg_mask));
+	/* call the initializer */
+	if (mp_init)
+		mp_init(mp, mp_init_arg);
 
 	/* mempool elements allocated together with mempool */
 	if (vaddr == NULL) {
-		mp->elt_va_start = (uintptr_t)obj;
-		mp->elt_pa[0] = mp->phys_addr +
-			(mp->elt_va_start - (uintptr_t)mp);
+		/* calculate address of the first element for continuous mempool. */
+		obj = (char *)mp + MEMPOOL_HEADER_SIZE(mp, cache_size) +
+			private_data_size;
+		obj = RTE_PTR_ALIGN_CEIL(obj, RTE_MEMPOOL_ALIGN);
+
+		ret = rte_mempool_populate_phys(mp, obj,
+			mp->phys_addr + ((char *)obj - (char *)mp),
+			objsz.total_size * n);
+		if (ret != (int)mp->size)
+			goto exit_unlock;
 	} else {
-		/* mempool elements in a separate chunk of memory. */
-		mp->elt_va_start = (uintptr_t)vaddr;
-		memcpy(mp->elt_pa, paddr, sizeof (mp->elt_pa[0]) * pg_num);
+		ret = rte_mempool_populate_phys_tab(mp, vaddr,
+			paddr, pg_num, pg_shift);
+		if (ret != (int)mp->size)
+			goto exit_unlock;
 	}
 
-	mp->elt_va_end = mp->elt_va_start;
-
-	/* call the initializer */
-	if (mp_init)
-		mp_init(mp, mp_init_arg);
-
-	mempool_populate(mp, n, 1);
-
 	/* call the initializer */
 	if (obj_init)
 		rte_mempool_obj_iter(mp, obj_init, obj_init_arg);
@@ -670,8 +739,10 @@ rte_mempool_xmem_create(const char *name, unsigned n, unsigned elt_size,
 
 exit_unlock:
 	rte_rwlock_write_unlock(RTE_EAL_MEMPOOL_RWLOCK);
-	if (mp != NULL)
+	if (mp != NULL) {
+		rte_mempool_free_memchunks(mp);
 		rte_ring_free(mp->ring);
+	}
 	rte_free(te);
 
 	return NULL;
@@ -864,8 +935,10 @@ rte_mempool_dump(FILE *f, const struct rte_mempool *mp)
 	struct rte_mempool_debug_stats sum;
 	unsigned lcore_id;
 #endif
+	struct rte_mempool_memhdr *memhdr;
 	unsigned common_count;
 	unsigned cache_count;
+	size_t mem_len = 0;
 
 	RTE_VERIFY(f != NULL);
 	RTE_VERIFY(mp != NULL);
@@ -874,7 +947,9 @@ rte_mempool_dump(FILE *f, const struct rte_mempool *mp)
 	fprintf(f, "  flags=%x\n", mp->flags);
 	fprintf(f, "  ring=<%s>@%p\n", mp->ring->name, mp->ring);
 	fprintf(f, "  phys_addr=0x%" PRIx64 "\n", mp->phys_addr);
+	fprintf(f, "  nb_mem_chunks=%u\n", mp->nb_mem_chunks);
 	fprintf(f, "  size=%"PRIu32"\n", mp->size);
+	fprintf(f, "  populated_size=%"PRIu32"\n", mp->populated_size);
 	fprintf(f, "  header_size=%"PRIu32"\n", mp->header_size);
 	fprintf(f, "  elt_size=%"PRIu32"\n", mp->elt_size);
 	fprintf(f, "  trailer_size=%"PRIu32"\n", mp->trailer_size);
@@ -882,17 +957,13 @@ rte_mempool_dump(FILE *f, const struct rte_mempool *mp)
 	       mp->header_size + mp->elt_size + mp->trailer_size);
 
 	fprintf(f, "  private_data_size=%"PRIu32"\n", mp->private_data_size);
-	fprintf(f, "  pg_num=%"PRIu32"\n", mp->pg_num);
-	fprintf(f, "  pg_shift=%"PRIu32"\n", mp->pg_shift);
-	fprintf(f, "  pg_mask=%#tx\n", mp->pg_mask);
-	fprintf(f, "  elt_va_start=%#tx\n", mp->elt_va_start);
-	fprintf(f, "  elt_va_end=%#tx\n", mp->elt_va_end);
-	fprintf(f, "  elt_pa[0]=0x%" PRIx64 "\n", mp->elt_pa[0]);
-
-	if (mp->size != 0)
+
+	STAILQ_FOREACH(memhdr, &mp->mem_list, next)
+		mem_len += memhdr->len;
+	if (mem_len != 0) {
 		fprintf(f, "  avg bytes/object=%#Lf\n",
-			(long double)(mp->elt_va_end - mp->elt_va_start) /
-			mp->size);
+			(long double)mem_len / mp->size);
+	}
 
 	cache_count = rte_mempool_dump_cache(f, mp);
 	common_count = rte_ring_count(mp->ring);
diff --git a/lib/librte_mempool/rte_mempool.h b/lib/librte_mempool/rte_mempool.h
index 3bfdf4d..08bfe05 100644
--- a/lib/librte_mempool/rte_mempool.h
+++ b/lib/librte_mempool/rte_mempool.h
@@ -182,6 +182,25 @@ struct rte_mempool_objtlr {
 };
 
 /**
+ * A list of memory where objects are stored
+ */
+STAILQ_HEAD(rte_mempool_memhdr_list, rte_mempool_memhdr);
+
+/**
+ * Mempool objects memory header structure
+ *
+ * The memory chunks where objects are stored. Each chunk is virtually
+ * and physically contiguous.
+ */
+struct rte_mempool_memhdr {
+	STAILQ_ENTRY(rte_mempool_memhdr) next; /**< Next in list. */
+	struct rte_mempool *mp;  /**< The mempool owning the chunk */
+	void *addr;              /**< Virtual address of the chunk */
+	phys_addr_t phys_addr;   /**< Physical address of the chunk */
+	size_t len;              /**< length of the chunk */
+};
+
+/**
  * The RTE mempool structure.
  */
 struct rte_mempool {
@@ -190,7 +209,7 @@ struct rte_mempool {
 	phys_addr_t phys_addr;           /**< Phys. addr. of mempool struct. */
 	int flags;                       /**< Flags of the mempool. */
 	int socket_id;                   /**< Socket id passed at mempool creation. */
-	uint32_t size;                   /**< Size of the mempool. */
+	uint32_t size;                   /**< Max size of the mempool. */
 	uint32_t cache_size;             /**< Size of per-lcore local cache. */
 	uint32_t cache_flushthresh;
 	/**< Threshold before we flush excess elements. */
@@ -203,26 +222,15 @@ struct rte_mempool {
 
 	struct rte_mempool_cache *local_cache; /**< Per-lcore local cache */
 
+	uint32_t populated_size;         /**< Number of populated objects. */
 	struct rte_mempool_objhdr_list elt_list; /**< List of objects in pool */
+	uint32_t nb_mem_chunks;          /**< Number of memory chunks */
+	struct rte_mempool_memhdr_list mem_list; /**< List of memory chunks */
 
 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
 	/** Per-lcore statistics. */
 	struct rte_mempool_debug_stats stats[RTE_MAX_LCORE];
 #endif
-
-	/* Address translation support, starts from next cache line. */
-
-	/** Number of elements in the elt_pa array. */
-	uint32_t    pg_num __rte_cache_aligned;
-	uint32_t    pg_shift;     /**< LOG2 of the physical pages. */
-	uintptr_t   pg_mask;      /**< physical page mask value. */
-	uintptr_t   elt_va_start;
-	/**< Virtual address of the first mempool object. */
-	uintptr_t   elt_va_end;
-	/**< Virtual address of the <size + 1> mempool object. */
-	phys_addr_t elt_pa[MEMPOOL_PG_NUM_DEFAULT];
-	/**< Array of physical page addresses for the mempool objects buffer. */
-
 }  __rte_cache_aligned;
 
 #define MEMPOOL_F_NO_SPREAD      0x0001 /**< Do not spread among memory channels. */
@@ -253,13 +261,6 @@ struct rte_mempool {
 #endif
 
 /**
- * Size of elt_pa array size based on number of pages. (Internal use)
- */
-#define __PA_SIZE(mp, pgn) \
-	RTE_ALIGN_CEIL((((pgn) - RTE_DIM((mp)->elt_pa)) * \
-	sizeof((mp)->elt_pa[0])), RTE_CACHE_LINE_SIZE)
-
-/**
  * Calculate the size of the mempool header.
  *
  * @param mp
@@ -267,8 +268,8 @@ struct rte_mempool {
  * @param pgn
  *   Number of pages used to store mempool objects.
  */
-#define MEMPOOL_HEADER_SIZE(mp, pgn, cs) \
-	(sizeof(*(mp)) + __PA_SIZE(mp, pgn) + (((cs) == 0) ? 0 : \
+#define MEMPOOL_HEADER_SIZE(mp, cs) \
+	(sizeof(*(mp)) + (((cs) == 0) ? 0 : \
 	(sizeof(struct rte_mempool_cache) * RTE_MAX_LCORE)))
 
 /* return the header of a mempool object (internal) */
@@ -1160,7 +1161,7 @@ void rte_mempool_audit(const struct rte_mempool *mp);
 static inline void *rte_mempool_get_priv(struct rte_mempool *mp)
 {
 	return (char *)mp +
-		MEMPOOL_HEADER_SIZE(mp, mp->pg_num, mp->cache_size);
+		MEMPOOL_HEADER_SIZE(mp, mp->cache_size);
 }
 
 /**
-- 
2.1.4

  parent reply	other threads:[~2016-03-09 16:22 UTC|newest]

Thread overview: 150+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-09 16:19 [RFC 00/35] mempool: rework memory allocation Olivier Matz
2016-03-09 16:19 ` [RFC 01/35] mempool: fix comments and style Olivier Matz
2016-03-09 16:19 ` [RFC 02/35] mempool: replace elt_size by total_elt_size Olivier Matz
2016-03-09 16:19 ` [RFC 03/35] mempool: uninline function to check cookies Olivier Matz
2016-03-09 16:19 ` [RFC 04/35] mempool: use sizeof to get the size of header and trailer Olivier Matz
2016-03-09 16:19 ` [RFC 05/35] mempool: rename mempool_obj_ctor_t as mempool_obj_cb_t Olivier Matz
2016-03-09 16:19 ` [RFC 06/35] mempool: update library version Olivier Matz
2016-03-09 16:19 ` [RFC 07/35] mempool: list objects when added in the mempool Olivier Matz
2016-03-09 16:19 ` [RFC 08/35] mempool: remove const attribute in mempool_walk Olivier Matz
2016-03-09 16:19 ` [RFC 09/35] mempool: use the list to iterate the mempool elements Olivier Matz
2016-03-09 16:19 ` [RFC 10/35] eal: introduce RTE_DECONST macro Olivier Matz
2016-03-09 18:53   ` Stephen Hemminger
2016-03-09 20:47     ` Olivier MATZ
2016-03-09 21:01       ` Stephen Hemminger
2016-03-10  8:11         ` Olivier MATZ
2016-03-11 21:47           ` Stephen Hemminger
2016-03-09 21:22       ` Bruce Richardson
2016-03-10  8:29         ` Olivier MATZ
2016-03-10  9:26           ` Bruce Richardson
2016-03-10 10:05             ` Olivier MATZ
2016-03-09 16:19 ` [RFC 11/35] mempool: use the list to audit all elements Olivier Matz
2016-03-09 16:19 ` [RFC 12/35] mempool: use the list to initialize mempool objects Olivier Matz
2016-03-09 16:19 ` [RFC 13/35] mempool: create the internal ring in a specific function Olivier Matz
2016-03-09 16:19 ` [RFC 14/35] mempool: store physaddr in mempool objects Olivier Matz
2016-03-09 16:19 ` [RFC 15/35] mempool: remove MEMPOOL_IS_CONTIG() Olivier Matz
2016-03-09 16:19 ` Olivier Matz [this message]
2016-03-09 16:19 ` [RFC 17/35] mempool: new function to iterate the memory chunks Olivier Matz
2016-03-09 16:19 ` [RFC 18/35] mempool: simplify xmem_usage Olivier Matz
2016-03-09 16:19 ` [RFC 19/35] mempool: introduce a free callback for memory chunks Olivier Matz
2016-03-09 16:19 ` [RFC 20/35] mempool: make page size optional when getting xmem size Olivier Matz
2016-03-09 16:19 ` [RFC 21/35] mempool: default allocation in several memory chunks Olivier Matz
2016-03-09 16:19 ` [RFC 22/35] eal: lock memory when using no-huge Olivier Matz
2016-03-09 16:19 ` [RFC 23/35] mempool: support no-hugepage mode Olivier Matz
2016-03-09 16:19 ` [RFC 24/35] mempool: replace mempool physaddr by a memzone pointer Olivier Matz
2016-03-09 16:19 ` [RFC 25/35] mempool: introduce a function to free a mempool Olivier Matz
2016-03-09 16:19 ` [RFC 26/35] mempool: introduce a function to create an empty mempool Olivier Matz
2016-03-09 16:19 ` [RFC 27/35] eal/xen: return machine address without knowing memseg id Olivier Matz
2016-03-09 16:19 ` [RFC 28/35] mempool: rework support of xen dom0 Olivier Matz
2016-03-09 16:19 ` [RFC 29/35] mempool: create the internal ring when populating Olivier Matz
2016-03-09 16:19 ` [RFC 30/35] mempool: populate a mempool with anonymous memory Olivier Matz
2016-03-09 16:19 ` [RFC 31/35] test-pmd: remove specific anon mempool code Olivier Matz
2016-03-09 16:19 ` [RFC 32/35] mempool: make mempool populate and free api public Olivier Matz
2016-03-09 16:19 ` [RFC 33/35] mem: avoid memzone/mempool/ring name truncation Olivier Matz
2016-03-09 16:19 ` [RFC 34/35] mempool: new flag when phys contig mem is not needed Olivier Matz
2016-03-09 16:19 ` [RFC 35/35] mempool: update copyright Olivier Matz
2016-03-09 18:52   ` Stephen Hemminger
2016-03-10 14:57     ` Panu Matilainen
2016-03-09 16:44 ` [RFC 00/35] mempool: rework memory allocation Olivier MATZ
2016-03-17  9:05 ` [PATCH] doc: mempool ABI deprecation notice for 16.07 Olivier Matz
2016-04-04 14:38   ` Thomas Monjalon
2016-04-05  9:27     ` Hunt, David
2016-04-05 14:08       ` Wiles, Keith
2016-04-05 15:17         ` Thomas Monjalon
2016-04-14 10:19 ` [PATCH 00/36] mempool: rework memory allocation Olivier Matz
2016-04-14 10:19   ` [PATCH 01/36] mempool: fix comments and style Olivier Matz
2016-04-14 14:15     ` Wiles, Keith
2016-04-14 10:19   ` [PATCH 02/36] mempool: replace elt_size by total_elt_size Olivier Matz
2016-04-14 14:18     ` Wiles, Keith
2016-04-14 10:19   ` [PATCH 03/36] mempool: uninline function to check cookies Olivier Matz
2016-04-14 10:19   ` [PATCH 04/36] mempool: use sizeof to get the size of header and trailer Olivier Matz
2016-04-14 10:19   ` [PATCH 05/36] mempool: rename mempool_obj_ctor_t as mempool_obj_cb_t Olivier Matz
2016-04-14 10:19   ` [PATCH 06/36] mempool: update library version Olivier Matz
2016-04-15 12:38     ` Olivier Matz
2016-04-14 10:19   ` [PATCH 07/36] mempool: list objects when added in the mempool Olivier Matz
2016-04-14 10:19   ` [PATCH 08/36] mempool: remove const attribute in mempool_walk Olivier Matz
2016-04-14 10:19   ` [PATCH 09/36] mempool: remove const qualifier in dump and audit Olivier Matz
2016-04-14 10:19   ` [PATCH 10/36] mempool: use the list to iterate the mempool elements Olivier Matz
2016-04-14 15:33     ` Wiles, Keith
2016-04-15  7:31       ` Olivier Matz
2016-04-15 13:19         ` Wiles, Keith
2016-05-11 10:02     ` [PATCH v2 " Olivier Matz
2016-04-14 10:19   ` [PATCH 11/36] mempool: use the list to audit all elements Olivier Matz
2016-04-14 10:19   ` [PATCH 12/36] mempool: use the list to initialize mempool objects Olivier Matz
2016-04-14 10:19   ` [PATCH 13/36] mempool: create the internal ring in a specific function Olivier Matz
2016-04-14 10:19   ` [PATCH 14/36] mempool: store physaddr in mempool objects Olivier Matz
2016-04-14 15:40     ` Wiles, Keith
2016-04-15  7:34       ` Olivier Matz
2016-04-14 10:19   ` [PATCH 15/36] mempool: remove MEMPOOL_IS_CONTIG() Olivier Matz
2016-04-14 10:19   ` [PATCH 16/36] mempool: store memory chunks in a list Olivier Matz
2016-04-14 10:19   ` [PATCH 17/36] mempool: new function to iterate the memory chunks Olivier Matz
2016-04-14 10:19   ` [PATCH 18/36] mempool: simplify xmem_usage Olivier Matz
2016-04-14 10:19   ` [PATCH 19/36] mempool: introduce a free callback for memory chunks Olivier Matz
2016-04-14 10:19   ` [PATCH 20/36] mempool: make page size optional when getting xmem size Olivier Matz
2016-04-14 10:19   ` [PATCH 21/36] mempool: default allocation in several memory chunks Olivier Matz
2016-04-14 10:19   ` [PATCH 22/36] eal: lock memory when using no-huge Olivier Matz
2016-04-14 10:19   ` [PATCH 23/36] mempool: support no-hugepage mode Olivier Matz
2016-04-14 10:19   ` [PATCH 24/36] mempool: replace mempool physaddr by a memzone pointer Olivier Matz
2016-04-14 10:19   ` [PATCH 25/36] mempool: introduce a function to free a mempool Olivier Matz
2016-04-14 10:19   ` [PATCH 26/36] mempool: introduce a function to create an empty mempool Olivier Matz
2016-04-14 15:57     ` Wiles, Keith
2016-04-15  7:42       ` Olivier Matz
2016-04-15 13:26         ` Wiles, Keith
2016-04-14 10:19   ` [PATCH 27/36] eal/xen: return machine address without knowing memseg id Olivier Matz
2016-04-14 10:19   ` [PATCH 28/36] mempool: rework support of xen dom0 Olivier Matz
2016-04-14 10:19   ` [PATCH 29/36] mempool: create the internal ring when populating Olivier Matz
2016-04-14 10:19   ` [PATCH 30/36] mempool: populate a mempool with anonymous memory Olivier Matz
2016-04-14 10:19   ` [PATCH 31/36] mempool: make mempool populate and free api public Olivier Matz
2016-04-14 10:19   ` [PATCH 32/36] test-pmd: remove specific anon mempool code Olivier Matz
2016-04-14 10:19   ` [PATCH 33/36] mem: avoid memzone/mempool/ring name truncation Olivier Matz
2016-04-14 10:19   ` [PATCH 34/36] mempool: new flag when phys contig mem is not needed Olivier Matz
2016-04-14 10:19   ` [PATCH 35/36] app/test: rework mempool test Olivier Matz
2016-04-14 10:19   ` [PATCH 36/36] mempool: update copyright Olivier Matz
2016-04-14 13:50   ` [PATCH 00/36] mempool: rework memory allocation Wiles, Keith
2016-04-14 14:01     ` Olivier MATZ
2016-04-14 14:03       ` Wiles, Keith
2016-04-14 14:20       ` Hunt, David
2016-05-18 11:04   ` [PATCH v3 00/35] " Olivier Matz
2016-05-18 11:04     ` [PATCH v3 01/35] mempool: rework comments and style Olivier Matz
2016-05-18 11:04     ` [PATCH v3 02/35] mempool: rename element size variables Olivier Matz
2016-05-18 11:04     ` [PATCH v3 03/35] mempool: uninline function to check cookies Olivier Matz
2016-05-18 11:04     ` [PATCH v3 04/35] mempool: use sizeof to get the size of header and trailer Olivier Matz
2016-05-18 11:04     ` [PATCH v3 05/35] mempool: rename object constructor typedef Olivier Matz
2016-05-18 11:04     ` [PATCH v3 06/35] mempool: list objects when added Olivier Matz
2016-05-18 11:04     ` [PATCH v3 07/35] mempool: remove const qualifier when browsing pools Olivier Matz
2016-05-18 11:04     ` [PATCH v3 08/35] mempool: remove const qualifier in dump and audit Olivier Matz
2016-05-18 11:04     ` [PATCH v3 09/35] mempool: use the list to iterate the elements Olivier Matz
2016-05-18 11:04     ` [PATCH v3 10/35] mempool: use the list to audit all elements Olivier Matz
2016-05-18 11:04     ` [PATCH v3 11/35] mempool: use the list to initialize objects Olivier Matz
2016-05-18 11:04     ` [PATCH v3 12/35] mempool: create internal ring in a specific function Olivier Matz
2016-05-18 11:04     ` [PATCH v3 13/35] mempool: store physical address in objects Olivier Matz
2016-05-25 17:51       ` Jain, Deepak K
2016-05-25 19:41         ` Olivier Matz
2016-05-18 11:04     ` [PATCH v3 14/35] mempool: remove macro to check if contiguous Olivier Matz
2016-05-18 11:04     ` [PATCH v3 15/35] mempool: store memory chunks in a list Olivier Matz
2016-05-18 11:04     ` [PATCH v3 16/35] mempool: add function to iterate the memory chunks Olivier Matz
2016-05-18 11:04     ` [PATCH v3 17/35] mempool: simplify the memory usage calculation Olivier Matz
2016-05-18 11:04     ` [PATCH v3 18/35] mempool: introduce a free callback for memory chunks Olivier Matz
2016-05-18 11:04     ` [PATCH v3 19/35] mempool: get memory size with unspecified page size Olivier Matz
2016-05-18 11:04     ` [PATCH v3 20/35] mempool: allocate in several memory chunks by default Olivier Matz
2016-06-01  3:37       ` Ferruh Yigit
2016-05-18 11:04     ` [PATCH v3 21/35] eal: lock memory when not using hugepages Olivier Matz
2016-05-18 11:04     ` [PATCH v3 22/35] mempool: support no hugepage mode Olivier Matz
2016-05-18 11:04     ` [PATCH v3 23/35] mempool: replace physical address by a memzone pointer Olivier Matz
2016-05-18 11:04     ` [PATCH v3 24/35] mempool: introduce a function to free a pool Olivier Matz
2016-05-18 11:04     ` [PATCH v3 25/35] mempool: introduce a function to create an empty pool Olivier Matz
2016-05-18 11:04     ` [PATCH v3 26/35] eal/xen: return machine address without knowing memseg id Olivier Matz
2016-05-18 11:04     ` [PATCH v3 27/35] mempool: rework support of Xen dom0 Olivier Matz
2016-05-18 11:04     ` [PATCH v3 28/35] mempool: create the internal ring when populating Olivier Matz
2016-05-18 11:04     ` [PATCH v3 29/35] mempool: populate with anonymous memory Olivier Matz
2016-05-18 11:04     ` [PATCH v3 30/35] mempool: make mempool populate and free api public Olivier Matz
2016-05-18 11:04     ` [PATCH v3 31/35] app/testpmd: remove anonymous mempool code Olivier Matz
2016-05-18 11:04     ` [PATCH v3 32/35] mem: avoid memzone/mempool/ring name truncation Olivier Matz
2016-05-18 11:04     ` [PATCH v3 33/35] mempool: add flag for removing phys contiguous constraint Olivier Matz
2016-05-18 11:04     ` [PATCH v3 34/35] app/test: rework mempool test Olivier Matz
2016-05-18 11:04     ` [PATCH v3 35/35] doc: update release notes about mempool allocation Olivier Matz
2016-05-19 12:47     ` [PATCH v3 00/35] mempool: rework memory allocation Thomas Monjalon
2016-05-20  8:42       ` Panu Matilainen
2016-05-20  9:09         ` Thomas Monjalon
2016-05-23  7:43           ` Olivier Matz
2016-06-13 10:27             ` Olivier Matz

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=1457540381-20274-17-git-send-email-olivier.matz@6wind.com \
    --to=olivier.matz@6wind.com \
    --cc=dev@dpdk.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.