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.e...@intel.com>
---

Few minor nits below. Other than that
Acked-by: Andrew Rybchenko <arybche...@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]

Reply via email to