]>
Commit | Line | Data |
---|---|---|
a8360df2 GKH |
1 | From foo@baz Thu Jan 12 21:37:26 CET 2017 |
2 | From: Saeed Mahameed <saeedm@mellanox.com> | |
3 | Date: Wed, 28 Dec 2016 14:58:41 +0200 | |
4 | Subject: net/mlx5e: Don't sync netdev state when not registered | |
5 | ||
6 | From: Saeed Mahameed <saeedm@mellanox.com> | |
7 | ||
8 | ||
9 | [ Upstream commit 610e89e05c3f28a7394935aa6b91f99548c4fd3c ] | |
10 | ||
11 | Skip setting netdev vxlan ports and netdev rx_mode on driver load | |
12 | when netdev is not yet registered. | |
13 | ||
14 | Synchronizing with netdev state is needed only on reset flow where the | |
15 | netdev remains registered for the whole reset period. | |
16 | ||
17 | This also fixes an access before initialization of net_device.addr_list_lock | |
18 | - which for some reason initialized on register_netdev - where we queued | |
19 | set_rx_mode work on driver load before netdev registration. | |
20 | ||
21 | Fixes: 26e59d8077a3 ("net/mlx5e: Implement mlx5e interface attach/detach callbacks") | |
22 | Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> | |
23 | Reported-by: Sebastian Ott <sebott@linux.vnet.ibm.com> | |
24 | Reviewed-by: Mohamad Haj Yahia <mohamad@mellanox.com> | |
25 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
26 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
27 | --- | |
28 | drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 19 ++++++++++++------- | |
29 | 1 file changed, 12 insertions(+), 7 deletions(-) | |
30 | ||
31 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |
32 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |
33 | @@ -3773,14 +3773,7 @@ static void mlx5e_nic_enable(struct mlx5 | |
34 | ||
35 | mlx5_lag_add(mdev, netdev); | |
36 | ||
37 | - if (mlx5e_vxlan_allowed(mdev)) { | |
38 | - rtnl_lock(); | |
39 | - udp_tunnel_get_rx_info(netdev); | |
40 | - rtnl_unlock(); | |
41 | - } | |
42 | - | |
43 | mlx5e_enable_async_events(priv); | |
44 | - queue_work(priv->wq, &priv->set_rx_mode_work); | |
45 | ||
46 | if (MLX5_CAP_GEN(mdev, vport_group_manager)) { | |
47 | mlx5_query_nic_vport_mac_address(mdev, 0, rep.hw_id); | |
48 | @@ -3790,6 +3783,18 @@ static void mlx5e_nic_enable(struct mlx5 | |
49 | rep.priv_data = priv; | |
50 | mlx5_eswitch_register_vport_rep(esw, 0, &rep); | |
51 | } | |
52 | + | |
53 | + if (netdev->reg_state != NETREG_REGISTERED) | |
54 | + return; | |
55 | + | |
56 | + /* Device already registered: sync netdev system state */ | |
57 | + if (mlx5e_vxlan_allowed(mdev)) { | |
58 | + rtnl_lock(); | |
59 | + udp_tunnel_get_rx_info(netdev); | |
60 | + rtnl_unlock(); | |
61 | + } | |
62 | + | |
63 | + queue_work(priv->wq, &priv->set_rx_mode_work); | |
64 | } | |
65 | ||
66 | static void mlx5e_nic_disable(struct mlx5e_priv *priv) |