]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.9.4/net-mlx5e-don-t-sync-netdev-state-when-not-registered.patch
5.1-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.9.4 / net-mlx5e-don-t-sync-netdev-state-when-not-registered.patch
CommitLineData
a8360df2
GKH
1From foo@baz Thu Jan 12 21:37:26 CET 2017
2From: Saeed Mahameed <saeedm@mellanox.com>
3Date: Wed, 28 Dec 2016 14:58:41 +0200
4Subject: net/mlx5e: Don't sync netdev state when not registered
5
6From: Saeed Mahameed <saeedm@mellanox.com>
7
8
9[ Upstream commit 610e89e05c3f28a7394935aa6b91f99548c4fd3c ]
10
11Skip setting netdev vxlan ports and netdev rx_mode on driver load
12when netdev is not yet registered.
13
14Synchronizing with netdev state is needed only on reset flow where the
15netdev remains registered for the whole reset period.
16
17This also fixes an access before initialization of net_device.addr_list_lock
18- which for some reason initialized on register_netdev - where we queued
19set_rx_mode work on driver load before netdev registration.
20
21Fixes: 26e59d8077a3 ("net/mlx5e: Implement mlx5e interface attach/detach callbacks")
22Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
23Reported-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
24Reviewed-by: Mohamad Haj Yahia <mohamad@mellanox.com>
25Signed-off-by: David S. Miller <davem@davemloft.net>
26Signed-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)