[dpdk-dev] [PATCH] bonding: fix wrong slaves capacity check
Radu Nicolau
radu.nicolau at intel.com
Mon Sep 4 15:01:22 CEST 2017
On 7/27/2017 1:00 PM, Tomasz Kulasek wrote:
> For fortville NIC bond_ethdev_8023ad_flow_verify fails when action queue
> index indicates unavailable queue before slaves configuration.
>
> This fix verifies flow settings for queue 0, which is always available,
> and checks if slaves max queue number capacity meets requirements.
>
> Fixes: 112891cd27e5 ("net/bonding: add dedicated HW queues for LACP control")
>
> Signed-off-by: Tomasz Kulasek <tomaszx.kulasek at intel.com>
Reviewed-by: Radu Nicolau <radu.nicolau at intel.com>
> ---
> drivers/net/bonding/rte_eth_bond_pmd.c | 26 +++++++++++++++++++-------
> 1 file changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c
> index 8f9a860..ab5ebe0 100644
> --- a/drivers/net/bonding/rte_eth_bond_pmd.c
> +++ b/drivers/net/bonding/rte_eth_bond_pmd.c
> @@ -175,12 +175,13 @@ const struct rte_flow_attr flow_attr_8023ad = {
> int
> bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
> uint8_t slave_port) {
> + struct rte_eth_dev_info slave_info;
> struct rte_flow_error error;
> struct bond_dev_private *internals = (struct bond_dev_private *)
> (bond_dev->data->dev_private);
>
> - struct rte_flow_action_queue lacp_queue_conf = {
> - .index = internals->mode4.dedicated_queues.rx_qid,
> + const struct rte_flow_action_queue lacp_queue_conf = {
> + .index = 0,
> };
>
> const struct rte_flow_action actions[] = {
> @@ -195,8 +196,22 @@ bond_ethdev_8023ad_flow_verify(struct rte_eth_dev *bond_dev,
>
> int ret = rte_flow_validate(slave_port, &flow_attr_8023ad,
> flow_item_8023ad, actions, &error);
> - if (ret < 0)
> + if (ret < 0) {
> + RTE_BOND_LOG(ERR, "bond_ethdev_8023ad_flow_verify: %s "
> + "(slave_port=%d queue_id=%d)",
> + error.message, slave_port,
> + internals->mode4.dedicated_queues.rx_qid);
> + return -1;
> + }
> +
> + rte_eth_dev_info_get(slave_port, &slave_info);
> + if ((slave_info.max_rx_queues < bond_dev->data->nb_rx_queues) ||
> + (slave_info.max_tx_queues < bond_dev->data->nb_tx_queues)) {
> + RTE_BOND_LOG(ERR, "bond_ethdev_8023ad_flow_verify: Slave %d"
> + " capabilities doesn't allow to allocate "
> + "additional queues", slave_port);
> return -1;
> + }
>
> return 0;
> }
> @@ -206,7 +221,7 @@ bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id) {
> struct rte_eth_dev *bond_dev = &rte_eth_devices[port_id];
> struct bond_dev_private *internals = (struct bond_dev_private *)
> (bond_dev->data->dev_private);
> - struct rte_eth_dev_info bond_info, slave_info;
> + struct rte_eth_dev_info bond_info;
> uint8_t idx;
>
> /* Verify if all slaves in bonding supports flow director and */
> @@ -217,9 +232,6 @@ bond_8023ad_slow_pkt_hw_filter_supported(uint8_t port_id) {
> internals->mode4.dedicated_queues.tx_qid = bond_info.nb_tx_queues;
>
> for (idx = 0; idx < internals->slave_count; idx++) {
> - rte_eth_dev_info_get(internals->slaves[idx].port_id,
> - &slave_info);
> -
> if (bond_ethdev_8023ad_flow_verify(bond_dev,
> internals->slaves[idx].port_id) != 0)
> return -1;
More information about the dev
mailing list