From patchwork Mon Jun 6 14:34:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gaoxiang Liu X-Patchwork-Id: 112417 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 6C503A0542; Mon, 6 Jun 2022 16:35:07 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0AF4C406B4; Mon, 6 Jun 2022 16:35:07 +0200 (CEST) Received: from m12-14.163.com (m12-14.163.com [220.181.12.14]) by mails.dpdk.org (Postfix) with ESMTP id E5E934067E; Mon, 6 Jun 2022 16:35:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=163.com; s=s110527; h=From:Subject:Date:Message-Id:MIME-Version; bh=nAMOw hvQHd7jaWdEAjSZcAtEXPFv5fQ/61owxH8QGdo=; b=NtHkA4OvULlDIfihKvWpw AW4iMgYdYHP/IbaCDg9yfgSg240lQBBqHMtQhe8ovdm5C1sei4gLrccP5nmkxLyh ztTclyyPZo1ErBG3N2EpHlwfbuS6K1MnsWMejGm0JNO6uHW8kf2E2Hs77eTvqvNj alEL6ZLv2jpaTCaIo1KUYg= Received: from DESKTOP-ONA2IA7.localdomain (unknown [125.121.192.74]) by smtp10 (Coremail) with SMTP id DsCowAA3dPCIEJ5i2jt7GQ--.51736S4; Mon, 06 Jun 2022 22:34:58 +0800 (CST) From: Gaoxiang Liu To: chas3@att.com, humin29@huawei.com Cc: dev@dpdk.org, liugaoxiang@huawei.com, Gaoxiang Liu , stable@dpdk.org Subject: [PATCH v2] net/bonding: failover of LACP with mode 4 takes long time Date: Mon, 6 Jun 2022 22:34:45 +0800 Message-Id: <20220606143445.501-1-gaoxiangliu0@163.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220605030737.4670-1-gaoxiangliu0@163.com> References: <20220605030737.4670-1-gaoxiangliu0@163.com> MIME-Version: 1.0 X-CM-TRANSID: DsCowAA3dPCIEJ5i2jt7GQ--.51736S4 X-Coremail-Antispam: 1Uf129KBjvJXoWxJFWDurW3Cr45uFy3ZF1DWrg_yoW5Aw15pF srCa4YgFn7ArWDW3W7Xa1xCr45Cr1Ivw17GryrA3s0kan0vryrur1xtFyv9FyFk3s5Crs8 ArW5Kw1qvF4kGrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x0pRPPEsUUUUU= X-Originating-IP: [125.121.192.74] X-CM-SenderInfo: xjdr5xxdqjzxjxq6il2tof0z/1tbiWxIYOmI0U4hyhwAAsT X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org When the primary port of bond slaves with bond mode 4 linked down, the system id of the other slave ports channged. It may cause some switches to renegotiate, and the process takes a few seconds. It is not acceptable for any Telcos. We need sub-second switchover time like in linux. Set the mac of the bond port to the slave port's system to solve the problem. Bugzilla ID: 551 Fixes: 46fb43683679 ("bond: add mode 4") Cc: stable@dpdk.org Signed-off-by: Gaoxiang Liu --- v2: * Fixed compile issues. --- drivers/net/bonding/rte_eth_bond_8023ad.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c index b3cddd8a20..8d5486dad3 100644 --- a/drivers/net/bonding/rte_eth_bond_8023ad.c +++ b/drivers/net/bonding/rte_eth_bond_8023ad.c @@ -866,7 +866,6 @@ bond_mode_8023ad_periodic_cb(void *arg) struct bond_dev_private *internals = bond_dev->data->dev_private; struct port *port; struct rte_eth_link link_info; - struct rte_ether_addr slave_addr; struct rte_mbuf *lacp_pkt = NULL; uint16_t slave_id; uint16_t i; @@ -893,7 +892,6 @@ bond_mode_8023ad_periodic_cb(void *arg) key = 0; } - rte_eth_macaddr_get(slave_id, &slave_addr); port = &bond_mode_8023ad_ports[slave_id]; key = rte_cpu_to_be_16(key); @@ -905,8 +903,8 @@ bond_mode_8023ad_periodic_cb(void *arg) SM_FLAG_SET(port, NTT); } - if (!rte_is_same_ether_addr(&port->actor.system, &slave_addr)) { - rte_ether_addr_copy(&slave_addr, &port->actor.system); + if (!rte_is_same_ether_addr(&internals->mode4.mac_addr, &port->actor.system)) { + rte_ether_addr_copy(&internals->mode4.mac_addr, &port->actor.system); if (port->aggregator_port_id == slave_id) SM_FLAG_SET(port, NTT); } @@ -1172,21 +1170,20 @@ void bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev) { struct bond_dev_private *internals = bond_dev->data->dev_private; - struct rte_ether_addr slave_addr; struct port *slave, *agg_slave; uint16_t slave_id, i, j; bond_mode_8023ad_stop(bond_dev); + rte_eth_macaddr_get(internals->port_id, &internals->mode4.mac_addr); for (i = 0; i < internals->active_slave_count; i++) { slave_id = internals->active_slaves[i]; slave = &bond_mode_8023ad_ports[slave_id]; - rte_eth_macaddr_get(slave_id, &slave_addr); - if (rte_is_same_ether_addr(&slave_addr, &slave->actor.system)) + if (rte_is_same_ether_addr(&internals->mode4.mac_addr, &slave->actor.system)) continue; - rte_ether_addr_copy(&slave_addr, &slave->actor.system); + rte_ether_addr_copy(&internals->mode4.mac_addr, &slave->actor.system); /* Do nothing if this port is not an aggregator. In other case * Set NTT flag on every port that use this aggregator. */ if (slave->aggregator_port_id != slave_id)