[dpdk-dev] [PATCH v2 2/2] mempool/nb_stack: add non-blocking stack mempool
Andrew Rybchenko
arybchenko at solarflare.com
Wed Jan 16 08:13:26 CET 2019
On 1/16/19 1:32 AM, Gage Eads wrote:
> This commit adds support for non-blocking (linked list based) stack mempool
> handler. The stack uses a 128-bit compare-and-swap instruction, and thus is
> limited to x86_64. The 128-bit CAS atomically updates the stack top pointer
> and a modification counter, which protects against the ABA problem.
>
> In mempool_perf_autotest the lock-based stack outperforms the non-blocking
> handler*, however:
> - For applications with preemptible pthreads, a lock-based stack's
> worst-case performance (i.e. one thread being preempted while
> holding the spinlock) is much worse than the non-blocking stack's.
> - Using per-thread mempool caches will largely mitigate the performance
> difference.
>
> *Test setup: x86_64 build with default config, dual-socket Xeon E5-2699 v4,
> running on isolcpus cores with a tickless scheduler. The lock-based stack's
> rate_persec was 1x-3.5x the non-blocking stack's.
>
> Signed-off-by: Gage Eads <gage.eads at intel.com>
> ---
Few minor nits below. Other than that
Acked-by: Andrew Rybchenko <arybchenko at solarflare.com>
Don't forget about release notes when 19.05 release cycle starts.
[snip]
> diff --git a/drivers/mempool/meson.build b/drivers/mempool/meson.build
> index 4527d9806..01ee30fee 100644
> --- a/drivers/mempool/meson.build
> +++ b/drivers/mempool/meson.build
> @@ -2,6 +2,11 @@
> # Copyright(c) 2017 Intel Corporation
>
> drivers = ['bucket', 'dpaa', 'dpaa2', 'octeontx', 'ring', 'stack']
> +
> +if dpdk_conf.has('RTE_ARCH_X86_64')
> + drivers += 'nb_stack'
> +endif
> +
I think it would be better to concentrate the logic inside
nb_stack/meson.build.
There is a 'build' variable which may be set to false disable the build.
You can find an example in drivers/net/sfc/meson.build.
[snip]
> +static __rte_always_inline void
> +nb_lifo_push(struct nb_lifo *lifo,
> + struct nb_lifo_elem *first,
> + struct nb_lifo_elem *last,
> + unsigned int num)
> +{
> + while (1) {
> + struct nb_lifo_head old_head, new_head;
> +
> + old_head = lifo->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;
> +
> + if (rte_atomic128_cmpset((volatile uint64_t *) &lifo->head,
Unnecessary space after type cast above.
[snip]
> + new_head.top = tmp;
> + new_head.cnt = old_head.cnt + 1;
> +
> + if (rte_atomic128_cmpset((volatile uint64_t *) &lifo->head,
Unnecessary space after type cast above.
[snip]
More information about the dev
mailing list