[PATCH 2/2] app/test-pipeline: add ring size options
Doug Foster
doug.foster at arm.com
Tue Nov 4 03:49:19 CET 2025
Add command-line options to configure the size of the RX and TX rings.
The ring sizes should provide enough capacity to accommodate the number
of new entries that accumulate during the time it takes for existing
entries to be dequeued from the rings. This depends on CPU processing
rate, which varies across platforms, so configurable options are
provided. Use of these options is optional, and the default size
remains 128 for both the TX and RX rings. When setting the size, the
value must be a power of two, as required by the ring library.
Signed-off-by: Doug Foster <doug.foster at arm.com>
Reviewed-by: Wathsala Vithanage <wathsala.vithanage at arm.com>
---
app/test-pipeline/config.c | 48 ++++++++++++++++++++--
app/test-pipeline/init.c | 4 --
app/test-pipeline/main.h | 8 +++-
doc/guides/sample_app_ug/test_pipeline.rst | 12 +++++-
4 files changed, 62 insertions(+), 10 deletions(-)
diff --git a/app/test-pipeline/config.c b/app/test-pipeline/config.c
index 0d280cf898..ef0438c06c 100644
--- a/app/test-pipeline/config.c
+++ b/app/test-pipeline/config.c
@@ -43,7 +43,7 @@
static const char usage[] =
"Usage:\n"
-" dpdk-test-pipeline [EAL options] -- -p PORTMASK --TABLE_TYPE\n"
+" dpdk-test-pipeline [EAL options] -- -p PORTMASK --PIPELINE_ARGS\n"
"\n"
"EAL requirements:\n"
" -l/--lcores must specify exactly 3 lcores (RX core, pipeline core , TX core)\n"
@@ -61,7 +61,10 @@ static const char usage[] =
" --hash-cuckoo-8 | --hash-cuckoo-16 | --hash-cuckoo-32 |\n"
" --hash-cuckoo-48 | --hash-cuckoo-64 | --hash-cuckoo-80 |\n"
" --hash-cuckoo-96 | --hash-cuckoo-112 | --hash-cuckoo-128\n"
-" -h/--help print help statement and exit\n";
+" -h/--help print help statement and exit\n"
+" --rx-ring-size=N Optional, size of RX ring (power-of-two)\n"
+" --tx-ring-size=N Optional, size of TX ring (power-of-two)\n";
+
void
app_print_usage(void)
@@ -104,6 +107,25 @@ app_parse_port_mask(const char *arg)
return 0;
}
+static int
+app_parse_ring_size(const char *ring_size_arg, uint32_t *size)
+{
+ char *end = NULL;
+ unsigned long value;
+
+ value = strtoul(ring_size_arg, &end, 10);
+
+ /* Check for conversion of invalid string */
+ if (!(*ring_size_arg != '\0' && *end == '\0'))
+ return -1;
+
+ if (!rte_is_power_of_2(value) || value > UINT32_MAX)
+ return -1;
+
+ *size = value;
+ return 0;
+}
+
struct {
const char *name;
uint32_t value;
@@ -142,6 +164,7 @@ app_parse_args(int argc, char **argv)
int opt, ret;
char **argvopt;
int option_index;
+ uint32_t rx_ring_size, tx_ring_size;
char *prgname = argv[0];
static struct option lgopts[] = {
{"none", 0, 0, e_APP_PIPELINES},
@@ -171,6 +194,8 @@ app_parse_args(int argc, char **argv)
{"hash-cuckoo-112", 0, 0, e_APP_PIPELINES},
{"hash-cuckoo-128", 0, 0, e_APP_PIPELINES},
{"help", 0, 0, e_APP_HELP},
+ {"rx-ring-size", 1, 0, e_APP_RX_RING_SIZE},
+ {"tx-ring-size", 1, 0, e_APP_TX_RING_SIZE},
{NULL, 0, 0, 0}
};
uint32_t lcores[3], n_lcores, lcore_id, pipeline_type_provided;
@@ -205,6 +230,9 @@ app_parse_args(int argc, char **argv)
app.pipeline_type = e_APP_PIPELINE_HASH_KEY16_LRU;
pipeline_type_provided = 0;
+ app.ring_rx_size = APP_RING_SIZE_DEFAULT;
+ app.ring_tx_size = APP_RING_SIZE_DEFAULT;
+
while ((opt = getopt_long(argc, argvopt, "p:h",
lgopts, &option_index)) != EOF) {
switch (opt) {
@@ -214,7 +242,7 @@ app_parse_args(int argc, char **argv)
break;
- case e_APP_PIPELINES: /* long options */
+ case e_APP_PIPELINES:
if (!pipeline_type_provided) {
uint32_t i;
@@ -233,6 +261,20 @@ app_parse_args(int argc, char **argv)
return -1;
+ case e_APP_RX_RING_SIZE:
+ if (app_parse_ring_size(optarg, &rx_ring_size) < 0)
+ return -1;
+
+ app.ring_rx_size = rx_ring_size;
+ break;
+
+ case e_APP_TX_RING_SIZE:
+ if (app_parse_ring_size(optarg, &tx_ring_size) < 0)
+ return -1;
+
+ app.ring_tx_size = tx_ring_size;
+ break;
+
case e_APP_HELP:
case 'h':
default:
diff --git a/app/test-pipeline/init.c b/app/test-pipeline/init.c
index 558f0e428d..f596337751 100644
--- a/app/test-pipeline/init.c
+++ b/app/test-pipeline/init.c
@@ -48,10 +48,6 @@ struct app_params app = {
.port_rx_ring_size = 128,
.port_tx_ring_size = 512,
- /* Rings */
- .ring_rx_size = 128,
- .ring_tx_size = 128,
-
/* Buffer pool */
.pool_buffer_size = 2048 + RTE_PKTMBUF_HEADROOM,
.pool_size = 32 * 1024,
diff --git a/app/test-pipeline/main.h b/app/test-pipeline/main.h
index 1f93dc3964..6f9ef6e2e2 100644
--- a/app/test-pipeline/main.h
+++ b/app/test-pipeline/main.h
@@ -18,6 +18,8 @@ struct app_mbuf_array {
#define APP_MAX_PORTS 4
#endif
+#define APP_RING_SIZE_DEFAULT 128
+
struct __rte_cache_aligned app_params {
/* CPU cores */
uint32_t core_rx;
@@ -67,7 +69,7 @@ void app_print_usage(void);
void app_init(void);
int app_lcore_main_loop(void *arg);
-/* Pipeline and help*/
+/* Pipelines, help, ring size */
enum {
e_APP_PIPELINE_NONE = 0,
e_APP_PIPELINE_STUB,
@@ -100,7 +102,9 @@ enum {
e_APP_PIPELINE_HASH_CUCKOO_KEY112,
e_APP_PIPELINE_HASH_CUCKOO_KEY128,
e_APP_PIPELINES,
- e_APP_HELP
+ e_APP_HELP,
+ e_APP_RX_RING_SIZE,
+ e_APP_TX_RING_SIZE
};
void app_main_loop_rx(void);
diff --git a/doc/guides/sample_app_ug/test_pipeline.rst b/doc/guides/sample_app_ug/test_pipeline.rst
index 818be93cd6..46a5ecc780 100644
--- a/doc/guides/sample_app_ug/test_pipeline.rst
+++ b/doc/guides/sample_app_ug/test_pipeline.rst
@@ -45,13 +45,23 @@ The application execution command line is:
.. code-block:: console
- ./dpdk-test-pipeline [EAL options] -- -p PORTMASK --TABLE_TYPE
+ ./dpdk-test-pipeline [EAL options] -- -p PORTMASK --PIPELINE_ARGS
The ``-l/--lcores`` EAL CPU corelist option has to contain exactly 3 CPU cores.
The first CPU core in the core mask is assigned for core A, the second for core B and the third for core C.
The PORTMASK parameter must contain 2 or 4 ports.
+PIPELINE_ARGS represents TABLE_TYPE and pipeline options, such as ``--rx-ring-size`` and ``--tx-ring-size``, described below.
+The ``--rx-ring-size`` and ``--tx-ring-size`` options control the sizes of the rings used between cores.
+Both values **must be powers of two**. If not used, the default size is 128.
+
+* ``--rx-ring-size=N``
+ Optional, sets size of the RX ring between **Core A (RX)** and **Core B (Pipeline)**.
+
+* ``--tx-ring-size=N``
+ Optional, sets size of the TX ring between **Core B (Pipeline)** and **Core C (TX)**.
+
Table Types and Behavior
~~~~~~~~~~~~~~~~~~~~~~~~
--
2.34.1
More information about the dev
mailing list