The RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE offload can't be used in bonding
mode Broadcast and mode 8023AD. Currently, bonding driver forcibly removes
from the dev->data->dev_conf.txmode.offloads and processes as success in
bond_ethdev_configure(). But this still cause that rte_eth_dev_configure()
fails to execute because of the failure of validating Tx offload in the
eth_dev_validate_offloads(). So this patch moves the modification of txmode
offlaods to the stage of adding slave device to report the correct txmode
offloads.

Fixes: 18c41457cbae ("net/bonding: fix mbuf fast free usage")
Cc: sta...@dpdk.org

Signed-off-by: Huisong Li <lihuis...@huawei.com>
---
 -v2: report the correct txmode offloads based on bonding mode in the
      bonding driver, and not in testpmd.
---
 drivers/net/bonding/rte_eth_bond_api.c |  5 +++++
 drivers/net/bonding/rte_eth_bond_pmd.c | 11 -----------
 2 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/drivers/net/bonding/rte_eth_bond_api.c 
b/drivers/net/bonding/rte_eth_bond_api.c
index 694fe86115..c0178369b4 100644
--- a/drivers/net/bonding/rte_eth_bond_api.c
+++ b/drivers/net/bonding/rte_eth_bond_api.c
@@ -544,6 +544,11 @@ __eth_bond_slave_add_lock_free(uint16_t bonded_port_id, 
uint16_t slave_port_id)
                        return ret;
        }
 
+       /* Bond mode Broadcast & 8023AD don't support MBUF_FAST_FREE offload. */
+       if (internals->mode == BONDING_MODE_8023AD ||
+           internals->mode == BONDING_MODE_BROADCAST)
+               internals->tx_offload_capa &= 
~RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;
+
        bonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf &=
                        internals->flow_type_rss_offloads;
 
diff --git a/drivers/net/bonding/rte_eth_bond_pmd.c 
b/drivers/net/bonding/rte_eth_bond_pmd.c
index 864e073db8..2efaad1e8e 100644
--- a/drivers/net/bonding/rte_eth_bond_pmd.c
+++ b/drivers/net/bonding/rte_eth_bond_pmd.c
@@ -3643,7 +3643,6 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
        const char *name = dev->device->name;
        struct bond_dev_private *internals = dev->data->dev_private;
        struct rte_kvargs *kvlist = internals->kvlist;
-       uint64_t offloads;
        int arg_count;
        uint16_t port_id = dev - rte_eth_devices;
        uint32_t link_speeds;
@@ -3708,16 +3707,6 @@ bond_ethdev_configure(struct rte_eth_dev *dev)
                }
        }
 
-       offloads = dev->data->dev_conf.txmode.offloads;
-       if ((offloads & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE) &&
-                       (internals->mode == BONDING_MODE_8023AD ||
-                       internals->mode == BONDING_MODE_BROADCAST)) {
-               RTE_BOND_LOG(WARNING,
-                       "bond mode broadcast & 8023AD don't support 
MBUF_FAST_FREE offload, force disable it.");
-               offloads &= ~RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;
-               dev->data->dev_conf.txmode.offloads = offloads;
-       }
-
        link_speeds = dev->data->dev_conf.link_speeds;
        /*
         * The default value of 'link_speeds' is zero. From its definition,
-- 
2.33.0

Reply via email to