]>
Commit | Line | Data |
---|---|---|
5aef4b01 SL |
1 | From be2c5a72a31cd89209104b65467bdafa108d8363 Mon Sep 17 00:00:00 2001 |
2 | From: Stefan Assmann <sassmann@kpanic.de> | |
3 | Date: Tue, 4 Dec 2018 15:18:52 +0100 | |
4 | Subject: i40e: fix mac filter delete when setting mac address | |
5 | ||
6 | [ Upstream commit 158daed16efb1170694e420ae06ba8ba954d82e5 ] | |
7 | ||
8 | A previous commit moved the ether_addr_copy() in i40e_set_mac() before | |
9 | the mac filter del/add to avoid a race. However it wasn't taken into | |
10 | account that this alters the mac address being handed to | |
11 | i40e_del_mac_filter(). | |
12 | ||
13 | Also changed i40e_add_mac_filter() to operate on netdev->dev_addr, | |
14 | hopefully that makes the code easier to read. | |
15 | ||
16 | Fixes: 458867b2ca0c ("i40e: don't remove netdev->dev_addr when syncing uc list") | |
17 | ||
18 | Signed-off-by: Stefan Assmann <sassmann@kpanic.de> | |
19 | Tested-by: Andrew Bowers <andrewx.bowers@intel.com> | |
20 | Acked-by: Jacob Keller <jacob.e.keller@intel.com> | |
21 | Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> | |
22 | Signed-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 | ||
27 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c | |
28 | index 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 | -- | |
57 | 2.19.1 | |
58 |