* [PATCH] examples/l3fwd: add option to set RX burst size
@ 2024-10-12 8:40 Jie Hai
2024-10-12 9:06 ` fengchengwen
` (5 more replies)
0 siblings, 6 replies; 20+ messages in thread
From: Jie Hai @ 2024-10-12 8:40 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
Now the Rx burst size is fixed to MAX_PKT_BURST (32). This
parameter needs to be modified in some performance optimization
scenarios. So an option '--burst' is added to set the burst size
explicitly. The default value is DEFAULT_PKT_BURST (32) and maximum
value is MAX_PKT_BURST (512).
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
examples/l3fwd/l3fwd.h | 5 +++-
examples/l3fwd/l3fwd_acl.c | 2 +-
examples/l3fwd/l3fwd_em.c | 2 +-
examples/l3fwd/l3fwd_fib.c | 2 +-
examples/l3fwd/l3fwd_lpm.c | 2 +-
examples/l3fwd/main.c | 58 ++++++++++++++++++++++++++++++++++++--
6 files changed, 64 insertions(+), 7 deletions(-)
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 93ce652d02b7..3ebee6301295 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -23,7 +23,8 @@
#define RX_DESC_DEFAULT 1024
#define TX_DESC_DEFAULT 1024
-#define MAX_PKT_BURST 32
+#define DEFAULT_PKT_BURST 32
+#define MAX_PKT_BURST 512
#define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
#define MEMPOOL_CACHE_SIZE 256
@@ -115,6 +116,8 @@ extern struct acl_algorithms acl_alg[];
extern uint32_t max_pkt_len;
+extern uint32_t nb_pkt_per_burst;
+
/* Send burst of packets on an output interface */
static inline int
send_burst(struct lcore_conf *qconf, uint16_t n, uint16_t port)
diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c
index b635011ef708..ccb9946837ed 100644
--- a/examples/l3fwd/l3fwd_acl.c
+++ b/examples/l3fwd/l3fwd_acl.c
@@ -1119,7 +1119,7 @@ acl_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid,
- pkts_burst, MAX_PKT_BURST);
+ pkts_burst, nb_pkt_per_burst);
if (nb_rx > 0) {
acl_process_pkts(pkts_burst, hops, nb_rx,
diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
index 31a7e05e39d0..da9c45e3a482 100644
--- a/examples/l3fwd/l3fwd_em.c
+++ b/examples/l3fwd/l3fwd_em.c
@@ -644,7 +644,7 @@ em_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c
index f38b19af3f57..aa81b12fe7dc 100644
--- a/examples/l3fwd/l3fwd_fib.c
+++ b/examples/l3fwd/l3fwd_fib.c
@@ -239,7 +239,7 @@ fib_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
index e8fd95aae9ce..048c02491378 100644
--- a/examples/l3fwd/l3fwd_lpm.c
+++ b/examples/l3fwd/l3fwd_lpm.c
@@ -205,7 +205,7 @@ lpm_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 01b763e5ba11..ba0a7f7088f0 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -55,6 +55,7 @@
uint16_t nb_rxd = RX_DESC_DEFAULT;
uint16_t nb_txd = TX_DESC_DEFAULT;
+uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
@@ -395,6 +396,7 @@ print_usage(const char *prgname)
" --config (port,queue,lcore)[,(port,queue,lcore)]"
" [--rx-queue-size NPKTS]"
" [--tx-queue-size NPKTS]"
+ " [--burst NPKTS]"
" [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
" [--max-pkt-len PKTLEN]"
" [--no-numa]"
@@ -420,6 +422,8 @@ print_usage(const char *prgname)
" Default: %d\n"
" --tx-queue-size NPKTS: Tx queue size in decimal\n"
" Default: %d\n"
+ " --burst NPKTS: Burst size in decimal\n"
+ " Default: %d\n"
" --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
" --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
" --no-numa: Disable numa awareness\n"
@@ -449,7 +453,7 @@ print_usage(const char *prgname)
" another is route entry at while line leads with character '%c'.\n"
" --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
" --alg: ACL classify method to use, one of: %s.\n\n",
- prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT,
+ prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
}
@@ -667,6 +671,49 @@ parse_lookup(const char *optarg)
return 0;
}
+static void
+parse_pkt_burst(const char *optarg)
+{
+ struct rte_eth_dev_info dev_info;
+ uint16_t burst_size;
+ uint16_t pkt_burst;
+ char *end = NULL;
+ int ret;
+
+ /* parse decimal string */
+ pkt_burst = strtoul(optarg, &end, 10);
+ if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return;
+
+ if (pkt_burst > MAX_PKT_BURST) {
+ RTE_LOG(INFO, L3FWD, "User provided burst must be <= %d. Using default value %d\n",
+ MAX_PKT_BURST, nb_pkt_per_burst);
+ return;
+ } else if (pkt_burst > 0) {
+ nb_pkt_per_burst = pkt_burst;
+ return;
+ }
+
+ /* If user gives a value of zero, query the PMD for its recommended Rx burst size. */
+ ret = rte_eth_dev_info_get(0, &dev_info);
+ if (ret != 0)
+ return;
+ burst_size = dev_info.default_rxportconf.burst_size;
+ if (burst_size == 0) {
+ RTE_LOG(INFO, L3FWD, "PMD does not recommend a burst size. Using default value %d. "
+ "User provided value must be in [1, %d]\n",
+ nb_pkt_per_burst, MAX_PKT_BURST);
+ return;
+ } else if (burst_size > MAX_PKT_BURST) {
+ RTE_LOG(INFO, L3FWD, "PMD recommended burst size %d exceeds maximum value %d. "
+ "Using default value %d\n",
+ burst_size, MAX_PKT_BURST, nb_pkt_per_burst);
+ return;
+ }
+ nb_pkt_per_burst = burst_size;
+ RTE_LOG(INFO, L3FWD, "Using PMD-provided burst value %d\n", burst_size);
+}
+
#define MAX_JUMBO_PKT_LEN 9600
static const char short_options[] =
@@ -698,6 +745,7 @@ static const char short_options[] =
#define CMD_LINE_OPT_RULE_IPV4 "rule_ipv4"
#define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
#define CMD_LINE_OPT_ALG "alg"
+#define CMD_LINE_OPT_PKT_BURST "burst"
enum {
/* long options mapped to a short option */
@@ -726,7 +774,8 @@ enum {
CMD_LINE_OPT_LOOKUP_NUM,
CMD_LINE_OPT_ENABLE_VECTOR_NUM,
CMD_LINE_OPT_VECTOR_SIZE_NUM,
- CMD_LINE_OPT_VECTOR_TMO_NS_NUM
+ CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
+ CMD_LINE_OPTPKT_BURST_NUM
};
static const struct option lgopts[] = {
@@ -753,6 +802,7 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_RULE_IPV4, 1, 0, CMD_LINE_OPT_RULE_IPV4_NUM},
{CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
{CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
+ {CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPTPKT_BURST_NUM},
{NULL, 0, 0, 0}
};
@@ -841,6 +891,10 @@ parse_args(int argc, char **argv)
parse_queue_size(optarg, &nb_txd, 0);
break;
+ case CMD_LINE_OPTPKT_BURST_NUM:
+ parse_pkt_burst(optarg);
+ break;
+
case CMD_LINE_OPT_ETH_DEST_NUM:
parse_eth_dest(optarg);
break;
--
2.22.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH] examples/l3fwd: add option to set RX burst size
2024-10-12 8:40 [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
@ 2024-10-12 9:06 ` fengchengwen
2024-10-12 12:22 ` Morten Brørup
` (4 subsequent siblings)
5 siblings, 0 replies; 20+ messages in thread
From: fengchengwen @ 2024-10-12 9:06 UTC (permalink / raw)
To: Jie Hai, dev, thomas, ferruh.yigit; +Cc: lihuisong
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
On 2024/10/12 16:40, Jie Hai wrote:
> Now the Rx burst size is fixed to MAX_PKT_BURST (32). This
> parameter needs to be modified in some performance optimization
> scenarios. So an option '--burst' is added to set the burst size
> explicitly. The default value is DEFAULT_PKT_BURST (32) and maximum
> value is MAX_PKT_BURST (512).
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
^ permalink raw reply [flat|nested] 20+ messages in thread* RE: [PATCH] examples/l3fwd: add option to set RX burst size
2024-10-12 8:40 [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-12 9:06 ` fengchengwen
@ 2024-10-12 12:22 ` Morten Brørup
2024-10-17 8:58 ` [PATCH v2 0/2] examples/l3fwd: add more options Jie Hai
` (3 subsequent siblings)
5 siblings, 0 replies; 20+ messages in thread
From: Morten Brørup @ 2024-10-12 12:22 UTC (permalink / raw)
To: Jie Hai, dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen
> From: Jie Hai [mailto:haijie1@huawei.com]
> Sent: Saturday, 12 October 2024 10.41
>
> Now the Rx burst size is fixed to MAX_PKT_BURST (32). This
> parameter needs to be modified in some performance optimization
> scenarios. So an option '--burst' is added to set the burst size
> explicitly. The default value is DEFAULT_PKT_BURST (32) and maximum
> value is MAX_PKT_BURST (512).
Good idea.
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
> ---
>
> -#define MAX_PKT_BURST 32
> +#define DEFAULT_PKT_BURST 32
> +#define MAX_PKT_BURST 512
> #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
>
> #define MEMPOOL_CACHE_SIZE 256
It seems strange to use a burst size larger than the mempool cache size.
You might want to make the cache size configurable too, or simply define MEMPOOL_CACHE_SIZE as RTE_MEMPOOL_CACHE_MAX_SIZE (currently 512) instead of 256.
And, as a safety measure, consider adding:
#include <assert.h>
static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST);
^ permalink raw reply [flat|nested] 20+ messages in thread* [PATCH v2 0/2] examples/l3fwd: add more options
2024-10-12 8:40 [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-12 9:06 ` fengchengwen
2024-10-12 12:22 ` Morten Brørup
@ 2024-10-17 8:58 ` Jie Hai
2024-10-17 8:58 ` [PATCH v2 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
` (2 more replies)
2024-10-17 9:58 ` [PATCH v3 " Jie Hai
` (2 subsequent siblings)
5 siblings, 3 replies; 20+ messages in thread
From: Jie Hai @ 2024-10-17 8:58 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
Add options to support configuring RX burst size and cache size
of mbuf mempoool.
Jie Hai (2):
examples/l3fwd: add option to set RX burst size
examples/l3fwd: add option to set mbuf cache size
examples/l3fwd/l3fwd.h | 8 +++-
examples/l3fwd/l3fwd_acl.c | 2 +-
examples/l3fwd/l3fwd_em.c | 2 +-
examples/l3fwd/l3fwd_fib.c | 2 +-
examples/l3fwd/l3fwd_lpm.c | 2 +-
examples/l3fwd/main.c | 89 ++++++++++++++++++++++++++++++++++++--
6 files changed, 96 insertions(+), 9 deletions(-)
--
2.22.0
^ permalink raw reply [flat|nested] 20+ messages in thread* [PATCH v2 1/2] examples/l3fwd: add option to set RX burst size
2024-10-17 8:58 ` [PATCH v2 0/2] examples/l3fwd: add more options Jie Hai
@ 2024-10-17 8:58 ` Jie Hai
2024-10-17 9:37 ` lihuisong (C)
2024-10-17 8:58 ` [PATCH v2 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
2024-10-17 9:18 ` [PATCH v2 0/2] examples/l3fwd: add more options Morten Brørup
2 siblings, 1 reply; 20+ messages in thread
From: Jie Hai @ 2024-10-17 8:58 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
Now the Rx burst size is fixed to MAX_PKT_BURST (32). This
parameter needs to be modified in some performance optimization
scenarios. So an option '--burst' is added to set the burst size
explicitly. The default value is DEFAULT_PKT_BURST (32) and maximum
value is MAX_PKT_BURST (512).
Signed-off-by: Jie Hai <haijie1@huawei.com>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
---
examples/l3fwd/l3fwd.h | 7 +++--
examples/l3fwd/l3fwd_acl.c | 2 +-
examples/l3fwd/l3fwd_em.c | 2 +-
examples/l3fwd/l3fwd_fib.c | 2 +-
examples/l3fwd/l3fwd_lpm.c | 2 +-
examples/l3fwd/main.c | 60 ++++++++++++++++++++++++++++++++++++--
6 files changed, 67 insertions(+), 8 deletions(-)
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 93ce652d02b7..618e0eaa3af1 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -23,10 +23,11 @@
#define RX_DESC_DEFAULT 1024
#define TX_DESC_DEFAULT 1024
-#define MAX_PKT_BURST 32
+#define DEFAULT_PKT_BURST 32
+#define MAX_PKT_BURST 512
#define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
-#define MEMPOOL_CACHE_SIZE 256
+#define MEMPOOL_CACHE_SIZE RTE_MEMPOOL_CACHE_MAX_SIZE
#define MAX_RX_QUEUE_PER_LCORE 16
#define VECTOR_SIZE_DEFAULT MAX_PKT_BURST
@@ -115,6 +116,8 @@ extern struct acl_algorithms acl_alg[];
extern uint32_t max_pkt_len;
+extern uint32_t nb_pkt_per_burst;
+
/* Send burst of packets on an output interface */
static inline int
send_burst(struct lcore_conf *qconf, uint16_t n, uint16_t port)
diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c
index b635011ef708..ccb9946837ed 100644
--- a/examples/l3fwd/l3fwd_acl.c
+++ b/examples/l3fwd/l3fwd_acl.c
@@ -1119,7 +1119,7 @@ acl_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid,
- pkts_burst, MAX_PKT_BURST);
+ pkts_burst, nb_pkt_per_burst);
if (nb_rx > 0) {
acl_process_pkts(pkts_burst, hops, nb_rx,
diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
index 31a7e05e39d0..da9c45e3a482 100644
--- a/examples/l3fwd/l3fwd_em.c
+++ b/examples/l3fwd/l3fwd_em.c
@@ -644,7 +644,7 @@ em_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c
index f38b19af3f57..aa81b12fe7dc 100644
--- a/examples/l3fwd/l3fwd_fib.c
+++ b/examples/l3fwd/l3fwd_fib.c
@@ -239,7 +239,7 @@ fib_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
index e8fd95aae9ce..048c02491378 100644
--- a/examples/l3fwd/l3fwd_lpm.c
+++ b/examples/l3fwd/l3fwd_lpm.c
@@ -205,7 +205,7 @@ lpm_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 01b763e5ba11..2feae5b311a2 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -14,6 +14,7 @@
#include <getopt.h>
#include <signal.h>
#include <stdbool.h>
+#include <assert.h>
#include <rte_common.h>
#include <rte_vect.h>
@@ -53,8 +54,10 @@
#define MAX_LCORE_PARAMS 1024
+static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST);
uint16_t nb_rxd = RX_DESC_DEFAULT;
uint16_t nb_txd = TX_DESC_DEFAULT;
+uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
@@ -395,6 +398,7 @@ print_usage(const char *prgname)
" --config (port,queue,lcore)[,(port,queue,lcore)]"
" [--rx-queue-size NPKTS]"
" [--tx-queue-size NPKTS]"
+ " [--burst NPKTS]"
" [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
" [--max-pkt-len PKTLEN]"
" [--no-numa]"
@@ -420,6 +424,8 @@ print_usage(const char *prgname)
" Default: %d\n"
" --tx-queue-size NPKTS: Tx queue size in decimal\n"
" Default: %d\n"
+ " --burst NPKTS: Burst size in decimal\n"
+ " Default: %d\n"
" --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
" --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
" --no-numa: Disable numa awareness\n"
@@ -449,7 +455,7 @@ print_usage(const char *prgname)
" another is route entry at while line leads with character '%c'.\n"
" --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
" --alg: ACL classify method to use, one of: %s.\n\n",
- prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT,
+ prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
}
@@ -667,6 +673,49 @@ parse_lookup(const char *optarg)
return 0;
}
+static void
+parse_pkt_burst(const char *optarg)
+{
+ struct rte_eth_dev_info dev_info;
+ unsigned long pkt_burst;
+ uint16_t burst_size;
+ char *end = NULL;
+ int ret;
+
+ /* parse decimal string */
+ pkt_burst = strtoul(optarg, &end, 10);
+ if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return;
+
+ if (pkt_burst > MAX_PKT_BURST) {
+ RTE_LOG(INFO, L3FWD, "User provided burst must be <= %d. Using default value %d\n",
+ MAX_PKT_BURST, nb_pkt_per_burst);
+ return;
+ } else if (pkt_burst > 0) {
+ nb_pkt_per_burst = (uint32_t)pkt_burst;
+ return;
+ }
+
+ /* If user gives a value of zero, query the PMD for its recommended Rx burst size. */
+ ret = rte_eth_dev_info_get(0, &dev_info);
+ if (ret != 0)
+ return;
+ burst_size = dev_info.default_rxportconf.burst_size;
+ if (burst_size == 0) {
+ RTE_LOG(INFO, L3FWD, "PMD does not recommend a burst size. Using default value %d. "
+ "User provided value must be in [1, %d]\n",
+ nb_pkt_per_burst, MAX_PKT_BURST);
+ return;
+ } else if (burst_size > MAX_PKT_BURST) {
+ RTE_LOG(INFO, L3FWD, "PMD recommended burst size %d exceeds maximum value %d. "
+ "Using default value %d\n",
+ burst_size, MAX_PKT_BURST, nb_pkt_per_burst);
+ return;
+ }
+ nb_pkt_per_burst = burst_size;
+ RTE_LOG(INFO, L3FWD, "Using PMD-provided burst value %d\n", burst_size);
+}
+
#define MAX_JUMBO_PKT_LEN 9600
static const char short_options[] =
@@ -698,6 +747,7 @@ static const char short_options[] =
#define CMD_LINE_OPT_RULE_IPV4 "rule_ipv4"
#define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
#define CMD_LINE_OPT_ALG "alg"
+#define CMD_LINE_OPT_PKT_BURST "burst"
enum {
/* long options mapped to a short option */
@@ -726,7 +776,8 @@ enum {
CMD_LINE_OPT_LOOKUP_NUM,
CMD_LINE_OPT_ENABLE_VECTOR_NUM,
CMD_LINE_OPT_VECTOR_SIZE_NUM,
- CMD_LINE_OPT_VECTOR_TMO_NS_NUM
+ CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
+ CMD_LINE_OPT_PKT_BURST_NUM
};
static const struct option lgopts[] = {
@@ -753,6 +804,7 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_RULE_IPV4, 1, 0, CMD_LINE_OPT_RULE_IPV4_NUM},
{CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
{CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
+ {CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
{NULL, 0, 0, 0}
};
@@ -841,6 +893,10 @@ parse_args(int argc, char **argv)
parse_queue_size(optarg, &nb_txd, 0);
break;
+ case CMD_LINE_OPT_PKT_BURST_NUM:
+ parse_pkt_burst(optarg);
+ break;
+
case CMD_LINE_OPT_ETH_DEST_NUM:
parse_eth_dest(optarg);
break;
--
2.22.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v2 1/2] examples/l3fwd: add option to set RX burst size
2024-10-17 8:58 ` [PATCH v2 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
@ 2024-10-17 9:37 ` lihuisong (C)
0 siblings, 0 replies; 20+ messages in thread
From: lihuisong (C) @ 2024-10-17 9:37 UTC (permalink / raw)
To: Jie Hai, dev; +Cc: fengchengwen, thomas, ferruh.yigit
Acked-by: Huisong Li <lihuisong@huawei.com>
在 2024/10/17 16:58, Jie Hai 写道:
> Now the Rx burst size is fixed to MAX_PKT_BURST (32). This
> parameter needs to be modified in some performance optimization
> scenarios. So an option '--burst' is added to set the burst size
> explicitly. The default value is DEFAULT_PKT_BURST (32) and maximum
> value is MAX_PKT_BURST (512).
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
> Acked-by: Chengwen Feng <fengchengwen@huawei.com>
> ---
> examples/l3fwd/l3fwd.h | 7 +++--
> examples/l3fwd/l3fwd_acl.c | 2 +-
> examples/l3fwd/l3fwd_em.c | 2 +-
> examples/l3fwd/l3fwd_fib.c | 2 +-
> examples/l3fwd/l3fwd_lpm.c | 2 +-
> examples/l3fwd/main.c | 60 ++++++++++++++++++++++++++++++++++++--
> 6 files changed, 67 insertions(+), 8 deletions(-)
>
> diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
> index 93ce652d02b7..618e0eaa3af1 100644
> --- a/examples/l3fwd/l3fwd.h
> +++ b/examples/l3fwd/l3fwd.h
> @@ -23,10 +23,11 @@
> #define RX_DESC_DEFAULT 1024
> #define TX_DESC_DEFAULT 1024
>
> -#define MAX_PKT_BURST 32
> +#define DEFAULT_PKT_BURST 32
> +#define MAX_PKT_BURST 512
> #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
>
> -#define MEMPOOL_CACHE_SIZE 256
> +#define MEMPOOL_CACHE_SIZE RTE_MEMPOOL_CACHE_MAX_SIZE
> #define MAX_RX_QUEUE_PER_LCORE 16
>
> #define VECTOR_SIZE_DEFAULT MAX_PKT_BURST
> @@ -115,6 +116,8 @@ extern struct acl_algorithms acl_alg[];
>
> extern uint32_t max_pkt_len;
>
> +extern uint32_t nb_pkt_per_burst;
> +
> /* Send burst of packets on an output interface */
> static inline int
> send_burst(struct lcore_conf *qconf, uint16_t n, uint16_t port)
> diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c
> index b635011ef708..ccb9946837ed 100644
> --- a/examples/l3fwd/l3fwd_acl.c
> +++ b/examples/l3fwd/l3fwd_acl.c
> @@ -1119,7 +1119,7 @@ acl_main_loop(__rte_unused void *dummy)
> portid = qconf->rx_queue_list[i].port_id;
> queueid = qconf->rx_queue_list[i].queue_id;
> nb_rx = rte_eth_rx_burst(portid, queueid,
> - pkts_burst, MAX_PKT_BURST);
> + pkts_burst, nb_pkt_per_burst);
>
> if (nb_rx > 0) {
> acl_process_pkts(pkts_burst, hops, nb_rx,
> diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
> index 31a7e05e39d0..da9c45e3a482 100644
> --- a/examples/l3fwd/l3fwd_em.c
> +++ b/examples/l3fwd/l3fwd_em.c
> @@ -644,7 +644,7 @@ em_main_loop(__rte_unused void *dummy)
> portid = qconf->rx_queue_list[i].port_id;
> queueid = qconf->rx_queue_list[i].queue_id;
> nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
> - MAX_PKT_BURST);
> + nb_pkt_per_burst);
> if (nb_rx == 0)
> continue;
>
> diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c
> index f38b19af3f57..aa81b12fe7dc 100644
> --- a/examples/l3fwd/l3fwd_fib.c
> +++ b/examples/l3fwd/l3fwd_fib.c
> @@ -239,7 +239,7 @@ fib_main_loop(__rte_unused void *dummy)
> portid = qconf->rx_queue_list[i].port_id;
> queueid = qconf->rx_queue_list[i].queue_id;
> nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
> - MAX_PKT_BURST);
> + nb_pkt_per_burst);
> if (nb_rx == 0)
> continue;
>
> diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
> index e8fd95aae9ce..048c02491378 100644
> --- a/examples/l3fwd/l3fwd_lpm.c
> +++ b/examples/l3fwd/l3fwd_lpm.c
> @@ -205,7 +205,7 @@ lpm_main_loop(__rte_unused void *dummy)
> portid = qconf->rx_queue_list[i].port_id;
> queueid = qconf->rx_queue_list[i].queue_id;
> nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
> - MAX_PKT_BURST);
> + nb_pkt_per_burst);
> if (nb_rx == 0)
> continue;
>
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
> index 01b763e5ba11..2feae5b311a2 100644
> --- a/examples/l3fwd/main.c
> +++ b/examples/l3fwd/main.c
> @@ -14,6 +14,7 @@
> #include <getopt.h>
> #include <signal.h>
> #include <stdbool.h>
> +#include <assert.h>
>
> #include <rte_common.h>
> #include <rte_vect.h>
> @@ -53,8 +54,10 @@
>
> #define MAX_LCORE_PARAMS 1024
>
> +static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST);
> uint16_t nb_rxd = RX_DESC_DEFAULT;
> uint16_t nb_txd = TX_DESC_DEFAULT;
> +uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
>
> /**< Ports set in promiscuous mode off by default. */
> static int promiscuous_on;
> @@ -395,6 +398,7 @@ print_usage(const char *prgname)
> " --config (port,queue,lcore)[,(port,queue,lcore)]"
> " [--rx-queue-size NPKTS]"
> " [--tx-queue-size NPKTS]"
> + " [--burst NPKTS]"
> " [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
> " [--max-pkt-len PKTLEN]"
> " [--no-numa]"
> @@ -420,6 +424,8 @@ print_usage(const char *prgname)
> " Default: %d\n"
> " --tx-queue-size NPKTS: Tx queue size in decimal\n"
> " Default: %d\n"
> + " --burst NPKTS: Burst size in decimal\n"
> + " Default: %d\n"
> " --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
> " --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
> " --no-numa: Disable numa awareness\n"
> @@ -449,7 +455,7 @@ print_usage(const char *prgname)
> " another is route entry at while line leads with character '%c'.\n"
> " --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
> " --alg: ACL classify method to use, one of: %s.\n\n",
> - prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT,
> + prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
> ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
> }
>
> @@ -667,6 +673,49 @@ parse_lookup(const char *optarg)
> return 0;
> }
>
> +static void
> +parse_pkt_burst(const char *optarg)
> +{
> + struct rte_eth_dev_info dev_info;
> + unsigned long pkt_burst;
> + uint16_t burst_size;
> + char *end = NULL;
> + int ret;
> +
> + /* parse decimal string */
> + pkt_burst = strtoul(optarg, &end, 10);
> + if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
> + return;
> +
> + if (pkt_burst > MAX_PKT_BURST) {
> + RTE_LOG(INFO, L3FWD, "User provided burst must be <= %d. Using default value %d\n",
> + MAX_PKT_BURST, nb_pkt_per_burst);
> + return;
> + } else if (pkt_burst > 0) {
> + nb_pkt_per_burst = (uint32_t)pkt_burst;
> + return;
> + }
> +
> + /* If user gives a value of zero, query the PMD for its recommended Rx burst size. */
> + ret = rte_eth_dev_info_get(0, &dev_info);
> + if (ret != 0)
> + return;
> + burst_size = dev_info.default_rxportconf.burst_size;
> + if (burst_size == 0) {
> + RTE_LOG(INFO, L3FWD, "PMD does not recommend a burst size. Using default value %d. "
> + "User provided value must be in [1, %d]\n",
> + nb_pkt_per_burst, MAX_PKT_BURST);
> + return;
> + } else if (burst_size > MAX_PKT_BURST) {
> + RTE_LOG(INFO, L3FWD, "PMD recommended burst size %d exceeds maximum value %d. "
> + "Using default value %d\n",
> + burst_size, MAX_PKT_BURST, nb_pkt_per_burst);
> + return;
> + }
> + nb_pkt_per_burst = burst_size;
> + RTE_LOG(INFO, L3FWD, "Using PMD-provided burst value %d\n", burst_size);
> +}
> +
> #define MAX_JUMBO_PKT_LEN 9600
>
> static const char short_options[] =
> @@ -698,6 +747,7 @@ static const char short_options[] =
> #define CMD_LINE_OPT_RULE_IPV4 "rule_ipv4"
> #define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
> #define CMD_LINE_OPT_ALG "alg"
> +#define CMD_LINE_OPT_PKT_BURST "burst"
>
> enum {
> /* long options mapped to a short option */
> @@ -726,7 +776,8 @@ enum {
> CMD_LINE_OPT_LOOKUP_NUM,
> CMD_LINE_OPT_ENABLE_VECTOR_NUM,
> CMD_LINE_OPT_VECTOR_SIZE_NUM,
> - CMD_LINE_OPT_VECTOR_TMO_NS_NUM
> + CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
> + CMD_LINE_OPT_PKT_BURST_NUM
> };
>
> static const struct option lgopts[] = {
> @@ -753,6 +804,7 @@ static const struct option lgopts[] = {
> {CMD_LINE_OPT_RULE_IPV4, 1, 0, CMD_LINE_OPT_RULE_IPV4_NUM},
> {CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
> {CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
> + {CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
> {NULL, 0, 0, 0}
> };
>
> @@ -841,6 +893,10 @@ parse_args(int argc, char **argv)
> parse_queue_size(optarg, &nb_txd, 0);
> break;
>
> + case CMD_LINE_OPT_PKT_BURST_NUM:
> + parse_pkt_burst(optarg);
> + break;
> +
> case CMD_LINE_OPT_ETH_DEST_NUM:
> parse_eth_dest(optarg);
> break;
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v2 2/2] examples/l3fwd: add option to set mbuf cache size
2024-10-17 8:58 ` [PATCH v2 0/2] examples/l3fwd: add more options Jie Hai
2024-10-17 8:58 ` [PATCH v2 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
@ 2024-10-17 8:58 ` Jie Hai
2024-10-17 9:40 ` lihuisong (C)
2024-10-17 9:18 ` [PATCH v2 0/2] examples/l3fwd: add more options Morten Brørup
2 siblings, 1 reply; 20+ messages in thread
From: Jie Hai @ 2024-10-17 8:58 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
The mempool cache size of mbuf is set to
RTE_MEMPOOL_CACHE_MAX_SIZE as default. This patch allows
users to configure the cache size by "--mbcache", and limits
the paramater to a maximum of RTE_MEMPOOL_CACHE_MAX_SIZE.
Signed-off-by: Jie Hai <haijie1@huawei.com>
---
examples/l3fwd/l3fwd.h | 1 +
examples/l3fwd/main.c | 33 ++++++++++++++++++++++++++++++---
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 618e0eaa3af1..0cce3406ee7d 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -117,6 +117,7 @@ extern struct acl_algorithms acl_alg[];
extern uint32_t max_pkt_len;
extern uint32_t nb_pkt_per_burst;
+extern uint32_t mb_mempool_cache_size;
/* Send burst of packets on an output interface */
static inline int
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 2feae5b311a2..1e2da739dded 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -58,6 +58,7 @@ static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST);
uint16_t nb_rxd = RX_DESC_DEFAULT;
uint16_t nb_txd = TX_DESC_DEFAULT;
uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
+uint32_t mb_mempool_cache_size = MEMPOOL_CACHE_SIZE;
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
@@ -399,6 +400,7 @@ print_usage(const char *prgname)
" [--rx-queue-size NPKTS]"
" [--tx-queue-size NPKTS]"
" [--burst NPKTS]"
+ " [--mbcache CACHESZ]"
" [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
" [--max-pkt-len PKTLEN]"
" [--no-numa]"
@@ -426,6 +428,8 @@ print_usage(const char *prgname)
" Default: %d\n"
" --burst NPKTS: Burst size in decimal\n"
" Default: %d\n"
+ " --mbcache CACHESZ: Cache size in decimal\n"
+ " Default: %d\n"
" --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
" --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
" --no-numa: Disable numa awareness\n"
@@ -455,7 +459,7 @@ print_usage(const char *prgname)
" another is route entry at while line leads with character '%c'.\n"
" --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
" --alg: ACL classify method to use, one of: %s.\n\n",
- prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
+ prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST, MEMPOOL_CACHE_SIZE,
ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
}
@@ -673,6 +677,22 @@ parse_lookup(const char *optarg)
return 0;
}
+static void
+parse_mbcache_size(const char *optarg)
+{
+ unsigned long mb_cache_size;
+ char *end = NULL;
+
+ mb_cache_size = strtoul(optarg, &end, 10);
+ if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return;
+ if (mb_cache_size <= RTE_MEMPOOL_CACHE_MAX_SIZE)
+ mb_mempool_cache_size = (uint32_t)mb_cache_size;
+ else
+ rte_exit(EXIT_FAILURE, "mbcache must be >= 0 and <= %d\n",
+ RTE_MEMPOOL_CACHE_MAX_SIZE);
+}
+
static void
parse_pkt_burst(const char *optarg)
{
@@ -748,6 +768,7 @@ static const char short_options[] =
#define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
#define CMD_LINE_OPT_ALG "alg"
#define CMD_LINE_OPT_PKT_BURST "burst"
+#define CMD_LINE_OPT_MB_CACHE_SIZE "mbcache"
enum {
/* long options mapped to a short option */
@@ -777,7 +798,8 @@ enum {
CMD_LINE_OPT_ENABLE_VECTOR_NUM,
CMD_LINE_OPT_VECTOR_SIZE_NUM,
CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
- CMD_LINE_OPT_PKT_BURST_NUM
+ CMD_LINE_OPT_PKT_BURST_NUM,
+ CMD_LINE_OPT_MB_CACHE_SIZE_NUM
};
static const struct option lgopts[] = {
@@ -805,6 +827,7 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
{CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
{CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
+ {CMD_LINE_OPT_MB_CACHE_SIZE, 1, 0, CMD_LINE_OPT_MB_CACHE_SIZE_NUM},
{NULL, 0, 0, 0}
};
@@ -897,6 +920,10 @@ parse_args(int argc, char **argv)
parse_pkt_burst(optarg);
break;
+ case CMD_LINE_OPT_MB_CACHE_SIZE_NUM:
+ parse_mbcache_size(optarg);
+ break;
+
case CMD_LINE_OPT_ETH_DEST_NUM:
parse_eth_dest(optarg);
break;
@@ -1089,7 +1116,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
portid, socketid);
pktmbuf_pool[portid][socketid] =
rte_pktmbuf_pool_create(s, nb_mbuf,
- MEMPOOL_CACHE_SIZE, 0,
+ mb_mempool_cache_size, 0,
RTE_MBUF_DEFAULT_BUF_SIZE, socketid);
if (pktmbuf_pool[portid][socketid] == NULL)
rte_exit(EXIT_FAILURE,
--
2.22.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v2 2/2] examples/l3fwd: add option to set mbuf cache size
2024-10-17 8:58 ` [PATCH v2 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
@ 2024-10-17 9:40 ` lihuisong (C)
0 siblings, 0 replies; 20+ messages in thread
From: lihuisong (C) @ 2024-10-17 9:40 UTC (permalink / raw)
To: Jie Hai, dev; +Cc: fengchengwen, thomas, ferruh.yigit
lgtm, Acked-by: Huisong Li <lihuisong@huawei.com>
在 2024/10/17 16:58, Jie Hai 写道:
> The mempool cache size of mbuf is set to
> RTE_MEMPOOL_CACHE_MAX_SIZE as default. This patch allows
> users to configure the cache size by "--mbcache", and limits
> the paramater to a maximum of RTE_MEMPOOL_CACHE_MAX_SIZE.
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
> ---
> examples/l3fwd/l3fwd.h | 1 +
> examples/l3fwd/main.c | 33 ++++++++++++++++++++++++++++++---
> 2 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
> index 618e0eaa3af1..0cce3406ee7d 100644
> --- a/examples/l3fwd/l3fwd.h
> +++ b/examples/l3fwd/l3fwd.h
> @@ -117,6 +117,7 @@ extern struct acl_algorithms acl_alg[];
> extern uint32_t max_pkt_len;
>
> extern uint32_t nb_pkt_per_burst;
> +extern uint32_t mb_mempool_cache_size;
>
> /* Send burst of packets on an output interface */
> static inline int
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
> index 2feae5b311a2..1e2da739dded 100644
> --- a/examples/l3fwd/main.c
> +++ b/examples/l3fwd/main.c
> @@ -58,6 +58,7 @@ static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST);
> uint16_t nb_rxd = RX_DESC_DEFAULT;
> uint16_t nb_txd = TX_DESC_DEFAULT;
> uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
> +uint32_t mb_mempool_cache_size = MEMPOOL_CACHE_SIZE;
>
> /**< Ports set in promiscuous mode off by default. */
> static int promiscuous_on;
> @@ -399,6 +400,7 @@ print_usage(const char *prgname)
> " [--rx-queue-size NPKTS]"
> " [--tx-queue-size NPKTS]"
> " [--burst NPKTS]"
> + " [--mbcache CACHESZ]"
> " [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
> " [--max-pkt-len PKTLEN]"
> " [--no-numa]"
> @@ -426,6 +428,8 @@ print_usage(const char *prgname)
> " Default: %d\n"
> " --burst NPKTS: Burst size in decimal\n"
> " Default: %d\n"
> + " --mbcache CACHESZ: Cache size in decimal\n"
> + " Default: %d\n"
> " --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
> " --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
> " --no-numa: Disable numa awareness\n"
> @@ -455,7 +459,7 @@ print_usage(const char *prgname)
> " another is route entry at while line leads with character '%c'.\n"
> " --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
> " --alg: ACL classify method to use, one of: %s.\n\n",
> - prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
> + prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST, MEMPOOL_CACHE_SIZE,
> ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
> }
>
> @@ -673,6 +677,22 @@ parse_lookup(const char *optarg)
> return 0;
> }
>
> +static void
> +parse_mbcache_size(const char *optarg)
> +{
> + unsigned long mb_cache_size;
> + char *end = NULL;
> +
> + mb_cache_size = strtoul(optarg, &end, 10);
> + if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
> + return;
> + if (mb_cache_size <= RTE_MEMPOOL_CACHE_MAX_SIZE)
> + mb_mempool_cache_size = (uint32_t)mb_cache_size;
> + else
> + rte_exit(EXIT_FAILURE, "mbcache must be >= 0 and <= %d\n",
> + RTE_MEMPOOL_CACHE_MAX_SIZE);
> +}
> +
> static void
> parse_pkt_burst(const char *optarg)
> {
> @@ -748,6 +768,7 @@ static const char short_options[] =
> #define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
> #define CMD_LINE_OPT_ALG "alg"
> #define CMD_LINE_OPT_PKT_BURST "burst"
> +#define CMD_LINE_OPT_MB_CACHE_SIZE "mbcache"
>
> enum {
> /* long options mapped to a short option */
> @@ -777,7 +798,8 @@ enum {
> CMD_LINE_OPT_ENABLE_VECTOR_NUM,
> CMD_LINE_OPT_VECTOR_SIZE_NUM,
> CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
> - CMD_LINE_OPT_PKT_BURST_NUM
> + CMD_LINE_OPT_PKT_BURST_NUM,
> + CMD_LINE_OPT_MB_CACHE_SIZE_NUM
> };
>
> static const struct option lgopts[] = {
> @@ -805,6 +827,7 @@ static const struct option lgopts[] = {
> {CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
> {CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
> {CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
> + {CMD_LINE_OPT_MB_CACHE_SIZE, 1, 0, CMD_LINE_OPT_MB_CACHE_SIZE_NUM},
> {NULL, 0, 0, 0}
> };
>
> @@ -897,6 +920,10 @@ parse_args(int argc, char **argv)
> parse_pkt_burst(optarg);
> break;
>
> + case CMD_LINE_OPT_MB_CACHE_SIZE_NUM:
> + parse_mbcache_size(optarg);
> + break;
> +
> case CMD_LINE_OPT_ETH_DEST_NUM:
> parse_eth_dest(optarg);
> break;
> @@ -1089,7 +1116,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
> portid, socketid);
> pktmbuf_pool[portid][socketid] =
> rte_pktmbuf_pool_create(s, nb_mbuf,
> - MEMPOOL_CACHE_SIZE, 0,
> + mb_mempool_cache_size, 0,
> RTE_MBUF_DEFAULT_BUF_SIZE, socketid);
> if (pktmbuf_pool[portid][socketid] == NULL)
> rte_exit(EXIT_FAILURE,
^ permalink raw reply [flat|nested] 20+ messages in thread
* RE: [PATCH v2 0/2] examples/l3fwd: add more options
2024-10-17 8:58 ` [PATCH v2 0/2] examples/l3fwd: add more options Jie Hai
2024-10-17 8:58 ` [PATCH v2 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-17 8:58 ` [PATCH v2 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
@ 2024-10-17 9:18 ` Morten Brørup
2 siblings, 0 replies; 20+ messages in thread
From: Morten Brørup @ 2024-10-17 9:18 UTC (permalink / raw)
To: Jie Hai, dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen
For the series,
Acked-by: Morten Brørup <mb@smartsharesystems.com>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v3 0/2] examples/l3fwd: add more options
2024-10-12 8:40 [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
` (2 preceding siblings ...)
2024-10-17 8:58 ` [PATCH v2 0/2] examples/l3fwd: add more options Jie Hai
@ 2024-10-17 9:58 ` Jie Hai
2024-10-17 9:58 ` [PATCH v3 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-17 9:58 ` [PATCH v3 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
2024-10-18 1:08 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
2024-11-06 1:51 ` [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
5 siblings, 2 replies; 20+ messages in thread
From: Jie Hai @ 2024-10-17 9:58 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
Add options to support configuring RX burst size and cache size
of mbuf mempoool.
--
v3:
1. add Acked-bys.
2. fix compile error.
--
Jie Hai (2):
examples/l3fwd: add option to set RX burst size
examples/l3fwd: add option to set mbuf cache size
examples/l3fwd/l3fwd.h | 8 +++-
examples/l3fwd/l3fwd_acl.c | 2 +-
examples/l3fwd/l3fwd_em.c | 2 +-
examples/l3fwd/l3fwd_fib.c | 2 +-
examples/l3fwd/l3fwd_lpm.c | 2 +-
examples/l3fwd/main.c | 89 ++++++++++++++++++++++++++++++++++++--
6 files changed, 96 insertions(+), 9 deletions(-)
--
2.22.0
^ permalink raw reply [flat|nested] 20+ messages in thread* [PATCH v3 1/2] examples/l3fwd: add option to set RX burst size
2024-10-17 9:58 ` [PATCH v3 " Jie Hai
@ 2024-10-17 9:58 ` Jie Hai
2024-10-17 9:58 ` [PATCH v3 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
1 sibling, 0 replies; 20+ messages in thread
From: Jie Hai @ 2024-10-17 9:58 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
Now the Rx burst size is fixed to MAX_PKT_BURST (32). This
parameter needs to be modified in some performance optimization
scenarios. So an option '--burst' is added to set the burst size
explicitly. The default value is DEFAULT_PKT_BURST (32) and maximum
value is MAX_PKT_BURST (512).
Signed-off-by: Jie Hai <haijie1@huawei.com>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Huisong Li <lihuisong@huawei.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
examples/l3fwd/l3fwd.h | 7 +++--
examples/l3fwd/l3fwd_acl.c | 2 +-
examples/l3fwd/l3fwd_em.c | 2 +-
examples/l3fwd/l3fwd_fib.c | 2 +-
examples/l3fwd/l3fwd_lpm.c | 2 +-
examples/l3fwd/main.c | 60 ++++++++++++++++++++++++++++++++++++--
6 files changed, 67 insertions(+), 8 deletions(-)
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 93ce652d02b7..618e0eaa3af1 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -23,10 +23,11 @@
#define RX_DESC_DEFAULT 1024
#define TX_DESC_DEFAULT 1024
-#define MAX_PKT_BURST 32
+#define DEFAULT_PKT_BURST 32
+#define MAX_PKT_BURST 512
#define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
-#define MEMPOOL_CACHE_SIZE 256
+#define MEMPOOL_CACHE_SIZE RTE_MEMPOOL_CACHE_MAX_SIZE
#define MAX_RX_QUEUE_PER_LCORE 16
#define VECTOR_SIZE_DEFAULT MAX_PKT_BURST
@@ -115,6 +116,8 @@ extern struct acl_algorithms acl_alg[];
extern uint32_t max_pkt_len;
+extern uint32_t nb_pkt_per_burst;
+
/* Send burst of packets on an output interface */
static inline int
send_burst(struct lcore_conf *qconf, uint16_t n, uint16_t port)
diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c
index b635011ef708..ccb9946837ed 100644
--- a/examples/l3fwd/l3fwd_acl.c
+++ b/examples/l3fwd/l3fwd_acl.c
@@ -1119,7 +1119,7 @@ acl_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid,
- pkts_burst, MAX_PKT_BURST);
+ pkts_burst, nb_pkt_per_burst);
if (nb_rx > 0) {
acl_process_pkts(pkts_burst, hops, nb_rx,
diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
index 31a7e05e39d0..da9c45e3a482 100644
--- a/examples/l3fwd/l3fwd_em.c
+++ b/examples/l3fwd/l3fwd_em.c
@@ -644,7 +644,7 @@ em_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c
index 993e36cec235..5fa32685f419 100644
--- a/examples/l3fwd/l3fwd_fib.c
+++ b/examples/l3fwd/l3fwd_fib.c
@@ -239,7 +239,7 @@ fib_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
index e8fd95aae9ce..048c02491378 100644
--- a/examples/l3fwd/l3fwd_lpm.c
+++ b/examples/l3fwd/l3fwd_lpm.c
@@ -205,7 +205,7 @@ lpm_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 01b763e5ba11..8b7a07cc7d67 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -14,6 +14,7 @@
#include <getopt.h>
#include <signal.h>
#include <stdbool.h>
+#include <assert.h>
#include <rte_common.h>
#include <rte_vect.h>
@@ -53,8 +54,10 @@
#define MAX_LCORE_PARAMS 1024
+static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST, "MAX_PKT_BURST should be at most MEMPOOL_CACHE_SIZE");
uint16_t nb_rxd = RX_DESC_DEFAULT;
uint16_t nb_txd = TX_DESC_DEFAULT;
+uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
@@ -395,6 +398,7 @@ print_usage(const char *prgname)
" --config (port,queue,lcore)[,(port,queue,lcore)]"
" [--rx-queue-size NPKTS]"
" [--tx-queue-size NPKTS]"
+ " [--burst NPKTS]"
" [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
" [--max-pkt-len PKTLEN]"
" [--no-numa]"
@@ -420,6 +424,8 @@ print_usage(const char *prgname)
" Default: %d\n"
" --tx-queue-size NPKTS: Tx queue size in decimal\n"
" Default: %d\n"
+ " --burst NPKTS: Burst size in decimal\n"
+ " Default: %d\n"
" --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
" --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
" --no-numa: Disable numa awareness\n"
@@ -449,7 +455,7 @@ print_usage(const char *prgname)
" another is route entry at while line leads with character '%c'.\n"
" --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
" --alg: ACL classify method to use, one of: %s.\n\n",
- prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT,
+ prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
}
@@ -667,6 +673,49 @@ parse_lookup(const char *optarg)
return 0;
}
+static void
+parse_pkt_burst(const char *optarg)
+{
+ struct rte_eth_dev_info dev_info;
+ unsigned long pkt_burst;
+ uint16_t burst_size;
+ char *end = NULL;
+ int ret;
+
+ /* parse decimal string */
+ pkt_burst = strtoul(optarg, &end, 10);
+ if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return;
+
+ if (pkt_burst > MAX_PKT_BURST) {
+ RTE_LOG(INFO, L3FWD, "User provided burst must be <= %d. Using default value %d\n",
+ MAX_PKT_BURST, nb_pkt_per_burst);
+ return;
+ } else if (pkt_burst > 0) {
+ nb_pkt_per_burst = (uint32_t)pkt_burst;
+ return;
+ }
+
+ /* If user gives a value of zero, query the PMD for its recommended Rx burst size. */
+ ret = rte_eth_dev_info_get(0, &dev_info);
+ if (ret != 0)
+ return;
+ burst_size = dev_info.default_rxportconf.burst_size;
+ if (burst_size == 0) {
+ RTE_LOG(INFO, L3FWD, "PMD does not recommend a burst size. Using default value %d. "
+ "User provided value must be in [1, %d]\n",
+ nb_pkt_per_burst, MAX_PKT_BURST);
+ return;
+ } else if (burst_size > MAX_PKT_BURST) {
+ RTE_LOG(INFO, L3FWD, "PMD recommended burst size %d exceeds maximum value %d. "
+ "Using default value %d\n",
+ burst_size, MAX_PKT_BURST, nb_pkt_per_burst);
+ return;
+ }
+ nb_pkt_per_burst = burst_size;
+ RTE_LOG(INFO, L3FWD, "Using PMD-provided burst value %d\n", burst_size);
+}
+
#define MAX_JUMBO_PKT_LEN 9600
static const char short_options[] =
@@ -698,6 +747,7 @@ static const char short_options[] =
#define CMD_LINE_OPT_RULE_IPV4 "rule_ipv4"
#define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
#define CMD_LINE_OPT_ALG "alg"
+#define CMD_LINE_OPT_PKT_BURST "burst"
enum {
/* long options mapped to a short option */
@@ -726,7 +776,8 @@ enum {
CMD_LINE_OPT_LOOKUP_NUM,
CMD_LINE_OPT_ENABLE_VECTOR_NUM,
CMD_LINE_OPT_VECTOR_SIZE_NUM,
- CMD_LINE_OPT_VECTOR_TMO_NS_NUM
+ CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
+ CMD_LINE_OPT_PKT_BURST_NUM
};
static const struct option lgopts[] = {
@@ -753,6 +804,7 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_RULE_IPV4, 1, 0, CMD_LINE_OPT_RULE_IPV4_NUM},
{CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
{CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
+ {CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
{NULL, 0, 0, 0}
};
@@ -841,6 +893,10 @@ parse_args(int argc, char **argv)
parse_queue_size(optarg, &nb_txd, 0);
break;
+ case CMD_LINE_OPT_PKT_BURST_NUM:
+ parse_pkt_burst(optarg);
+ break;
+
case CMD_LINE_OPT_ETH_DEST_NUM:
parse_eth_dest(optarg);
break;
--
2.22.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v3 2/2] examples/l3fwd: add option to set mbuf cache size
2024-10-17 9:58 ` [PATCH v3 " Jie Hai
2024-10-17 9:58 ` [PATCH v3 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
@ 2024-10-17 9:58 ` Jie Hai
2024-10-17 11:10 ` fengchengwen
1 sibling, 1 reply; 20+ messages in thread
From: Jie Hai @ 2024-10-17 9:58 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
The mempool cache size of mbuf is set to
RTE_MEMPOOL_CACHE_MAX_SIZE as default. This patch allows
users to configure the cache size by "--mbcache", and limits
the parameter to a maximum of RTE_MEMPOOL_CACHE_MAX_SIZE.
Signed-off-by: Jie Hai <haijie1@huawei.com>
Acked-by: Huisong Li <lihuisong@huawei.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
examples/l3fwd/l3fwd.h | 1 +
examples/l3fwd/main.c | 33 ++++++++++++++++++++++++++++++---
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 618e0eaa3af1..0cce3406ee7d 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -117,6 +117,7 @@ extern struct acl_algorithms acl_alg[];
extern uint32_t max_pkt_len;
extern uint32_t nb_pkt_per_burst;
+extern uint32_t mb_mempool_cache_size;
/* Send burst of packets on an output interface */
static inline int
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 8b7a07cc7d67..d08525faa1a6 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -58,6 +58,7 @@ static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST, "MAX_PKT_BURST should be at m
uint16_t nb_rxd = RX_DESC_DEFAULT;
uint16_t nb_txd = TX_DESC_DEFAULT;
uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
+uint32_t mb_mempool_cache_size = MEMPOOL_CACHE_SIZE;
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
@@ -399,6 +400,7 @@ print_usage(const char *prgname)
" [--rx-queue-size NPKTS]"
" [--tx-queue-size NPKTS]"
" [--burst NPKTS]"
+ " [--mbcache CACHESZ]"
" [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
" [--max-pkt-len PKTLEN]"
" [--no-numa]"
@@ -426,6 +428,8 @@ print_usage(const char *prgname)
" Default: %d\n"
" --burst NPKTS: Burst size in decimal\n"
" Default: %d\n"
+ " --mbcache CACHESZ: Cache size in decimal\n"
+ " Default: %d\n"
" --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
" --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
" --no-numa: Disable numa awareness\n"
@@ -455,7 +459,7 @@ print_usage(const char *prgname)
" another is route entry at while line leads with character '%c'.\n"
" --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
" --alg: ACL classify method to use, one of: %s.\n\n",
- prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
+ prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST, MEMPOOL_CACHE_SIZE,
ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
}
@@ -673,6 +677,22 @@ parse_lookup(const char *optarg)
return 0;
}
+static void
+parse_mbcache_size(const char *optarg)
+{
+ unsigned long mb_cache_size;
+ char *end = NULL;
+
+ mb_cache_size = strtoul(optarg, &end, 10);
+ if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return;
+ if (mb_cache_size <= RTE_MEMPOOL_CACHE_MAX_SIZE)
+ mb_mempool_cache_size = (uint32_t)mb_cache_size;
+ else
+ rte_exit(EXIT_FAILURE, "mbcache must be >= 0 and <= %d\n",
+ RTE_MEMPOOL_CACHE_MAX_SIZE);
+}
+
static void
parse_pkt_burst(const char *optarg)
{
@@ -748,6 +768,7 @@ static const char short_options[] =
#define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
#define CMD_LINE_OPT_ALG "alg"
#define CMD_LINE_OPT_PKT_BURST "burst"
+#define CMD_LINE_OPT_MB_CACHE_SIZE "mbcache"
enum {
/* long options mapped to a short option */
@@ -777,7 +798,8 @@ enum {
CMD_LINE_OPT_ENABLE_VECTOR_NUM,
CMD_LINE_OPT_VECTOR_SIZE_NUM,
CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
- CMD_LINE_OPT_PKT_BURST_NUM
+ CMD_LINE_OPT_PKT_BURST_NUM,
+ CMD_LINE_OPT_MB_CACHE_SIZE_NUM
};
static const struct option lgopts[] = {
@@ -805,6 +827,7 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
{CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
{CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
+ {CMD_LINE_OPT_MB_CACHE_SIZE, 1, 0, CMD_LINE_OPT_MB_CACHE_SIZE_NUM},
{NULL, 0, 0, 0}
};
@@ -897,6 +920,10 @@ parse_args(int argc, char **argv)
parse_pkt_burst(optarg);
break;
+ case CMD_LINE_OPT_MB_CACHE_SIZE_NUM:
+ parse_mbcache_size(optarg);
+ break;
+
case CMD_LINE_OPT_ETH_DEST_NUM:
parse_eth_dest(optarg);
break;
@@ -1089,7 +1116,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
portid, socketid);
pktmbuf_pool[portid][socketid] =
rte_pktmbuf_pool_create(s, nb_mbuf,
- MEMPOOL_CACHE_SIZE, 0,
+ mb_mempool_cache_size, 0,
RTE_MBUF_DEFAULT_BUF_SIZE, socketid);
if (pktmbuf_pool[portid][socketid] == NULL)
rte_exit(EXIT_FAILURE,
--
2.22.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v3 2/2] examples/l3fwd: add option to set mbuf cache size
2024-10-17 9:58 ` [PATCH v3 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
@ 2024-10-17 11:10 ` fengchengwen
0 siblings, 0 replies; 20+ messages in thread
From: fengchengwen @ 2024-10-17 11:10 UTC (permalink / raw)
To: Jie Hai, dev, thomas, ferruh.yigit; +Cc: lihuisong
There's a little tip that can be modified, with that modified:
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
On 2024/10/17 17:58, Jie Hai wrote:
> The mempool cache size of mbuf is set to
> RTE_MEMPOOL_CACHE_MAX_SIZE as default. This patch allows
> users to configure the cache size by "--mbcache", and limits
> the parameter to a maximum of RTE_MEMPOOL_CACHE_MAX_SIZE.
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
> Acked-by: Huisong Li <lihuisong@huawei.com>
> Acked-by: Morten Brørup <mb@smartsharesystems.com>
> ---
> examples/l3fwd/l3fwd.h | 1 +
> examples/l3fwd/main.c | 33 ++++++++++++++++++++++++++++++---
> 2 files changed, 31 insertions(+), 3 deletions(-)
>
> diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
> index 618e0eaa3af1..0cce3406ee7d 100644
> --- a/examples/l3fwd/l3fwd.h
> +++ b/examples/l3fwd/l3fwd.h
> @@ -117,6 +117,7 @@ extern struct acl_algorithms acl_alg[];
> extern uint32_t max_pkt_len;
>
> extern uint32_t nb_pkt_per_burst;
> +extern uint32_t mb_mempool_cache_size;
>
> /* Send burst of packets on an output interface */
> static inline int
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
> index 8b7a07cc7d67..d08525faa1a6 100644
> --- a/examples/l3fwd/main.c
> +++ b/examples/l3fwd/main.c
> @@ -58,6 +58,7 @@ static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST, "MAX_PKT_BURST should be at m
> uint16_t nb_rxd = RX_DESC_DEFAULT;
> uint16_t nb_txd = TX_DESC_DEFAULT;
> uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
> +uint32_t mb_mempool_cache_size = MEMPOOL_CACHE_SIZE;
>
> /**< Ports set in promiscuous mode off by default. */
> static int promiscuous_on;
> @@ -399,6 +400,7 @@ print_usage(const char *prgname)
> " [--rx-queue-size NPKTS]"
> " [--tx-queue-size NPKTS]"
> " [--burst NPKTS]"
> + " [--mbcache CACHESZ]"
> " [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
> " [--max-pkt-len PKTLEN]"
> " [--no-numa]"
> @@ -426,6 +428,8 @@ print_usage(const char *prgname)
> " Default: %d\n"
> " --burst NPKTS: Burst size in decimal\n"
> " Default: %d\n"
> + " --mbcache CACHESZ: Cache size in decimal\n"
Suggest " --mbcache CACHESZ: Mbuf cache size in decimal\n"
> + " Default: %d\n"
> " --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
> " --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
> " --no-numa: Disable numa awareness\n"
> @@ -455,7 +459,7 @@ print_usage(const char *prgname)
> " another is route entry at while line leads with character '%c'.\n"
> " --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
> " --alg: ACL classify method to use, one of: %s.\n\n",
> - prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
> + prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST, MEMPOOL_CACHE_SIZE,
> ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
> }
>
> @@ -673,6 +677,22 @@ parse_lookup(const char *optarg)
> return 0;
> }
>
> +static void
> +parse_mbcache_size(const char *optarg)
> +{
> + unsigned long mb_cache_size;
> + char *end = NULL;
> +
> + mb_cache_size = strtoul(optarg, &end, 10);
> + if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
> + return;
> + if (mb_cache_size <= RTE_MEMPOOL_CACHE_MAX_SIZE)
> + mb_mempool_cache_size = (uint32_t)mb_cache_size;
> + else
> + rte_exit(EXIT_FAILURE, "mbcache must be >= 0 and <= %d\n",
> + RTE_MEMPOOL_CACHE_MAX_SIZE);
> +}
> +
> static void
> parse_pkt_burst(const char *optarg)
> {
> @@ -748,6 +768,7 @@ static const char short_options[] =
> #define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
> #define CMD_LINE_OPT_ALG "alg"
> #define CMD_LINE_OPT_PKT_BURST "burst"
> +#define CMD_LINE_OPT_MB_CACHE_SIZE "mbcache"
>
> enum {
> /* long options mapped to a short option */
> @@ -777,7 +798,8 @@ enum {
> CMD_LINE_OPT_ENABLE_VECTOR_NUM,
> CMD_LINE_OPT_VECTOR_SIZE_NUM,
> CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
> - CMD_LINE_OPT_PKT_BURST_NUM
> + CMD_LINE_OPT_PKT_BURST_NUM,
> + CMD_LINE_OPT_MB_CACHE_SIZE_NUM
> };
>
> static const struct option lgopts[] = {
> @@ -805,6 +827,7 @@ static const struct option lgopts[] = {
> {CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
> {CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
> {CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
> + {CMD_LINE_OPT_MB_CACHE_SIZE, 1, 0, CMD_LINE_OPT_MB_CACHE_SIZE_NUM},
> {NULL, 0, 0, 0}
> };
>
> @@ -897,6 +920,10 @@ parse_args(int argc, char **argv)
> parse_pkt_burst(optarg);
> break;
>
> + case CMD_LINE_OPT_MB_CACHE_SIZE_NUM:
> + parse_mbcache_size(optarg);
> + break;
> +
> case CMD_LINE_OPT_ETH_DEST_NUM:
> parse_eth_dest(optarg);
> break;
> @@ -1089,7 +1116,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
> portid, socketid);
> pktmbuf_pool[portid][socketid] =
> rte_pktmbuf_pool_create(s, nb_mbuf,
> - MEMPOOL_CACHE_SIZE, 0,
> + mb_mempool_cache_size, 0,
> RTE_MBUF_DEFAULT_BUF_SIZE, socketid);
> if (pktmbuf_pool[portid][socketid] == NULL)
> rte_exit(EXIT_FAILURE,
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v4 0/2] examples/l3fwd: add more options
2024-10-12 8:40 [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
` (3 preceding siblings ...)
2024-10-17 9:58 ` [PATCH v3 " Jie Hai
@ 2024-10-18 1:08 ` Jie Hai
2024-10-18 1:08 ` [PATCH v4 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
` (4 more replies)
2024-11-06 1:51 ` [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
5 siblings, 5 replies; 20+ messages in thread
From: Jie Hai @ 2024-10-18 1:08 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
Add options to support configuring RX burst size and cache size
of mbuf mempoool.
--
v4:
1. fix help info.
v3:
1. add Acked-bys.
2. fix compile error.
--
Jie Hai (2):
examples/l3fwd: add option to set RX burst size
examples/l3fwd: add option to set mbuf cache size
examples/l3fwd/l3fwd.h | 8 +++-
examples/l3fwd/l3fwd_acl.c | 2 +-
examples/l3fwd/l3fwd_em.c | 2 +-
examples/l3fwd/l3fwd_fib.c | 2 +-
examples/l3fwd/l3fwd_lpm.c | 2 +-
examples/l3fwd/main.c | 89 ++++++++++++++++++++++++++++++++++++--
6 files changed, 96 insertions(+), 9 deletions(-)
--
2.22.0
^ permalink raw reply [flat|nested] 20+ messages in thread* [PATCH v4 1/2] examples/l3fwd: add option to set RX burst size
2024-10-18 1:08 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
@ 2024-10-18 1:08 ` Jie Hai
2024-10-18 1:08 ` [PATCH v4 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
` (3 subsequent siblings)
4 siblings, 0 replies; 20+ messages in thread
From: Jie Hai @ 2024-10-18 1:08 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
Now the Rx burst size is fixed to MAX_PKT_BURST (32). This
parameter needs to be modified in some performance optimization
scenarios. So an option '--burst' is added to set the burst size
explicitly. The default value is DEFAULT_PKT_BURST (32) and maximum
value is MAX_PKT_BURST (512).
Signed-off-by: Jie Hai <haijie1@huawei.com>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Huisong Li <lihuisong@huawei.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
---
examples/l3fwd/l3fwd.h | 7 +++--
examples/l3fwd/l3fwd_acl.c | 2 +-
examples/l3fwd/l3fwd_em.c | 2 +-
examples/l3fwd/l3fwd_fib.c | 2 +-
examples/l3fwd/l3fwd_lpm.c | 2 +-
examples/l3fwd/main.c | 60 ++++++++++++++++++++++++++++++++++++--
6 files changed, 67 insertions(+), 8 deletions(-)
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 93ce652d02b7..618e0eaa3af1 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -23,10 +23,11 @@
#define RX_DESC_DEFAULT 1024
#define TX_DESC_DEFAULT 1024
-#define MAX_PKT_BURST 32
+#define DEFAULT_PKT_BURST 32
+#define MAX_PKT_BURST 512
#define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
-#define MEMPOOL_CACHE_SIZE 256
+#define MEMPOOL_CACHE_SIZE RTE_MEMPOOL_CACHE_MAX_SIZE
#define MAX_RX_QUEUE_PER_LCORE 16
#define VECTOR_SIZE_DEFAULT MAX_PKT_BURST
@@ -115,6 +116,8 @@ extern struct acl_algorithms acl_alg[];
extern uint32_t max_pkt_len;
+extern uint32_t nb_pkt_per_burst;
+
/* Send burst of packets on an output interface */
static inline int
send_burst(struct lcore_conf *qconf, uint16_t n, uint16_t port)
diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c
index b635011ef708..ccb9946837ed 100644
--- a/examples/l3fwd/l3fwd_acl.c
+++ b/examples/l3fwd/l3fwd_acl.c
@@ -1119,7 +1119,7 @@ acl_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid,
- pkts_burst, MAX_PKT_BURST);
+ pkts_burst, nb_pkt_per_burst);
if (nb_rx > 0) {
acl_process_pkts(pkts_burst, hops, nb_rx,
diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
index 31a7e05e39d0..da9c45e3a482 100644
--- a/examples/l3fwd/l3fwd_em.c
+++ b/examples/l3fwd/l3fwd_em.c
@@ -644,7 +644,7 @@ em_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c
index 993e36cec235..5fa32685f419 100644
--- a/examples/l3fwd/l3fwd_fib.c
+++ b/examples/l3fwd/l3fwd_fib.c
@@ -239,7 +239,7 @@ fib_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
index e8fd95aae9ce..048c02491378 100644
--- a/examples/l3fwd/l3fwd_lpm.c
+++ b/examples/l3fwd/l3fwd_lpm.c
@@ -205,7 +205,7 @@ lpm_main_loop(__rte_unused void *dummy)
portid = qconf->rx_queue_list[i].port_id;
queueid = qconf->rx_queue_list[i].queue_id;
nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
- MAX_PKT_BURST);
+ nb_pkt_per_burst);
if (nb_rx == 0)
continue;
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 01b763e5ba11..8b7a07cc7d67 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -14,6 +14,7 @@
#include <getopt.h>
#include <signal.h>
#include <stdbool.h>
+#include <assert.h>
#include <rte_common.h>
#include <rte_vect.h>
@@ -53,8 +54,10 @@
#define MAX_LCORE_PARAMS 1024
+static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST, "MAX_PKT_BURST should be at most MEMPOOL_CACHE_SIZE");
uint16_t nb_rxd = RX_DESC_DEFAULT;
uint16_t nb_txd = TX_DESC_DEFAULT;
+uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
@@ -395,6 +398,7 @@ print_usage(const char *prgname)
" --config (port,queue,lcore)[,(port,queue,lcore)]"
" [--rx-queue-size NPKTS]"
" [--tx-queue-size NPKTS]"
+ " [--burst NPKTS]"
" [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
" [--max-pkt-len PKTLEN]"
" [--no-numa]"
@@ -420,6 +424,8 @@ print_usage(const char *prgname)
" Default: %d\n"
" --tx-queue-size NPKTS: Tx queue size in decimal\n"
" Default: %d\n"
+ " --burst NPKTS: Burst size in decimal\n"
+ " Default: %d\n"
" --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
" --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
" --no-numa: Disable numa awareness\n"
@@ -449,7 +455,7 @@ print_usage(const char *prgname)
" another is route entry at while line leads with character '%c'.\n"
" --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
" --alg: ACL classify method to use, one of: %s.\n\n",
- prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT,
+ prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
}
@@ -667,6 +673,49 @@ parse_lookup(const char *optarg)
return 0;
}
+static void
+parse_pkt_burst(const char *optarg)
+{
+ struct rte_eth_dev_info dev_info;
+ unsigned long pkt_burst;
+ uint16_t burst_size;
+ char *end = NULL;
+ int ret;
+
+ /* parse decimal string */
+ pkt_burst = strtoul(optarg, &end, 10);
+ if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return;
+
+ if (pkt_burst > MAX_PKT_BURST) {
+ RTE_LOG(INFO, L3FWD, "User provided burst must be <= %d. Using default value %d\n",
+ MAX_PKT_BURST, nb_pkt_per_burst);
+ return;
+ } else if (pkt_burst > 0) {
+ nb_pkt_per_burst = (uint32_t)pkt_burst;
+ return;
+ }
+
+ /* If user gives a value of zero, query the PMD for its recommended Rx burst size. */
+ ret = rte_eth_dev_info_get(0, &dev_info);
+ if (ret != 0)
+ return;
+ burst_size = dev_info.default_rxportconf.burst_size;
+ if (burst_size == 0) {
+ RTE_LOG(INFO, L3FWD, "PMD does not recommend a burst size. Using default value %d. "
+ "User provided value must be in [1, %d]\n",
+ nb_pkt_per_burst, MAX_PKT_BURST);
+ return;
+ } else if (burst_size > MAX_PKT_BURST) {
+ RTE_LOG(INFO, L3FWD, "PMD recommended burst size %d exceeds maximum value %d. "
+ "Using default value %d\n",
+ burst_size, MAX_PKT_BURST, nb_pkt_per_burst);
+ return;
+ }
+ nb_pkt_per_burst = burst_size;
+ RTE_LOG(INFO, L3FWD, "Using PMD-provided burst value %d\n", burst_size);
+}
+
#define MAX_JUMBO_PKT_LEN 9600
static const char short_options[] =
@@ -698,6 +747,7 @@ static const char short_options[] =
#define CMD_LINE_OPT_RULE_IPV4 "rule_ipv4"
#define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
#define CMD_LINE_OPT_ALG "alg"
+#define CMD_LINE_OPT_PKT_BURST "burst"
enum {
/* long options mapped to a short option */
@@ -726,7 +776,8 @@ enum {
CMD_LINE_OPT_LOOKUP_NUM,
CMD_LINE_OPT_ENABLE_VECTOR_NUM,
CMD_LINE_OPT_VECTOR_SIZE_NUM,
- CMD_LINE_OPT_VECTOR_TMO_NS_NUM
+ CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
+ CMD_LINE_OPT_PKT_BURST_NUM
};
static const struct option lgopts[] = {
@@ -753,6 +804,7 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_RULE_IPV4, 1, 0, CMD_LINE_OPT_RULE_IPV4_NUM},
{CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
{CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
+ {CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
{NULL, 0, 0, 0}
};
@@ -841,6 +893,10 @@ parse_args(int argc, char **argv)
parse_queue_size(optarg, &nb_txd, 0);
break;
+ case CMD_LINE_OPT_PKT_BURST_NUM:
+ parse_pkt_burst(optarg);
+ break;
+
case CMD_LINE_OPT_ETH_DEST_NUM:
parse_eth_dest(optarg);
break;
--
2.22.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH v4 2/2] examples/l3fwd: add option to set mbuf cache size
2024-10-18 1:08 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
2024-10-18 1:08 ` [PATCH v4 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
@ 2024-10-18 1:08 ` Jie Hai
2024-11-06 1:52 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
` (2 subsequent siblings)
4 siblings, 0 replies; 20+ messages in thread
From: Jie Hai @ 2024-10-18 1:08 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen, haijie1
The mempool cache size of mbuf is set to
RTE_MEMPOOL_CACHE_MAX_SIZE as default. This patch allows
users to configure the cache size by "--mbcache", and limits
the parameter to a maximum of RTE_MEMPOOL_CACHE_MAX_SIZE.
Signed-off-by: Jie Hai <haijie1@huawei.com>
Acked-by: Huisong Li <lihuisong@huawei.com>
Acked-by: Morten Brørup <mb@smartsharesystems.com>
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
---
examples/l3fwd/l3fwd.h | 1 +
examples/l3fwd/main.c | 33 ++++++++++++++++++++++++++++++---
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
index 618e0eaa3af1..0cce3406ee7d 100644
--- a/examples/l3fwd/l3fwd.h
+++ b/examples/l3fwd/l3fwd.h
@@ -117,6 +117,7 @@ extern struct acl_algorithms acl_alg[];
extern uint32_t max_pkt_len;
extern uint32_t nb_pkt_per_burst;
+extern uint32_t mb_mempool_cache_size;
/* Send burst of packets on an output interface */
static inline int
diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
index 8b7a07cc7d67..7d58ae3c11bc 100644
--- a/examples/l3fwd/main.c
+++ b/examples/l3fwd/main.c
@@ -58,6 +58,7 @@ static_assert(MEMPOOL_CACHE_SIZE >= MAX_PKT_BURST, "MAX_PKT_BURST should be at m
uint16_t nb_rxd = RX_DESC_DEFAULT;
uint16_t nb_txd = TX_DESC_DEFAULT;
uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
+uint32_t mb_mempool_cache_size = MEMPOOL_CACHE_SIZE;
/**< Ports set in promiscuous mode off by default. */
static int promiscuous_on;
@@ -399,6 +400,7 @@ print_usage(const char *prgname)
" [--rx-queue-size NPKTS]"
" [--tx-queue-size NPKTS]"
" [--burst NPKTS]"
+ " [--mbcache CACHESZ]"
" [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
" [--max-pkt-len PKTLEN]"
" [--no-numa]"
@@ -426,6 +428,8 @@ print_usage(const char *prgname)
" Default: %d\n"
" --burst NPKTS: Burst size in decimal\n"
" Default: %d\n"
+ " --mbcache CACHESZ: Mbuf cache size in decimal\n"
+ " Default: %d\n"
" --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
" --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
" --no-numa: Disable numa awareness\n"
@@ -455,7 +459,7 @@ print_usage(const char *prgname)
" another is route entry at while line leads with character '%c'.\n"
" --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
" --alg: ACL classify method to use, one of: %s.\n\n",
- prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
+ prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST, MEMPOOL_CACHE_SIZE,
ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
}
@@ -673,6 +677,22 @@ parse_lookup(const char *optarg)
return 0;
}
+static void
+parse_mbcache_size(const char *optarg)
+{
+ unsigned long mb_cache_size;
+ char *end = NULL;
+
+ mb_cache_size = strtoul(optarg, &end, 10);
+ if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
+ return;
+ if (mb_cache_size <= RTE_MEMPOOL_CACHE_MAX_SIZE)
+ mb_mempool_cache_size = (uint32_t)mb_cache_size;
+ else
+ rte_exit(EXIT_FAILURE, "mbcache must be >= 0 and <= %d\n",
+ RTE_MEMPOOL_CACHE_MAX_SIZE);
+}
+
static void
parse_pkt_burst(const char *optarg)
{
@@ -748,6 +768,7 @@ static const char short_options[] =
#define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
#define CMD_LINE_OPT_ALG "alg"
#define CMD_LINE_OPT_PKT_BURST "burst"
+#define CMD_LINE_OPT_MB_CACHE_SIZE "mbcache"
enum {
/* long options mapped to a short option */
@@ -777,7 +798,8 @@ enum {
CMD_LINE_OPT_ENABLE_VECTOR_NUM,
CMD_LINE_OPT_VECTOR_SIZE_NUM,
CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
- CMD_LINE_OPT_PKT_BURST_NUM
+ CMD_LINE_OPT_PKT_BURST_NUM,
+ CMD_LINE_OPT_MB_CACHE_SIZE_NUM
};
static const struct option lgopts[] = {
@@ -805,6 +827,7 @@ static const struct option lgopts[] = {
{CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
{CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
{CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPT_PKT_BURST_NUM},
+ {CMD_LINE_OPT_MB_CACHE_SIZE, 1, 0, CMD_LINE_OPT_MB_CACHE_SIZE_NUM},
{NULL, 0, 0, 0}
};
@@ -897,6 +920,10 @@ parse_args(int argc, char **argv)
parse_pkt_burst(optarg);
break;
+ case CMD_LINE_OPT_MB_CACHE_SIZE_NUM:
+ parse_mbcache_size(optarg);
+ break;
+
case CMD_LINE_OPT_ETH_DEST_NUM:
parse_eth_dest(optarg);
break;
@@ -1089,7 +1116,7 @@ init_mem(uint16_t portid, unsigned int nb_mbuf)
portid, socketid);
pktmbuf_pool[portid][socketid] =
rte_pktmbuf_pool_create(s, nb_mbuf,
- MEMPOOL_CACHE_SIZE, 0,
+ mb_mempool_cache_size, 0,
RTE_MBUF_DEFAULT_BUF_SIZE, socketid);
if (pktmbuf_pool[portid][socketid] == NULL)
rte_exit(EXIT_FAILURE,
--
2.22.0
^ permalink raw reply related [flat|nested] 20+ messages in thread* Re: [PATCH v4 0/2] examples/l3fwd: add more options
2024-10-18 1:08 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
2024-10-18 1:08 ` [PATCH v4 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-18 1:08 ` [PATCH v4 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
@ 2024-11-06 1:52 ` Jie Hai
2024-11-13 1:35 ` Jie Hai
2024-11-19 18:07 ` Thomas Monjalon
4 siblings, 0 replies; 20+ messages in thread
From: Jie Hai @ 2024-11-06 1:52 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen
Hi, all maintainers,
Kindly ping for review.
Thanks,
Jie Hai
On 2024/10/18 9:08, Jie Hai wrote:
> Add options to support configuring RX burst size and cache size
> of mbuf mempoool.
>
> --
> v4:
> 1. fix help info.
>
> v3:
> 1. add Acked-bys.
> 2. fix compile error.
> --
>
> Jie Hai (2):
> examples/l3fwd: add option to set RX burst size
> examples/l3fwd: add option to set mbuf cache size
>
> examples/l3fwd/l3fwd.h | 8 +++-
> examples/l3fwd/l3fwd_acl.c | 2 +-
> examples/l3fwd/l3fwd_em.c | 2 +-
> examples/l3fwd/l3fwd_fib.c | 2 +-
> examples/l3fwd/l3fwd_lpm.c | 2 +-
> examples/l3fwd/main.c | 89 ++++++++++++++++++++++++++++++++++++--
> 6 files changed, 96 insertions(+), 9 deletions(-)
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v4 0/2] examples/l3fwd: add more options
2024-10-18 1:08 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
` (2 preceding siblings ...)
2024-11-06 1:52 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
@ 2024-11-13 1:35 ` Jie Hai
2024-11-19 18:07 ` Thomas Monjalon
4 siblings, 0 replies; 20+ messages in thread
From: Jie Hai @ 2024-11-13 1:35 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit
Cc: lihuisong, fengchengwen, ferruh.yigit, Ferruh Yigit,
Thomas Monjalon
Hi, Ferruh and Thomas,
Kindly ping for reviews.
Since this patchset has some Acked-bys and no comments,
are there any comments or suggestions?
Best regards,
Jie Hai
On 2024/10/18 9:08, Jie Hai wrote:
> Add options to support configuring RX burst size and cache size
> of mbuf mempoool.
>
> --
> v4:
> 1. fix help info.
>
> v3:
> 1. add Acked-bys.
> 2. fix compile error.
> --
>
> Jie Hai (2):
> examples/l3fwd: add option to set RX burst size
> examples/l3fwd: add option to set mbuf cache size
>
> examples/l3fwd/l3fwd.h | 8 +++-
> examples/l3fwd/l3fwd_acl.c | 2 +-
> examples/l3fwd/l3fwd_em.c | 2 +-
> examples/l3fwd/l3fwd_fib.c | 2 +-
> examples/l3fwd/l3fwd_lpm.c | 2 +-
> examples/l3fwd/main.c | 89 ++++++++++++++++++++++++++++++++++++--
> 6 files changed, 96 insertions(+), 9 deletions(-)
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH v4 0/2] examples/l3fwd: add more options
2024-10-18 1:08 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
` (3 preceding siblings ...)
2024-11-13 1:35 ` Jie Hai
@ 2024-11-19 18:07 ` Thomas Monjalon
4 siblings, 0 replies; 20+ messages in thread
From: Thomas Monjalon @ 2024-11-19 18:07 UTC (permalink / raw)
To: Jie Hai; +Cc: dev, ferruh.yigit, lihuisong, fengchengwen, haijie1
18/10/2024 03:08, Jie Hai:
> Add options to support configuring RX burst size and cache size
> of mbuf mempoool.
Applied, thanks.
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH] examples/l3fwd: add option to set RX burst size
2024-10-12 8:40 [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
` (4 preceding siblings ...)
2024-10-18 1:08 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
@ 2024-11-06 1:51 ` Jie Hai
5 siblings, 0 replies; 20+ messages in thread
From: Jie Hai @ 2024-11-06 1:51 UTC (permalink / raw)
To: dev, thomas, ferruh.yigit; +Cc: lihuisong, fengchengwen
Hi, all maintainers,
Kindly ping for review.
Thanks,
Jie Hai
On 2024/10/12 16:40, Jie Hai wrote:
> Now the Rx burst size is fixed to MAX_PKT_BURST (32). This
> parameter needs to be modified in some performance optimization
> scenarios. So an option '--burst' is added to set the burst size
> explicitly. The default value is DEFAULT_PKT_BURST (32) and maximum
> value is MAX_PKT_BURST (512).
>
> Signed-off-by: Jie Hai <haijie1@huawei.com>
> ---
> examples/l3fwd/l3fwd.h | 5 +++-
> examples/l3fwd/l3fwd_acl.c | 2 +-
> examples/l3fwd/l3fwd_em.c | 2 +-
> examples/l3fwd/l3fwd_fib.c | 2 +-
> examples/l3fwd/l3fwd_lpm.c | 2 +-
> examples/l3fwd/main.c | 58 ++++++++++++++++++++++++++++++++++++--
> 6 files changed, 64 insertions(+), 7 deletions(-)
>
> diff --git a/examples/l3fwd/l3fwd.h b/examples/l3fwd/l3fwd.h
> index 93ce652d02b7..3ebee6301295 100644
> --- a/examples/l3fwd/l3fwd.h
> +++ b/examples/l3fwd/l3fwd.h
> @@ -23,7 +23,8 @@
> #define RX_DESC_DEFAULT 1024
> #define TX_DESC_DEFAULT 1024
>
> -#define MAX_PKT_BURST 32
> +#define DEFAULT_PKT_BURST 32
> +#define MAX_PKT_BURST 512
> #define BURST_TX_DRAIN_US 100 /* TX drain every ~100us */
>
> #define MEMPOOL_CACHE_SIZE 256
> @@ -115,6 +116,8 @@ extern struct acl_algorithms acl_alg[];
>
> extern uint32_t max_pkt_len;
>
> +extern uint32_t nb_pkt_per_burst;
> +
> /* Send burst of packets on an output interface */
> static inline int
> send_burst(struct lcore_conf *qconf, uint16_t n, uint16_t port)
> diff --git a/examples/l3fwd/l3fwd_acl.c b/examples/l3fwd/l3fwd_acl.c
> index b635011ef708..ccb9946837ed 100644
> --- a/examples/l3fwd/l3fwd_acl.c
> +++ b/examples/l3fwd/l3fwd_acl.c
> @@ -1119,7 +1119,7 @@ acl_main_loop(__rte_unused void *dummy)
> portid = qconf->rx_queue_list[i].port_id;
> queueid = qconf->rx_queue_list[i].queue_id;
> nb_rx = rte_eth_rx_burst(portid, queueid,
> - pkts_burst, MAX_PKT_BURST);
> + pkts_burst, nb_pkt_per_burst);
>
> if (nb_rx > 0) {
> acl_process_pkts(pkts_burst, hops, nb_rx,
> diff --git a/examples/l3fwd/l3fwd_em.c b/examples/l3fwd/l3fwd_em.c
> index 31a7e05e39d0..da9c45e3a482 100644
> --- a/examples/l3fwd/l3fwd_em.c
> +++ b/examples/l3fwd/l3fwd_em.c
> @@ -644,7 +644,7 @@ em_main_loop(__rte_unused void *dummy)
> portid = qconf->rx_queue_list[i].port_id;
> queueid = qconf->rx_queue_list[i].queue_id;
> nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
> - MAX_PKT_BURST);
> + nb_pkt_per_burst);
> if (nb_rx == 0)
> continue;
>
> diff --git a/examples/l3fwd/l3fwd_fib.c b/examples/l3fwd/l3fwd_fib.c
> index f38b19af3f57..aa81b12fe7dc 100644
> --- a/examples/l3fwd/l3fwd_fib.c
> +++ b/examples/l3fwd/l3fwd_fib.c
> @@ -239,7 +239,7 @@ fib_main_loop(__rte_unused void *dummy)
> portid = qconf->rx_queue_list[i].port_id;
> queueid = qconf->rx_queue_list[i].queue_id;
> nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
> - MAX_PKT_BURST);
> + nb_pkt_per_burst);
> if (nb_rx == 0)
> continue;
>
> diff --git a/examples/l3fwd/l3fwd_lpm.c b/examples/l3fwd/l3fwd_lpm.c
> index e8fd95aae9ce..048c02491378 100644
> --- a/examples/l3fwd/l3fwd_lpm.c
> +++ b/examples/l3fwd/l3fwd_lpm.c
> @@ -205,7 +205,7 @@ lpm_main_loop(__rte_unused void *dummy)
> portid = qconf->rx_queue_list[i].port_id;
> queueid = qconf->rx_queue_list[i].queue_id;
> nb_rx = rte_eth_rx_burst(portid, queueid, pkts_burst,
> - MAX_PKT_BURST);
> + nb_pkt_per_burst);
> if (nb_rx == 0)
> continue;
>
> diff --git a/examples/l3fwd/main.c b/examples/l3fwd/main.c
> index 01b763e5ba11..ba0a7f7088f0 100644
> --- a/examples/l3fwd/main.c
> +++ b/examples/l3fwd/main.c
> @@ -55,6 +55,7 @@
>
> uint16_t nb_rxd = RX_DESC_DEFAULT;
> uint16_t nb_txd = TX_DESC_DEFAULT;
> +uint32_t nb_pkt_per_burst = DEFAULT_PKT_BURST;
>
> /**< Ports set in promiscuous mode off by default. */
> static int promiscuous_on;
> @@ -395,6 +396,7 @@ print_usage(const char *prgname)
> " --config (port,queue,lcore)[,(port,queue,lcore)]"
> " [--rx-queue-size NPKTS]"
> " [--tx-queue-size NPKTS]"
> + " [--burst NPKTS]"
> " [--eth-dest=X,MM:MM:MM:MM:MM:MM]"
> " [--max-pkt-len PKTLEN]"
> " [--no-numa]"
> @@ -420,6 +422,8 @@ print_usage(const char *prgname)
> " Default: %d\n"
> " --tx-queue-size NPKTS: Tx queue size in decimal\n"
> " Default: %d\n"
> + " --burst NPKTS: Burst size in decimal\n"
> + " Default: %d\n"
> " --eth-dest=X,MM:MM:MM:MM:MM:MM: Ethernet destination for port X\n"
> " --max-pkt-len PKTLEN: maximum packet length in decimal (64-9600)\n"
> " --no-numa: Disable numa awareness\n"
> @@ -449,7 +453,7 @@ print_usage(const char *prgname)
> " another is route entry at while line leads with character '%c'.\n"
> " --rule_ipv6=FILE: Specify the ipv6 rules entries file.\n"
> " --alg: ACL classify method to use, one of: %s.\n\n",
> - prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT,
> + prgname, RX_DESC_DEFAULT, TX_DESC_DEFAULT, DEFAULT_PKT_BURST,
> ACL_LEAD_CHAR, ROUTE_LEAD_CHAR, alg);
> }
>
> @@ -667,6 +671,49 @@ parse_lookup(const char *optarg)
> return 0;
> }
>
> +static void
> +parse_pkt_burst(const char *optarg)
> +{
> + struct rte_eth_dev_info dev_info;
> + uint16_t burst_size;
> + uint16_t pkt_burst;
> + char *end = NULL;
> + int ret;
> +
> + /* parse decimal string */
> + pkt_burst = strtoul(optarg, &end, 10);
> + if ((optarg[0] == '\0') || (end == NULL) || (*end != '\0'))
> + return;
> +
> + if (pkt_burst > MAX_PKT_BURST) {
> + RTE_LOG(INFO, L3FWD, "User provided burst must be <= %d. Using default value %d\n",
> + MAX_PKT_BURST, nb_pkt_per_burst);
> + return;
> + } else if (pkt_burst > 0) {
> + nb_pkt_per_burst = pkt_burst;
> + return;
> + }
> +
> + /* If user gives a value of zero, query the PMD for its recommended Rx burst size. */
> + ret = rte_eth_dev_info_get(0, &dev_info);
> + if (ret != 0)
> + return;
> + burst_size = dev_info.default_rxportconf.burst_size;
> + if (burst_size == 0) {
> + RTE_LOG(INFO, L3FWD, "PMD does not recommend a burst size. Using default value %d. "
> + "User provided value must be in [1, %d]\n",
> + nb_pkt_per_burst, MAX_PKT_BURST);
> + return;
> + } else if (burst_size > MAX_PKT_BURST) {
> + RTE_LOG(INFO, L3FWD, "PMD recommended burst size %d exceeds maximum value %d. "
> + "Using default value %d\n",
> + burst_size, MAX_PKT_BURST, nb_pkt_per_burst);
> + return;
> + }
> + nb_pkt_per_burst = burst_size;
> + RTE_LOG(INFO, L3FWD, "Using PMD-provided burst value %d\n", burst_size);
> +}
> +
> #define MAX_JUMBO_PKT_LEN 9600
>
> static const char short_options[] =
> @@ -698,6 +745,7 @@ static const char short_options[] =
> #define CMD_LINE_OPT_RULE_IPV4 "rule_ipv4"
> #define CMD_LINE_OPT_RULE_IPV6 "rule_ipv6"
> #define CMD_LINE_OPT_ALG "alg"
> +#define CMD_LINE_OPT_PKT_BURST "burst"
>
> enum {
> /* long options mapped to a short option */
> @@ -726,7 +774,8 @@ enum {
> CMD_LINE_OPT_LOOKUP_NUM,
> CMD_LINE_OPT_ENABLE_VECTOR_NUM,
> CMD_LINE_OPT_VECTOR_SIZE_NUM,
> - CMD_LINE_OPT_VECTOR_TMO_NS_NUM
> + CMD_LINE_OPT_VECTOR_TMO_NS_NUM,
> + CMD_LINE_OPTPKT_BURST_NUM
> };
>
> static const struct option lgopts[] = {
> @@ -753,6 +802,7 @@ static const struct option lgopts[] = {
> {CMD_LINE_OPT_RULE_IPV4, 1, 0, CMD_LINE_OPT_RULE_IPV4_NUM},
> {CMD_LINE_OPT_RULE_IPV6, 1, 0, CMD_LINE_OPT_RULE_IPV6_NUM},
> {CMD_LINE_OPT_ALG, 1, 0, CMD_LINE_OPT_ALG_NUM},
> + {CMD_LINE_OPT_PKT_BURST, 1, 0, CMD_LINE_OPTPKT_BURST_NUM},
> {NULL, 0, 0, 0}
> };
>
> @@ -841,6 +891,10 @@ parse_args(int argc, char **argv)
> parse_queue_size(optarg, &nb_txd, 0);
> break;
>
> + case CMD_LINE_OPTPKT_BURST_NUM:
> + parse_pkt_burst(optarg);
> + break;
> +
> case CMD_LINE_OPT_ETH_DEST_NUM:
> parse_eth_dest(optarg);
> break;
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2024-11-19 18:07 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-12 8:40 [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-12 9:06 ` fengchengwen
2024-10-12 12:22 ` Morten Brørup
2024-10-17 8:58 ` [PATCH v2 0/2] examples/l3fwd: add more options Jie Hai
2024-10-17 8:58 ` [PATCH v2 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-17 9:37 ` lihuisong (C)
2024-10-17 8:58 ` [PATCH v2 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
2024-10-17 9:40 ` lihuisong (C)
2024-10-17 9:18 ` [PATCH v2 0/2] examples/l3fwd: add more options Morten Brørup
2024-10-17 9:58 ` [PATCH v3 " Jie Hai
2024-10-17 9:58 ` [PATCH v3 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-17 9:58 ` [PATCH v3 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
2024-10-17 11:10 ` fengchengwen
2024-10-18 1:08 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
2024-10-18 1:08 ` [PATCH v4 1/2] examples/l3fwd: add option to set RX burst size Jie Hai
2024-10-18 1:08 ` [PATCH v4 2/2] examples/l3fwd: add option to set mbuf cache size Jie Hai
2024-11-06 1:52 ` [PATCH v4 0/2] examples/l3fwd: add more options Jie Hai
2024-11-13 1:35 ` Jie Hai
2024-11-19 18:07 ` Thomas Monjalon
2024-11-06 1:51 ` [PATCH] examples/l3fwd: add option to set RX burst size Jie Hai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.