[dpdk-dev] [PATCH v7 0/8] Add stack library and new mempool handler
Gage Eads
gage.eads at intel.com
Wed Apr 3 22:09:08 CEST 2019
This patchset introduces a stack library, supporting both lock-based and
lock-free stacks, and a lock-free stack mempool handler.
The lock-based stack code is derived from the existing stack mempool handler,
and that handler is refactored to use the stack library.
The lock-free stack mempool handler is intended for usages where the rte
ring's "non-preemptive" constraint is not acceptable; for example, if the
application uses a mixture of pinned high-priority threads and multiplexed
low-priority threads that share a mempool.
Note that the lock-free algorithm relies on a 128-bit compare-and-swap[1],
so it is currently limited to the x86_64 platform.
This patchset is the successor to a patchset containing only the new mempool
handler[2].
[1] http://mails.dpdk.org/archives/dev/2019-April/129014.html
[2] http://mails.dpdk.org/archives/dev/2019-January/123555.html
---
v7:
- Add rte_branch_prediction.h include to rte_stack_std.h for unlikely()
- Add rte_compat.h include to rte_stack.h for __rte_experimental
v6:
- Add load-acquire fence to the lock-free push function
- Correct generic implementation's pop_elems 128b CAS success and failure
memorder to match those in the C11 implementation.
v5:
- Add comment to explain padding in *_get_memsize() functions
- Prefix internal functions with '__'
- Use RTE_ASSERT for performance critical run-time checks
- Don't use __atomic_load in the C11 pop_elems function, and put an acquire
thread fence at the start of the 2nd do-while loop
- Change pop_elems 128b CAS success memorder to RELEASE and failure memorder to
RELAXED
- Change compile-time assertion to run for all 64-bit architectures
- Reorganize the code with standard and lock-free .c and .h files
v4:
- Fix 32-bit build error in test_stack.c by using %zu format specifier for
size_t
- Rebase onto master
v3:
- Rebase patchset onto master (test/test/ -> app/test/)
- Fix rte_stack_std_push() segfault introduced in v2
v2:
- Reworked structure and function naming to use rte_stack_{std, lf}_...
- Updated to the latest rte_atomic128_cmp_exchange() interface.
- Rename STACK_F_NB -> RTE_STACK_F_LF.
- Remove rte_rmb() and rte_wmb() from the generic push and pop implementations.
These are obviated by rte_atomic128_cmp_exchange()'s two memorder arguments.
- Edit stack_lib.rst text to 80 chars/line.
- Fix rte_stack.h doxygen formatting.
- Allocate popped_objs array from the heap
- Fix stack_thread_push_pop bug ("&t->sz" -> "t->sz")
- Remove unnecessary NULL check from test_stack_basic
- Properly terminate the name string in test_stack_name_length
- Add an empty array of struct rte_nb_lifo_elem elements
- In rte_nb_lifo_push(), retrieve the last element from __nb_lifo_pop()
- Split C11 implementation into a separate patchset
Gage Eads (8):
stack: introduce rte stack library
mempool/stack: convert mempool to use rte stack
test/stack: add stack test
test/stack: add stack perf test
stack: add lock-free stack implementation
stack: add C11 atomic implementation
test/stack: add lock-free stack tests
mempool/stack: add lock-free stack mempool handler
MAINTAINERS | 9 +-
app/test/Makefile | 3 +
app/test/meson.build | 7 +
app/test/test_stack.c | 423 ++++++++++++++++++++++++
app/test/test_stack_perf.c | 356 ++++++++++++++++++++
config/common_base | 5 +
doc/api/doxy-api-index.md | 1 +
doc/api/doxy-api.conf.in | 1 +
doc/guides/prog_guide/env_abstraction_layer.rst | 10 +
doc/guides/prog_guide/index.rst | 1 +
doc/guides/prog_guide/stack_lib.rst | 83 +++++
doc/guides/rel_notes/release_19_05.rst | 13 +
drivers/mempool/stack/Makefile | 3 +-
drivers/mempool/stack/meson.build | 6 +-
drivers/mempool/stack/rte_mempool_stack.c | 115 +++----
lib/Makefile | 2 +
lib/librte_stack/Makefile | 29 ++
lib/librte_stack/meson.build | 12 +
lib/librte_stack/rte_stack.c | 196 +++++++++++
lib/librte_stack/rte_stack.h | 260 +++++++++++++++
lib/librte_stack/rte_stack_lf.c | 31 ++
lib/librte_stack/rte_stack_lf.h | 106 ++++++
lib/librte_stack/rte_stack_lf_c11.h | 175 ++++++++++
lib/librte_stack/rte_stack_lf_generic.h | 164 +++++++++
lib/librte_stack/rte_stack_pvt.h | 34 ++
lib/librte_stack/rte_stack_std.c | 26 ++
lib/librte_stack/rte_stack_std.h | 121 +++++++
lib/librte_stack/rte_stack_version.map | 9 +
lib/meson.build | 2 +-
mk/rte.app.mk | 1 +
30 files changed, 2132 insertions(+), 72 deletions(-)
create mode 100644 app/test/test_stack.c
create mode 100644 app/test/test_stack_perf.c
create mode 100644 doc/guides/prog_guide/stack_lib.rst
create mode 100644 lib/librte_stack/Makefile
create mode 100644 lib/librte_stack/meson.build
create mode 100644 lib/librte_stack/rte_stack.c
create mode 100644 lib/librte_stack/rte_stack.h
create mode 100644 lib/librte_stack/rte_stack_lf.c
create mode 100644 lib/librte_stack/rte_stack_lf.h
create mode 100644 lib/librte_stack/rte_stack_lf_c11.h
create mode 100644 lib/librte_stack/rte_stack_lf_generic.h
create mode 100644 lib/librte_stack/rte_stack_pvt.h
create mode 100644 lib/librte_stack/rte_stack_std.c
create mode 100644 lib/librte_stack/rte_stack_std.h
create mode 100644 lib/librte_stack/rte_stack_version.map
--
2.13.6
More information about the dev
mailing list