doc: add stack mempool guide
This guide describes the two stack modes, their tradeoffs, and (via a reference to the mempool guide) how to enable them. Signed-off-by: Gage Eads <gage.eads@intel.com> Reviewed-by: Olivier Matz <olivier.matz@6wind.com>
This commit is contained in:
parent
7fde94b2df
commit
1fb6301ccb
@ -14,3 +14,4 @@ application through the mempool API.
|
|||||||
octeontx
|
octeontx
|
||||||
octeontx2
|
octeontx2
|
||||||
ring
|
ring
|
||||||
|
stack
|
||||||
|
43
doc/guides/mempool/stack.rst
Normal file
43
doc/guides/mempool/stack.rst
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
.. SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
Copyright(c) 2020 Intel Corporation.
|
||||||
|
|
||||||
|
Stack Mempool Driver
|
||||||
|
====================
|
||||||
|
|
||||||
|
**rte_mempool_stack** is a pure software mempool driver based on the
|
||||||
|
``rte_stack`` DPDK library. For run-to-completion workloads with sufficiently
|
||||||
|
large per-lcore caches, the mbufs will likely stay in the per-lcore caches and
|
||||||
|
the mempool type (ring, stack, etc.) will have a negligible impact on
|
||||||
|
performance. However a stack-based mempool is often better suited to pipelined
|
||||||
|
packet-processing workloads (which allocate and free mbufs on different lcores)
|
||||||
|
than a ring-based mempool, since its LIFO behavior results in better temporal
|
||||||
|
locality and a minimal memory footprint even if the mempool is
|
||||||
|
over-provisioned. Users are encouraged to benchmark with multiple mempool types
|
||||||
|
to determine which works best for their specific application.
|
||||||
|
|
||||||
|
The following modes of operation are available for the stack mempool driver and
|
||||||
|
can be selected as described in :ref:`Mempool_Handlers`:
|
||||||
|
|
||||||
|
- ``stack``
|
||||||
|
|
||||||
|
The underlying **rte_stack** operates in standard (lock-based) mode.
|
||||||
|
For more information please refer to :ref:`Stack_Library_Std_Stack`.
|
||||||
|
|
||||||
|
- ``lf_stack``
|
||||||
|
|
||||||
|
The underlying **rte_stack** operates in lock-free mode. For more
|
||||||
|
information please refer to :ref:`Stack_Library_LF_Stack`.
|
||||||
|
|
||||||
|
The standard stack outperforms the lock-free stack on average, however the
|
||||||
|
standard stack is non-preemptive: if a mempool user is preempted while holding
|
||||||
|
the stack lock, that thread will block all other mempool accesses until it
|
||||||
|
returns and releases the lock. As a result, an application using the standard
|
||||||
|
stack whose threads can be preempted can suffer from brief, infrequent
|
||||||
|
performance hiccups.
|
||||||
|
|
||||||
|
The lock-free stack, by design, is not susceptible to this problem; one thread can
|
||||||
|
be preempted at any point during a push or pop operation and will not impede
|
||||||
|
the progress of any other thread.
|
||||||
|
|
||||||
|
For a more detailed description of the stack implementations, please refer to
|
||||||
|
:doc:`../prog_guide/stack_lib`.
|
@ -104,6 +104,8 @@ These user-owned caches can be explicitly passed to ``rte_mempool_generic_put()`
|
|||||||
The ``rte_mempool_default_cache()`` call returns the default internal cache if any.
|
The ``rte_mempool_default_cache()`` call returns the default internal cache if any.
|
||||||
In contrast to the default caches, user-owned caches can be used by unregistered non-EAL threads too.
|
In contrast to the default caches, user-owned caches can be used by unregistered non-EAL threads too.
|
||||||
|
|
||||||
|
.. _Mempool_Handlers:
|
||||||
|
|
||||||
Mempool Handlers
|
Mempool Handlers
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
@ -28,6 +28,8 @@ Implementation
|
|||||||
The library supports two types of stacks: standard (lock-based) and lock-free.
|
The library supports two types of stacks: standard (lock-based) and lock-free.
|
||||||
Both types use the same set of interfaces, but their implementations differ.
|
Both types use the same set of interfaces, but their implementations differ.
|
||||||
|
|
||||||
|
.. _Stack_Library_Std_Stack:
|
||||||
|
|
||||||
Lock-based Stack
|
Lock-based Stack
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
@ -35,6 +37,8 @@ The lock-based stack consists of a contiguous array of pointers, a current
|
|||||||
index, and a spinlock. Accesses to the stack are made multi-thread safe by the
|
index, and a spinlock. Accesses to the stack are made multi-thread safe by the
|
||||||
spinlock.
|
spinlock.
|
||||||
|
|
||||||
|
.. _Stack_Library_LF_Stack:
|
||||||
|
|
||||||
Lock-free Stack
|
Lock-free Stack
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user