net/bonding: fix stopping non-active slaves
authorHuisong Li <lihuisong@huawei.com>
Tue, 3 May 2022 10:02:13 +0000 (18:02 +0800)
committerFerruh Yigit <ferruh.yigit@xilinx.com>
Wed, 11 May 2022 12:48:16 +0000 (14:48 +0200)
When stopping a bonded port, all slaves should be stopped. But only
active slaves are stopped.
So fix by stopping all slave ports and later do "deactivate_slave()" for
active slaves.

Fixes: 0911d4ec0183 ("net/bonding: fix crash when stopping mode 4 port")
Cc: stable@dpdk.org
Signed-off-by: Huisong Li <lihuisong@huawei.com>
Signed-off-by: Min Hu (Connor) <humin29@huawei.com>
drivers/net/bonding/rte_eth_bond_pmd.c

index 5cbe890..605fc2f 100644 (file)
@@ -2118,18 +2118,20 @@ bond_ethdev_stop(struct rte_eth_dev *eth_dev)
        internals->link_status_polling_enabled = 0;
        for (i = 0; i < internals->slave_count; i++) {
                uint16_t slave_id = internals->slaves[i].port_id;
+
+               internals->slaves[i].last_link_status = 0;
+               ret = rte_eth_dev_stop(slave_id);
+               if (ret != 0) {
+                       RTE_BOND_LOG(ERR, "Failed to stop device on port %u",
+                                    slave_id);
+                       return ret;
+               }
+
+               /* active slaves need to be deactivated. */
                if (find_slave_by_id(internals->active_slaves,
                                internals->active_slave_count, slave_id) !=
-                                               internals->active_slave_count) {
-                       internals->slaves[i].last_link_status = 0;
-                       ret = rte_eth_dev_stop(slave_id);
-                       if (ret != 0) {
-                               RTE_BOND_LOG(ERR, "Failed to stop device on port %u",
-                                            slave_id);
-                               return ret;
-                       }
+                                       internals->active_slave_count)
                        deactivate_slave(eth_dev, slave_id);
-               }
        }
 
        return 0;