From: Long Wu <long...@corigine.com> The testpmd application can not modify the value of dedicated hardware Rx/Tx queue size, and hardcoded them as (128/512). This will cause the bonding port start fail if some NIC requires more Rx/Tx descriptors than the hardcoded number.
Therefore, add a command into testpmd application to support the modification of the size of the dedicated hardware Rx/Tx queue. Also export an external interface to also let other applications can change it. Signed-off-by: Long Wu <long...@corigine.com> Reviewed-by: Peng Zhang <peng.zh...@corigine.com> Reviewed-by: Chaoyong He <chaoyong...@corigine.com> --- .../link_bonding_poll_mode_drv_lib.rst | 8 ++ doc/guides/rel_notes/release_24_07.rst | 4 + drivers/net/bonding/bonding_testpmd.c | 84 +++++++++++++++++++ drivers/net/bonding/eth_bond_8023ad_private.h | 3 + drivers/net/bonding/rte_eth_bond_8023ad.c | 39 +++++++++ drivers/net/bonding/rte_eth_bond_8023ad.h | 23 +++++ drivers/net/bonding/rte_eth_bond_pmd.c | 6 +- drivers/net/bonding/version.map | 1 + 8 files changed, 166 insertions(+), 2 deletions(-) diff --git a/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst b/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst index 60717a3587..6498cf7d3d 100644 --- a/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst +++ b/doc/guides/prog_guide/link_bonding_poll_mode_drv_lib.rst @@ -637,3 +637,11 @@ in balance mode with a transmission policy of layer 2+3:: Members (3): [1 3 4] Active Members (3): [1 3 4] Primary: [3] + +set bonding lacp dedicated_queue size +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Set hardware dedicated queue size for LACP control traffic in +mode 4 (link-aggregation-802.3ad):: + + testpmd> set bonding lacp dedicated_queues <port_id> (rxq|txq) queue_size <size> diff --git a/doc/guides/rel_notes/release_24_07.rst b/doc/guides/rel_notes/release_24_07.rst index e68a53d757..a17b5c4302 100644 --- a/doc/guides/rel_notes/release_24_07.rst +++ b/doc/guides/rel_notes/release_24_07.rst @@ -89,6 +89,10 @@ New Features * Added SSE/NEON vector datapath. +* **Updated bonding driver.** + + * Added new function ``rte_eth_bond_8023ad_dedicated_queue_size_set`` + to set hardware dedicated Rx/Tx queue size in mode-4. Removed Items ------------- diff --git a/drivers/net/bonding/bonding_testpmd.c b/drivers/net/bonding/bonding_testpmd.c index 45b636fea7..540f0d64aa 100644 --- a/drivers/net/bonding/bonding_testpmd.c +++ b/drivers/net/bonding/bonding_testpmd.c @@ -154,6 +154,85 @@ static cmdline_parse_inst_t cmd_set_lacp_dedicated_queues = { } }; +/* *** SET BONDING SLOW_QUEUE HW QUEUE SIZE *** */ +struct cmd_set_bonding_hw_dedicated_queue_size_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t bonding; + cmdline_fixed_string_t lacp; + cmdline_fixed_string_t dedicated_queues; + portid_t port_id; + cmdline_fixed_string_t queue_type; + cmdline_fixed_string_t queue_size; + uint16_t size; +}; + +static void cmd_set_bonding_hw_dedicated_queue_size_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, __rte_unused void *data) +{ + int ret; + struct rte_port *port; + struct cmd_set_bonding_hw_dedicated_queue_size_result *res = parsed_result; + + port = &ports[res->port_id]; + + /** Check if the port is not started **/ + if (port->port_status != RTE_PORT_STOPPED) { + TESTPMD_LOG(ERR, "Please stop port %u first\n", res->port_id); + return; + } + + ret = rte_eth_bond_8023ad_dedicated_queue_size_set(res->port_id, + res->size, res->queue_type); + if (ret != 0) + TESTPMD_LOG(ERR, "Failed to set port %u hardware dedicated %s " + "ring size %u\n", + res->port_id, res->queue_type, res->size); +} + +static cmdline_parse_token_string_t cmd_setbonding_hw_dedicated_queue_size_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_hw_dedicated_queue_size_result, + set, "set"); +static cmdline_parse_token_string_t cmd_setbonding_hw_dedicated_queue_size_bonding = + TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_hw_dedicated_queue_size_result, + bonding, "bonding"); +static cmdline_parse_token_string_t cmd_setbonding_hw_dedicated_queue_size_lacp = + TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_hw_dedicated_queue_size_result, + lacp, "lacp"); +static cmdline_parse_token_string_t cmd_setbonding_hw_dedicated_queue_size_dedicated = + TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_hw_dedicated_queue_size_result, + dedicated_queues, "dedicated_queues"); +static cmdline_parse_token_num_t cmd_setbonding_hw_dedicated_queue_port_id = + TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_hw_dedicated_queue_size_result, + port_id, RTE_UINT16); +static cmdline_parse_token_string_t cmd_setbonding_hw_dedicated_queue_queue_type = + TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_hw_dedicated_queue_size_result, + queue_type, "rxq#txq"); +static cmdline_parse_token_string_t cmd_setbonding_hw_dedicated_queue_queue_size = + TOKEN_STRING_INITIALIZER(struct cmd_set_bonding_hw_dedicated_queue_size_result, + queue_size, "queue_size"); +static cmdline_parse_token_num_t cmd_setbonding_hw_dedicated_queue_size_size = + TOKEN_NUM_INITIALIZER(struct cmd_set_bonding_hw_dedicated_queue_size_result, + size, RTE_UINT16); + +static cmdline_parse_inst_t cmd_set_lacp_dedicated_hw_queue_size = { + .f = cmd_set_bonding_hw_dedicated_queue_size_parsed, + .help_str = "set bonding lacp dedicated_queues <port_id> (rxq|txq) " + "queue_size <size>: " + "Set hardware dedicated queue size for LACP control traffic", + .data = NULL, + .tokens = { + (void *)&cmd_setbonding_hw_dedicated_queue_size_set, + (void *)&cmd_setbonding_hw_dedicated_queue_size_bonding, + (void *)&cmd_setbonding_hw_dedicated_queue_size_lacp, + (void *)&cmd_setbonding_hw_dedicated_queue_size_dedicated, + (void *)&cmd_setbonding_hw_dedicated_queue_port_id, + (void *)&cmd_setbonding_hw_dedicated_queue_queue_type, + (void *)&cmd_setbonding_hw_dedicated_queue_queue_size, + (void *)&cmd_setbonding_hw_dedicated_queue_size_size, + NULL + } +}; + /* *** SET BALANCE XMIT POLICY *** */ struct cmd_set_bonding_balance_xmit_policy_result { cmdline_fixed_string_t set; @@ -745,6 +824,11 @@ static struct testpmd_driver_commands bonding_cmds = { "set bonding mode IEEE802.3AD aggregator policy (port_id) (agg_name)\n" " Set Aggregation mode for IEEE802.3AD (mode 4)\n", }, + { + &cmd_set_lacp_dedicated_hw_queue_size, + "set bonding lacp dedicated_queues <port_id> (rxq|txq) queue_size <size>\n" + " Set hardware dedicated queue size for LACP control traffic.\n", + }, { NULL, NULL }, }, }; diff --git a/drivers/net/bonding/eth_bond_8023ad_private.h b/drivers/net/bonding/eth_bond_8023ad_private.h index ab7d15f81a..b0264e2275 100644 --- a/drivers/net/bonding/eth_bond_8023ad_private.h +++ b/drivers/net/bonding/eth_bond_8023ad_private.h @@ -176,6 +176,9 @@ struct mode8023ad_private { uint16_t rx_qid; uint16_t tx_qid; + + uint16_t rx_queue_size; + uint16_t tx_queue_size; } dedicated_queues; enum rte_bond_8023ad_agg_selection agg_selection; }; diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c index 06c21ebe6d..c19645aa4f 100644 --- a/drivers/net/bonding/rte_eth_bond_8023ad.c +++ b/drivers/net/bonding/rte_eth_bond_8023ad.c @@ -1254,6 +1254,8 @@ bond_mode_8023ad_conf_assign(struct mode8023ad_private *mode4, mode4->dedicated_queues.enabled = 0; mode4->dedicated_queues.rx_qid = UINT16_MAX; mode4->dedicated_queues.tx_qid = UINT16_MAX; + mode4->dedicated_queues.rx_queue_size = SLOW_RX_QUEUE_HW_DEFAULT_SIZE; + mode4->dedicated_queues.tx_queue_size = SLOW_TX_QUEUE_HW_DEFAULT_SIZE; } void @@ -1753,3 +1755,40 @@ rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port) return retval; } + +int +rte_eth_bond_8023ad_dedicated_queue_size_set(uint16_t port, + uint16_t queue_size, + char *queue_type) +{ + struct rte_eth_dev *dev; + struct bond_dev_private *internals; + + if (valid_bonding_port_id(port) != 0) { + RTE_BOND_LOG(ERR, "The bonding port id is invalid"); + return -EINVAL; + } + + dev = &rte_eth_devices[port]; + + /* Device must be stopped to set up slow queue */ + if (dev->data->dev_started != 0) { + RTE_BOND_LOG(ERR, "Please stop the bonding port"); + return -EINVAL; + } + + internals = dev->data->dev_private; + if (internals->mode4.dedicated_queues.enabled == 0) { + RTE_BOND_LOG(ERR, "Please enable dedicated queue"); + return -EINVAL; + } + + if (strcmp(queue_type, "rxq") == 0) + internals->mode4.dedicated_queues.rx_queue_size = queue_size; + else if (strcmp(queue_type, "txq") == 0) + internals->mode4.dedicated_queues.tx_queue_size = queue_size; + else + return -EINVAL; + + return 0; +} diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h index b2deb26e2e..0a36fbe3ed 100644 --- a/drivers/net/bonding/rte_eth_bond_8023ad.h +++ b/drivers/net/bonding/rte_eth_bond_8023ad.h @@ -35,6 +35,9 @@ extern "C" { #define MARKER_TLV_TYPE_INFO 0x01 #define MARKER_TLV_TYPE_RESP 0x02 +#define SLOW_TX_QUEUE_HW_DEFAULT_SIZE 512 +#define SLOW_RX_QUEUE_HW_DEFAULT_SIZE 128 + typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint16_t member_id, struct rte_mbuf *lacp_pkt); @@ -309,6 +312,26 @@ rte_eth_bond_8023ad_dedicated_queues_enable(uint16_t port_id); int rte_eth_bond_8023ad_dedicated_queues_disable(uint16_t port_id); + +/** + * Set hardware slow queue ring size + * + * This function set bonding port hardware slow queue ring size. + * Bonding port must be stopped to change this configuration. + * + * @param port_id Bonding device id + * @param queue_size Slow queue ring size + * @param queue_type Slow queue type, "rxq" or "txq" + * + * @return + * 0 on success, negative value otherwise. + * + */ +__rte_experimental +int +rte_eth_bond_8023ad_dedicated_queue_size_set(uint16_t port, + uint16_t queue_size, + char *queue_type); /* * Get aggregator mode for 8023ad * @param port_id Bonding device id diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c index c40d18d128..f53856ff60 100644 --- a/drivers/net/bonding/rte_eth_bond_pmd.c +++ b/drivers/net/bonding/rte_eth_bond_pmd.c @@ -1688,7 +1688,8 @@ member_configure_slow_queue(struct rte_eth_dev *bonding_eth_dev, /* Configure slow Rx queue */ errval = rte_eth_rx_queue_setup(member_eth_dev->data->port_id, - internals->mode4.dedicated_queues.rx_qid, 128, + internals->mode4.dedicated_queues.rx_qid, + internals->mode4.dedicated_queues.rx_queue_size, rte_eth_dev_socket_id(member_eth_dev->data->port_id), NULL, port->slow_pool); if (errval != 0) { @@ -1701,7 +1702,8 @@ member_configure_slow_queue(struct rte_eth_dev *bonding_eth_dev, } errval = rte_eth_tx_queue_setup(member_eth_dev->data->port_id, - internals->mode4.dedicated_queues.tx_qid, 512, + internals->mode4.dedicated_queues.tx_qid, + internals->mode4.dedicated_queues.tx_queue_size, rte_eth_dev_socket_id(member_eth_dev->data->port_id), NULL); if (errval != 0) { diff --git a/drivers/net/bonding/version.map b/drivers/net/bonding/version.map index 09ee21c55f..6626691f0e 100644 --- a/drivers/net/bonding/version.map +++ b/drivers/net/bonding/version.map @@ -30,6 +30,7 @@ DPDK_24 { EXPERIMENTAL { # added in 23.11 global: + rte_eth_bond_8023ad_dedicated_queue_size_set; rte_eth_bond_8023ad_member_info; rte_eth_bond_active_members_get; rte_eth_bond_member_add; -- 2.39.1