DPDK patches and discussions
 help / color / mirror / Atom feed
From: Olivier Matz <olivier.matz@6wind.com>
To: Gage Eads <gage.eads@intel.com>
Cc: dev@dpdk.org, arybchenko@solarflare.com,
	bruce.richardson@intel.com, konstantin.ananyev@intel.com,
	gavin.hu@arm.com, Honnappa.Nagarahalli@arm.com, nd@arm.com,
	thomas@monjalon.net
Subject: Re: [dpdk-dev] [PATCH 5/7] stack: add non-blocking stack implementation
Date: Mon, 25 Feb 2019 12:28:06 +0100	[thread overview]
Message-ID: <20190225112806.vu3ynlswon3t5zer@platinum> (raw)
In-Reply-To: <20190222160655.3346-6-gage.eads@intel.com>

On Fri, Feb 22, 2019 at 10:06:53AM -0600, Gage Eads wrote:
> This commit adds support for a non-blocking (linked list based) stack to
> the stack API. This behavior is selected through a new rte_stack_create()
> flag, STACK_F_NB.
> 
> The stack consists of a linked list of elements, each containing a data
> pointer and a next pointer, and an atomic stack depth counter.
> 
> The non-blocking push operation enqueues a linked list of pointers by
> pointing the tail of the list to the current stack head, and using a CAS to
> swing the stack head pointer to the head of the list. The operation retries
> if it is unsuccessful (i.e. the list changed between reading the head and
> modifying it), else it adjusts the stack length and returns.
> 
> The non-blocking pop operation first reserves num elements by adjusting the
> stack length, to ensure the dequeue operation will succeed without
> blocking. It then dequeues pointers by walking the list -- starting from
> the head -- then swinging the head pointer (using a CAS as well). While
> walking the list, the data pointers are recorded in an object table.
> 
> This algorithm stack uses a 128-bit compare-and-swap instruction, which
> atomically updates the stack top pointer and a modification counter, to
> protect against the ABA problem.
> 
> The linked list elements themselves are maintained in a non-blocking LIFO,
> and are allocated before stack pushes and freed after stack pops. Since the
> stack has a fixed maximum depth, these elements do not need to be
> dynamically created.
> 
> Signed-off-by: Gage Eads <gage.eads@intel.com>

[...]

> diff --git a/doc/guides/prog_guide/stack_lib.rst b/doc/guides/prog_guide/stack_lib.rst
> index 51689cfe1..86fdc0a9b 100644
> --- a/doc/guides/prog_guide/stack_lib.rst
> +++ b/doc/guides/prog_guide/stack_lib.rst
> @@ -9,7 +9,7 @@ pointers.
>  
>  The stack library provides the following basic operations:
>  
> -*  Create a uniquely named stack of a user-specified size and using a user-specified socket.
> +*  Create a uniquely named stack of a user-specified size and using a user-specified socket, with either lock-based or non-blocking behavior.
>  
>  *  Push and pop a burst of one or more stack objects (pointers). These function are multi-threading safe.
>  

Same comment about 80-cols than in the first patch.

[...]

> --- a/lib/librte_stack/rte_stack.c
> +++ b/lib/librte_stack/rte_stack.c
> @@ -26,27 +26,46 @@ static struct rte_tailq_elem rte_stack_tailq = {
>  EAL_REGISTER_TAILQ(rte_stack_tailq)
>  
>  static void
> +nb_lifo_init(struct rte_stack *s, unsigned int count)
> +{
> +	struct rte_nb_lifo_elem *elems;
> +	unsigned int i;
> +
> +	elems = (struct rte_nb_lifo_elem *)&s[1];
> +	for (i = 0; i < count; i++)
> +		__nb_lifo_push(&s->nb_lifo.free, &elems[i], &elems[i], 1);
> +}

Would it be possible to add:

	 struct rte_nb_lifo {
	 	/** LIFO list of elements */
	 	struct rte_nb_lifo_list used __rte_cache_aligned;
	 	/** LIFO list of free elements */
	 	struct rte_nb_lifo_list free __rte_cache_aligned;
	+	struct rte_nb_lifo_elem elems[];
	 };

I think it is more consistent with the non-blocking structure.

[...]

> --- a/lib/librte_stack/rte_stack.h
> +++ b/lib/librte_stack/rte_stack.h
> @@ -29,6 +29,33 @@ extern "C" {
>  #define RTE_STACK_NAMESIZE (RTE_MEMZONE_NAMESIZE - \
>  			   sizeof(RTE_STACK_MZ_PREFIX) + 1)
>  
> +struct rte_nb_lifo_elem {
> +	void *data;			/**< Data pointer */
> +	struct rte_nb_lifo_elem *next;	/**< Next pointer */
> +};
> +
> +struct rte_nb_lifo_head {
> +	struct rte_nb_lifo_elem *top; /**< Stack top */
> +	uint64_t cnt; /**< Modification counter for avoiding ABA problem */
> +};
> +
> +struct rte_nb_lifo_list {
> +	/** List head */
> +	struct rte_nb_lifo_head head __rte_aligned(16);
> +	/** List len */
> +	rte_atomic64_t len;
> +};
> +
> +/* Structure containing two non-blocking LIFO lists: the stack itself and a
> + * list of free linked-list elements.
> + */
> +struct rte_nb_lifo {
> +	/** LIFO list of elements */
> +	struct rte_nb_lifo_list used __rte_cache_aligned;
> +	/** LIFO list of free elements */
> +	struct rte_nb_lifo_list free __rte_cache_aligned;
> +};
> +

The names "rte_nb_lifo*" bothers me a bit. I think a more usual name
format is "rte_<module_name>_<struct_name>".

What would you think about names like this?
  rte_nb_lifo ->  rte_stack_nb
  rte_nb_lifo_elem -> rte_stack_nb_elem
  rte_nb_lifo_head -> rte_stack_nb_head
  rte_nb_lifo_list -> rte_stack_nb_list
  rte_lifo -> rte_stack_std

I even wonder if "nonblock", "noblk", or "lockless" shouldn't be used
in place of "nb" (which is also a common abbreviation for number). This
can also applies to the STACK_F_NB flag name.

[...]

>  /* Structure containing the LIFO, its current length, and a lock for mutual
>   * exclusion.
>   */
> @@ -48,10 +75,69 @@ struct rte_stack {
>  	const struct rte_memzone *memzone;
>  	uint32_t capacity; /**< Usable size of the stack */
>  	uint32_t flags; /**< Flags supplied at creation */
> -	struct rte_lifo lifo; /**< LIFO structure */
> +	RTE_STD_C11
> +	union {
> +		struct rte_nb_lifo nb_lifo; /**< Non-blocking LIFO structure */
> +		struct rte_lifo lifo;	    /**< LIFO structure */
> +	};
>  } __rte_cache_aligned;
>  
>  /**
> + * The stack uses non-blocking push and pop functions. This flag is only
> + * supported on x86_64 platforms, currently.
> + */
> +#define STACK_F_NB 0x0001

What about adding the RTE_ prefix?

> +static __rte_always_inline unsigned int __rte_experimental
> +rte_nb_lifo_push(struct rte_stack *s, void * const *obj_table, unsigned int n)
> +{
> +	struct rte_nb_lifo_elem *tmp, *first, *last = NULL;
> +	unsigned int i;
> +
> +	if (unlikely(n == 0))
> +		return 0;
> +
> +	/* Pop n free elements */
> +	first = __nb_lifo_pop(&s->nb_lifo.free, n, NULL, NULL);
> +	if (unlikely(first == NULL))
> +		return 0;
> +
> +	/* Construct the list elements */
> +	tmp = first;
> +	for (i = 0; i < n; i++) {
> +		tmp->data = obj_table[n - i - 1];
> +		last = tmp;
> +		tmp = tmp->next;
> +	}
> +
> +	/* Push them to the used list */
> +	__nb_lifo_push(&s->nb_lifo.used, first, last, n);
> +
> +	return n;
> +}

Here, I didn't get why "last" is not retrieved through __nb_lifo_pop(),
like it's done in rte_nb_lifo_pop(). Is there a reason for that?

[...]

> --- /dev/null
> +++ b/lib/librte_stack/rte_stack_c11_mem.h

For the c11 memory model, please consider having an additional reviewer ;)

[...]

> --- /dev/null
> +++ b/lib/librte_stack/rte_stack_generic.h
> @@ -0,0 +1,157 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2019 Intel Corporation
> + */
> +
> +#ifndef _NB_LIFO_GENERIC_H_
> +#define _NB_LIFO_GENERIC_H_
> +
> +#include <rte_branch_prediction.h>
> +#include <rte_prefetch.h>
> +
> +static __rte_always_inline unsigned int
> +rte_nb_lifo_len(struct rte_stack *s)
> +{
> +	/* nb_lifo_push() and nb_lifo_pop() do not update the list's contents
> +	 * and nb_lifo->len atomically, which can cause the list to appear
> +	 * shorter than it actually is if this function is called while other
> +	 * threads are modifying the list.
> +	 *
> +	 * However, given the inherently approximate nature of the get_count
> +	 * callback -- even if the list and its size were updated atomically,
> +	 * the size could change between when get_count executes and when the
> +	 * value is returned to the caller -- this is acceptable.
> +	 *
> +	 * The nb_lifo->len updates are placed such that the list may appear to
> +	 * have fewer elements than it does, but will never appear to have more
> +	 * elements. If the mempool is near-empty to the point that this is a
> +	 * concern, the user should consider increasing the mempool size.
> +	 */
> +	return (unsigned int)rte_atomic64_read(&s->nb_lifo.used.len);
> +}
> +
> +static __rte_always_inline void
> +__nb_lifo_push(struct rte_nb_lifo_list *lifo,
> +	       struct rte_nb_lifo_elem *first,
> +	       struct rte_nb_lifo_elem *last,
> +	       unsigned int num)
> +{
> +#ifndef RTE_ARCH_X86_64
> +	RTE_SET_USED(first);
> +	RTE_SET_USED(last);
> +	RTE_SET_USED(lifo);
> +	RTE_SET_USED(num);
> +#else
> +	struct rte_nb_lifo_head old_head;
> +	int success;
> +
> +	old_head = lifo->head;
> +
> +	do {
> +		struct rte_nb_lifo_head new_head;
> +
> +		/* Swing the top pointer to the first element in the list and
> +		 * make the last element point to the old top.
> +		 */
> +		new_head.top = first;
> +		new_head.cnt = old_head.cnt + 1;
> +
> +		last->next = old_head.top;
> +
> +		/* Ensure the list entry writes are visible before pushing them
> +		 * to the stack.
> +		 */
> +		rte_wmb();
> +
> +		/* old_head is updated on failure */
> +		success = rte_atomic128_cmpxchg((rte_int128_t *)&lifo->head,
> +					       (rte_int128_t *)&old_head,
> +					       (rte_int128_t *)&new_head,
> +					       1, __ATOMIC_RELEASE,
> +					       __ATOMIC_RELAXED);
> +	} while (success == 0);
> +
> +	rte_atomic64_add(&lifo->len, num);
> +#endif
> +}
> +
> +static __rte_always_inline struct rte_nb_lifo_elem *
> +__nb_lifo_pop(struct rte_nb_lifo_list *lifo,
> +	      unsigned int num,
> +	      void **obj_table,
> +	      struct rte_nb_lifo_elem **last)
> +{
> +#ifndef RTE_ARCH_X86_64
> +	RTE_SET_USED(obj_table);
> +	RTE_SET_USED(last);
> +	RTE_SET_USED(lifo);
> +	RTE_SET_USED(num);
> +
> +	return NULL;
> +#else
> +	struct rte_nb_lifo_head old_head;
> +	int success;
> +
> +	/* Reserve num elements, if available */
> +	while (1) {
> +		uint64_t len = rte_atomic64_read(&lifo->len);
> +
> +		/* Does the list contain enough elements? */
> +		if (unlikely(len < num))
> +			return NULL;
> +
> +		if (rte_atomic64_cmpset((volatile uint64_t *)&lifo->len,
> +					len, len - num))
> +			break;
> +	}
> +

Here, accessing the length with a compare and set costs probably more
than a standard atomic sub fonction. I understand that was done for the
reason described above:

	The nb_lifo->len updates are placed such that the list may
	appear to have fewer elements than it does, but will never
	appear to have more elements.

Another strategy could be to use a rte_atomic64_sub() after the effective
pop and change rte_nb_lifo_len() to bound the result to [0:size].

  reply	other threads:[~2019-02-25 11:28 UTC|newest]

Thread overview: 228+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-22 16:06 [dpdk-dev] [PATCH 0/7] Subject: [PATCH ...] Add stack library and new mempool handler Gage Eads
2019-02-22 16:06 ` [dpdk-dev] [PATCH 1/7] stack: introduce rte stack library Gage Eads
2019-02-25 10:43   ` Olivier Matz
2019-02-28  5:10     ` Eads, Gage
2019-02-22 16:06 ` [dpdk-dev] [PATCH 2/7] mempool/stack: convert mempool to use rte stack Gage Eads
2019-02-25 10:46   ` Olivier Matz
2019-02-22 16:06 ` [dpdk-dev] [PATCH 3/7] test/stack: add stack test Gage Eads
2019-02-25 10:59   ` Olivier Matz
2019-02-28  5:11     ` Eads, Gage
2019-02-22 16:06 ` [dpdk-dev] [PATCH 4/7] test/stack: add stack perf test Gage Eads
2019-02-25 11:04   ` Olivier Matz
2019-02-22 16:06 ` [dpdk-dev] [PATCH 5/7] stack: add non-blocking stack implementation Gage Eads
2019-02-25 11:28   ` Olivier Matz [this message]
     [not found]     ` <2EC44CCD3517A842B44C82651A5557A14AF13386@fmsmsx118.amr.corp.intel.com>
2019-03-01 20:53       ` [dpdk-dev] FW: " Eads, Gage
2019-03-01 21:12         ` Thomas Monjalon
2019-03-01 21:29           ` Eads, Gage
2019-02-22 16:06 ` [dpdk-dev] [PATCH 6/7] test/stack: add non-blocking stack tests Gage Eads
2019-02-25 11:28   ` Olivier Matz
2019-02-22 16:06 ` [dpdk-dev] [PATCH 7/7] mempool/stack: add non-blocking stack mempool handler Gage Eads
2019-02-25 11:29   ` Olivier Matz
2019-03-05 16:42 ` [dpdk-dev] [PATCH v2 0/8] Add stack library and new " Gage Eads
2019-03-05 16:42   ` [dpdk-dev] [PATCH v2 1/8] stack: introduce rte stack library Gage Eads
2019-03-05 16:42   ` [dpdk-dev] [PATCH v2 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-03-05 16:42   ` [dpdk-dev] [PATCH v2 3/8] test/stack: add stack test Gage Eads
2019-03-05 16:42   ` [dpdk-dev] [PATCH v2 4/8] test/stack: add stack perf test Gage Eads
2019-03-05 16:42   ` [dpdk-dev] [PATCH v2 5/8] stack: add lock-free stack implementation Gage Eads
2019-03-05 16:42   ` [dpdk-dev] [PATCH v2 6/8] stack: add C11 atomic implementation Gage Eads
2019-03-05 16:42   ` [dpdk-dev] [PATCH v2 7/8] test/stack: add lock-free stack tests Gage Eads
2019-03-05 16:42   ` [dpdk-dev] [PATCH v2 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-03-06 14:45   ` [dpdk-dev] [PATCH v3 0/8] Add stack library and new " Gage Eads
2019-03-06 14:45     ` [dpdk-dev] [PATCH v3 1/8] stack: introduce rte stack library Gage Eads
2019-03-14  8:00       ` Olivier Matz
2019-03-14  8:00         ` Olivier Matz
2019-03-28 23:26       ` Honnappa Nagarahalli
2019-03-28 23:26         ` Honnappa Nagarahalli
2019-03-29 19:23         ` Eads, Gage
2019-03-29 19:23           ` Eads, Gage
2019-03-29 21:07           ` Thomas Monjalon
2019-03-29 21:07             ` Thomas Monjalon
2019-04-01 17:41           ` Honnappa Nagarahalli
2019-04-01 17:41             ` Honnappa Nagarahalli
2019-04-01 19:34             ` Eads, Gage
2019-04-01 19:34               ` Eads, Gage
2019-03-06 14:45     ` [dpdk-dev] [PATCH v3 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-03-06 14:45     ` [dpdk-dev] [PATCH v3 3/8] test/stack: add stack test Gage Eads
2019-03-14  8:00       ` Olivier Matz
2019-03-14  8:00         ` Olivier Matz
2019-03-06 14:45     ` [dpdk-dev] [PATCH v3 4/8] test/stack: add stack perf test Gage Eads
2019-03-06 14:45     ` [dpdk-dev] [PATCH v3 5/8] stack: add lock-free stack implementation Gage Eads
2019-03-14  8:01       ` Olivier Matz
2019-03-14  8:01         ` Olivier Matz
2019-03-28 23:27       ` Honnappa Nagarahalli
2019-03-28 23:27         ` Honnappa Nagarahalli
2019-03-29 19:25         ` Eads, Gage
2019-03-29 19:25           ` Eads, Gage
2019-03-06 14:45     ` [dpdk-dev] [PATCH v3 6/8] stack: add C11 atomic implementation Gage Eads
2019-03-14  8:04       ` Olivier Matz
2019-03-14  8:04         ` Olivier Matz
2019-03-28 23:27       ` Honnappa Nagarahalli
2019-03-28 23:27         ` Honnappa Nagarahalli
2019-03-29 19:24         ` Eads, Gage
2019-03-29 19:24           ` Eads, Gage
2019-04-01  0:06           ` Eads, Gage
2019-04-01  0:06             ` Eads, Gage
2019-04-01 19:06             ` Honnappa Nagarahalli
2019-04-01 19:06               ` Honnappa Nagarahalli
2019-04-01 20:21               ` Eads, Gage
2019-04-01 20:21                 ` Eads, Gage
2019-03-06 14:45     ` [dpdk-dev] [PATCH v3 7/8] test/stack: add lock-free stack tests Gage Eads
2019-03-06 14:45     ` [dpdk-dev] [PATCH v3 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-03-28 18:00     ` [dpdk-dev] [PATCH v4 0/8] Add stack library and new " Gage Eads
2019-03-28 18:00       ` Gage Eads
2019-03-28 18:00       ` [dpdk-dev] [PATCH v4 1/8] stack: introduce rte stack library Gage Eads
2019-03-28 18:00         ` Gage Eads
2019-03-28 18:00       ` [dpdk-dev] [PATCH v4 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-03-28 18:00         ` Gage Eads
2019-03-28 18:00       ` [dpdk-dev] [PATCH v4 3/8] test/stack: add stack test Gage Eads
2019-03-28 18:00         ` Gage Eads
2019-03-28 18:00       ` [dpdk-dev] [PATCH v4 4/8] test/stack: add stack perf test Gage Eads
2019-03-28 18:00         ` Gage Eads
2019-03-28 18:00       ` [dpdk-dev] [PATCH v4 5/8] stack: add lock-free stack implementation Gage Eads
2019-03-28 18:00         ` Gage Eads
2019-03-28 18:00       ` [dpdk-dev] [PATCH v4 6/8] stack: add C11 atomic implementation Gage Eads
2019-03-28 18:00         ` Gage Eads
2019-03-28 18:00       ` [dpdk-dev] [PATCH v4 7/8] test/stack: add lock-free stack tests Gage Eads
2019-03-28 18:00         ` Gage Eads
2019-03-28 18:00       ` [dpdk-dev] [PATCH v4 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-03-28 18:00         ` Gage Eads
2019-04-01  0:12       ` [dpdk-dev] [PATCH v5 0/8] Add stack library and new " Gage Eads
2019-04-01  0:12         ` Gage Eads
2019-04-01  0:12         ` [dpdk-dev] [PATCH v5 1/8] stack: introduce rte stack library Gage Eads
2019-04-01  0:12           ` Gage Eads
2019-04-01  0:12         ` [dpdk-dev] [PATCH v5 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-04-01  0:12           ` Gage Eads
2019-04-01  0:12         ` [dpdk-dev] [PATCH v5 3/8] test/stack: add stack test Gage Eads
2019-04-01  0:12           ` Gage Eads
2019-04-01  0:12         ` [dpdk-dev] [PATCH v5 4/8] test/stack: add stack perf test Gage Eads
2019-04-01  0:12           ` Gage Eads
2019-04-01  0:12         ` [dpdk-dev] [PATCH v5 5/8] stack: add lock-free stack implementation Gage Eads
2019-04-01  0:12           ` Gage Eads
2019-04-01 18:08           ` Honnappa Nagarahalli
2019-04-01 18:08             ` Honnappa Nagarahalli
2019-04-01  0:12         ` [dpdk-dev] [PATCH v5 6/8] stack: add C11 atomic implementation Gage Eads
2019-04-01  0:12           ` Gage Eads
2019-04-01  0:12         ` [dpdk-dev] [PATCH v5 7/8] test/stack: add lock-free stack tests Gage Eads
2019-04-01  0:12           ` Gage Eads
2019-04-01  0:12         ` [dpdk-dev] [PATCH v5 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-04-01  0:12           ` Gage Eads
2019-04-01 21:14         ` [dpdk-dev] [PATCH v6 0/8] Add stack library and new " Gage Eads
2019-04-01 21:14           ` Gage Eads
2019-04-01 21:14           ` [dpdk-dev] [PATCH v6 1/8] stack: introduce rte stack library Gage Eads
2019-04-01 21:14             ` Gage Eads
2019-04-02 11:14             ` Honnappa Nagarahalli
2019-04-02 11:14               ` Honnappa Nagarahalli
2019-04-03 17:06               ` Thomas Monjalon
2019-04-03 17:06                 ` Thomas Monjalon
2019-04-03 17:13                 ` Eads, Gage
2019-04-03 17:13                   ` Eads, Gage
2019-04-03 17:23                   ` Thomas Monjalon
2019-04-03 17:23                     ` Thomas Monjalon
2019-04-01 21:14           ` [dpdk-dev] [PATCH v6 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-04-01 21:14             ` Gage Eads
2019-04-01 21:14           ` [dpdk-dev] [PATCH v6 3/8] test/stack: add stack test Gage Eads
2019-04-01 21:14             ` Gage Eads
2019-04-01 21:14           ` [dpdk-dev] [PATCH v6 4/8] test/stack: add stack perf test Gage Eads
2019-04-01 21:14             ` Gage Eads
2019-04-01 21:14           ` [dpdk-dev] [PATCH v6 5/8] stack: add lock-free stack implementation Gage Eads
2019-04-01 21:14             ` Gage Eads
2019-04-01 21:14           ` [dpdk-dev] [PATCH v6 6/8] stack: add C11 atomic implementation Gage Eads
2019-04-01 21:14             ` Gage Eads
2019-04-02 11:11             ` Honnappa Nagarahalli
2019-04-02 11:11               ` Honnappa Nagarahalli
2019-04-01 21:14           ` [dpdk-dev] [PATCH v6 7/8] test/stack: add lock-free stack tests Gage Eads
2019-04-01 21:14             ` Gage Eads
2019-04-01 21:14           ` [dpdk-dev] [PATCH v6 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-04-01 21:14             ` Gage Eads
2019-04-03 17:04           ` [dpdk-dev] [PATCH v6 0/8] Add stack library and new " Thomas Monjalon
2019-04-03 17:04             ` Thomas Monjalon
2019-04-03 17:10             ` Eads, Gage
2019-04-03 17:10               ` Eads, Gage
2019-04-03 20:09           ` [dpdk-dev] [PATCH v7 " Gage Eads
2019-04-03 20:09             ` Gage Eads
2019-04-03 20:09             ` [dpdk-dev] [PATCH v7 1/8] stack: introduce rte stack library Gage Eads
2019-04-03 20:09               ` Gage Eads
2019-04-03 20:09             ` [dpdk-dev] [PATCH v7 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-04-03 20:09               ` Gage Eads
2019-04-03 20:09             ` [dpdk-dev] [PATCH v7 3/8] test/stack: add stack test Gage Eads
2019-04-03 20:09               ` Gage Eads
2019-04-03 20:09             ` [dpdk-dev] [PATCH v7 4/8] test/stack: add stack perf test Gage Eads
2019-04-03 20:09               ` Gage Eads
2019-04-03 20:09             ` [dpdk-dev] [PATCH v7 5/8] stack: add lock-free stack implementation Gage Eads
2019-04-03 20:09               ` Gage Eads
2019-04-03 20:09             ` [dpdk-dev] [PATCH v7 6/8] stack: add C11 atomic implementation Gage Eads
2019-04-03 20:09               ` Gage Eads
2019-04-03 20:09             ` [dpdk-dev] [PATCH v7 7/8] test/stack: add lock-free stack tests Gage Eads
2019-04-03 20:09               ` Gage Eads
2019-04-03 20:09             ` [dpdk-dev] [PATCH v7 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-04-03 20:09               ` Gage Eads
2019-04-03 20:39             ` [dpdk-dev] [PATCH v7 0/8] Add stack library and new " Thomas Monjalon
2019-04-03 20:39               ` Thomas Monjalon
2019-04-03 20:49               ` Eads, Gage
2019-04-03 20:49                 ` Eads, Gage
2019-04-03 20:50             ` [dpdk-dev] [PATCH v8 " Gage Eads
2019-04-03 20:50               ` Gage Eads
2019-04-03 20:50               ` [dpdk-dev] [PATCH v8 1/8] stack: introduce rte stack library Gage Eads
2019-04-03 20:50                 ` Gage Eads
2019-04-03 20:50               ` [dpdk-dev] [PATCH v8 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-04-03 20:50                 ` Gage Eads
2019-04-03 20:50               ` [dpdk-dev] [PATCH v8 3/8] test/stack: add stack test Gage Eads
2019-04-03 20:50                 ` Gage Eads
2019-04-03 22:41                 ` Thomas Monjalon
2019-04-03 22:41                   ` Thomas Monjalon
2019-04-03 23:05                   ` Eads, Gage
2019-04-03 23:05                     ` Eads, Gage
2019-04-03 20:50               ` [dpdk-dev] [PATCH v8 4/8] test/stack: add stack perf test Gage Eads
2019-04-03 20:50                 ` Gage Eads
2019-04-03 20:50               ` [dpdk-dev] [PATCH v8 5/8] stack: add lock-free stack implementation Gage Eads
2019-04-03 20:50                 ` Gage Eads
2019-04-03 20:50               ` [dpdk-dev] [PATCH v8 6/8] stack: add C11 atomic implementation Gage Eads
2019-04-03 20:50                 ` Gage Eads
2019-04-03 20:50               ` [dpdk-dev] [PATCH v8 7/8] test/stack: add lock-free stack tests Gage Eads
2019-04-03 20:50                 ` Gage Eads
2019-04-03 20:50               ` [dpdk-dev] [PATCH v8 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-04-03 20:50                 ` Gage Eads
2019-04-03 23:20               ` [dpdk-dev] [PATCH v9 0/8] Add stack library and new " Gage Eads
2019-04-03 23:20                 ` Gage Eads
2019-04-03 23:20                 ` [dpdk-dev] [PATCH v9 1/8] stack: introduce rte stack library Gage Eads
2019-04-03 23:20                   ` Gage Eads
2019-04-04 13:30                   ` Thomas Monjalon
2019-04-04 13:30                     ` Thomas Monjalon
2019-04-04 14:14                     ` Eads, Gage
2019-04-04 14:14                       ` Eads, Gage
2019-04-03 23:20                 ` [dpdk-dev] [PATCH v9 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-04-03 23:20                   ` Gage Eads
2019-04-03 23:20                 ` [dpdk-dev] [PATCH v9 3/8] test/stack: add stack test Gage Eads
2019-04-03 23:20                   ` Gage Eads
2019-04-04  7:34                   ` Thomas Monjalon
2019-04-04  7:34                     ` Thomas Monjalon
2019-04-03 23:20                 ` [dpdk-dev] [PATCH v9 4/8] test/stack: add stack perf test Gage Eads
2019-04-03 23:20                   ` Gage Eads
2019-04-03 23:20                 ` [dpdk-dev] [PATCH v9 5/8] stack: add lock-free stack implementation Gage Eads
2019-04-03 23:20                   ` Gage Eads
2019-04-03 23:20                 ` [dpdk-dev] [PATCH v9 6/8] stack: add C11 atomic implementation Gage Eads
2019-04-03 23:20                   ` Gage Eads
2019-04-03 23:20                 ` [dpdk-dev] [PATCH v9 7/8] test/stack: add lock-free stack tests Gage Eads
2019-04-03 23:20                   ` Gage Eads
2019-04-03 23:20                 ` [dpdk-dev] [PATCH v9 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-04-03 23:20                   ` Gage Eads
2019-04-04 10:01                 ` [dpdk-dev] [PATCH v10 0/8] Add stack library and new " Gage Eads
2019-04-04 10:01                   ` Gage Eads
2019-04-04 10:01                   ` [dpdk-dev] [PATCH v10 1/8] stack: introduce rte stack library Gage Eads
2019-04-04 10:01                     ` Gage Eads
2019-04-04 10:01                   ` [dpdk-dev] [PATCH v10 2/8] mempool/stack: convert mempool to use rte stack Gage Eads
2019-04-04 10:01                     ` Gage Eads
2019-04-04 10:01                   ` [dpdk-dev] [PATCH v10 3/8] test/stack: add stack test Gage Eads
2019-04-04 10:01                     ` Gage Eads
2019-04-04 10:01                   ` [dpdk-dev] [PATCH v10 4/8] test/stack: add stack perf test Gage Eads
2019-04-04 10:01                     ` Gage Eads
2019-04-04 10:01                   ` [dpdk-dev] [PATCH v10 5/8] stack: add lock-free stack implementation Gage Eads
2019-04-04 10:01                     ` Gage Eads
2019-04-04 10:01                   ` [dpdk-dev] [PATCH v10 6/8] stack: add C11 atomic implementation Gage Eads
2019-04-04 10:01                     ` Gage Eads
2019-04-04 10:01                   ` [dpdk-dev] [PATCH v10 7/8] test/stack: add lock-free stack tests Gage Eads
2019-04-04 10:01                     ` Gage Eads
2019-04-04 10:01                   ` [dpdk-dev] [PATCH v10 8/8] mempool/stack: add lock-free stack mempool handler Gage Eads
2019-04-04 10:01                     ` Gage Eads
2019-04-04 15:42                   ` [dpdk-dev] [PATCH v10 0/8] Add stack library and new " Thomas Monjalon
2019-04-04 15:42                     ` Thomas Monjalon

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=20190225112806.vu3ynlswon3t5zer@platinum \
    --to=olivier.matz@6wind.com \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=arybchenko@solarflare.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=gage.eads@intel.com \
    --cc=gavin.hu@arm.com \
    --cc=konstantin.ananyev@intel.com \
    --cc=nd@arm.com \
    --cc=thomas@monjalon.net \
    /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).