[dpdk-dev] [PATCH 2/5] memool: add stack (lifo) based external mempool handler
Olivier MATZ
olivier.matz at 6wind.com
Thu Feb 4 16:02:45 CET 2016
Hi,
> [PATCH 2/5] memool: add stack (lifo) based external mempool handler
typo in the patch title: memool -> mempool
On 01/26/2016 06:25 PM, David Hunt wrote:
> adds a simple stack based mempool handler
>
> Signed-off-by: David Hunt <david.hunt at intel.com>
What is the purpose of this mempool handler?
Is it an example or is it something that could be useful for
dpdk applications?
If it's just an example, I think we could move this code
in app/test.
> --- a/app/test/test_mempool_perf.c
> +++ b/app/test/test_mempool_perf.c
> @@ -52,7 +52,6 @@
> #include <rte_lcore.h>
> #include <rte_atomic.h>
> #include <rte_branch_prediction.h>
> -#include <rte_ring.h>
> #include <rte_mempool.h>
> #include <rte_spinlock.h>
> #include <rte_malloc.h>
Is this change related?
> +struct rte_mempool_common_stack {
> + /* Spinlock to protect access */
> + rte_spinlock_t sl;
> +
> + uint32_t size;
> + uint32_t len;
> + void *objs[];
> +
> +#ifdef RTE_LIBRTE_MEMPOOL_DEBUG
> +#endif
There is nothing inside the #ifdef
> +static void *
> +common_stack_alloc(struct rte_mempool *mp,
> + const char *name, unsigned n, int socket_id, unsigned flags)
> +{
> + struct rte_mempool_common_stack *s;
> + char stack_name[RTE_RING_NAMESIZE];
> +
> + int size = sizeof(*s) + (n+16)*sizeof(void *);
> +
> + flags = flags;
> +
> + /* Allocate our local memory structure */
> + snprintf(stack_name, sizeof(stack_name), "%s-common-stack", name);
> + s = rte_zmalloc_socket(stack_name,
> + size, RTE_CACHE_LINE_SIZE, socket_id);
> + if (s == NULL) {
> + RTE_LOG(ERR, MEMPOOL, "Cannot allocate stack!\n");
> + return NULL;
> + }
> +
> + /* And the spinlock we use to protect access */
> + rte_spinlock_init(&s->sl);
> +
> + s->size = n;
> + mp->rt_pool = (void *) s;
> + mp->handler_idx = rte_get_mempool_handler("stack");
> +
> + return (void *) s;
> +}
The explicit casts could be removed I think.
> +
> +static int common_stack_put(void *p, void * const *obj_table,
> + unsigned n)
> +{
> + struct rte_mempool_common_stack *s =
> + (struct rte_mempool_common_stack *)p;
indent issue (same in get() and count())
> + void **cache_objs;
> + unsigned index;
> +
> + /* Acquire lock */
> + rte_spinlock_lock(&s->sl);
> + cache_objs = &s->objs[s->len];
> +
> + /* Is there sufficient space in the stack ? */
> + if ((s->len + n) > s->size) {
> + rte_spinlock_unlock(&s->sl);
> + return -ENOENT;
> + }
I think this cannot happen as there is a check in the get().
I wonder if a rte_panic() wouldn't be better here.
Regards,
Olivier
More information about the dev
mailing list