]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.14.93/i40e-fix-mac-filter-delete-when-setting-mac-address.patch
Linux 4.14.93
[thirdparty/kernel/stable-queue.git] / releases / 4.14.93 / i40e-fix-mac-filter-delete-when-setting-mac-address.patch
CommitLineData
5aef4b01
SL
1From be2c5a72a31cd89209104b65467bdafa108d8363 Mon Sep 17 00:00:00 2001
2From: Stefan Assmann <sassmann@kpanic.de>
3Date: Tue, 4 Dec 2018 15:18:52 +0100
4Subject: i40e: fix mac filter delete when setting mac address
5
6[ Upstream commit 158daed16efb1170694e420ae06ba8ba954d82e5 ]
7
8A previous commit moved the ether_addr_copy() in i40e_set_mac() before
9the mac filter del/add to avoid a race. However it wasn't taken into
10account that this alters the mac address being handed to
11i40e_del_mac_filter().
12
13Also changed i40e_add_mac_filter() to operate on netdev->dev_addr,
14hopefully that makes the code easier to read.
15
16Fixes: 458867b2ca0c ("i40e: don't remove netdev->dev_addr when syncing uc list")
17
18Signed-off-by: Stefan Assmann <sassmann@kpanic.de>
19Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
20Acked-by: Jacob Keller <jacob.e.keller@intel.com>
21Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
22Signed-off-by: Sasha Levin <sashal@kernel.org>
23---
24 drivers/net/ethernet/intel/i40e/i40e_main.c | 14 +++++++-------
25 1 file changed, 7 insertions(+), 7 deletions(-)
26
27diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
28index 176c99b8251d..904b42becd45 100644
29--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
30+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
31@@ -1554,17 +1554,17 @@ static int i40e_set_mac(struct net_device *netdev, void *p)
32 netdev_info(netdev, "set new mac address %pM\n", addr->sa_data);
33
34 /* Copy the address first, so that we avoid a possible race with
35- * .set_rx_mode(). If we copy after changing the address in the filter
36- * list, we might open ourselves to a narrow race window where
37- * .set_rx_mode could delete our dev_addr filter and prevent traffic
38- * from passing.
39+ * .set_rx_mode().
40+ * - Remove old address from MAC filter
41+ * - Copy new address
42+ * - Add new address to MAC filter
43 */
44- ether_addr_copy(netdev->dev_addr, addr->sa_data);
45-
46 spin_lock_bh(&vsi->mac_filter_hash_lock);
47 i40e_del_mac_filter(vsi, netdev->dev_addr);
48- i40e_add_mac_filter(vsi, addr->sa_data);
49+ ether_addr_copy(netdev->dev_addr, addr->sa_data);
50+ i40e_add_mac_filter(vsi, netdev->dev_addr);
51 spin_unlock_bh(&vsi->mac_filter_hash_lock);
52+
53 if (vsi->type == I40E_VSI_MAIN) {
54 i40e_status ret;
55
56--
572.19.1
58