diff options
author | Achiad Shochat | 2015-08-04 13:05:46 +0200 |
---|---|---|
committer | David S. Miller | 2015-08-07 07:00:59 +0200 |
commit | 9b37b07fcb0e00a9c0b605b7b28c2d200f4eb064 (patch) | |
tree | 2fcb40442301128d7244e9ff839860f4af27fcee /drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |
parent | net/mlx5e: Disable async events before unregister_netdev() (diff) | |
download | kernel-qcow2-linux-9b37b07fcb0e00a9c0b605b7b28c2d200f4eb064.tar.gz kernel-qcow2-linux-9b37b07fcb0e00a9c0b605b7b28c2d200f4eb064.tar.xz kernel-qcow2-linux-9b37b07fcb0e00a9c0b605b7b28c2d200f4eb064.zip |
net/mlx5e: Take advantage of the light-weight netdev open/stop
Now that TIRs, TISs and flow tables are kept alive while the netdev is
stopped (after executing ndo_stop()) we can do the following
improvements:
- Obsolete the active_vlans SW shadow.
- Do not delete/add flow table rules upon ndo_stop/open.
In addition to simplifying the flow, this change also fastens
the ndo_open/close operations.
- Obsolete synchronization of threads accessing the flow tables
with the netdev stop/open threads.
Signed-off-by: Achiad Shochat <achiad@mellanox.com>
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx5/core/en_main.c')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 24 |
1 files changed, 7 insertions, 17 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 436968806268..b8023a7484e0 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c @@ -1332,24 +1332,12 @@ int mlx5e_open_locked(struct net_device *netdev) return err; } - err = mlx5e_add_all_vlan_rules(priv); - if (err) { - netdev_err(netdev, "%s: mlx5e_add_all_vlan_rules failed, %d\n", - __func__, err); - goto err_close_channels; - } - mlx5e_update_carrier(priv); mlx5e_redirect_rqts(priv); - mlx5e_set_rx_mode_core(priv); schedule_delayed_work(&priv->update_stats_work, 0); - return 0; -err_close_channels: - mlx5e_close_channels(priv); - - return err; + return 0; } static int mlx5e_open(struct net_device *netdev) @@ -1371,8 +1359,6 @@ int mlx5e_close_locked(struct net_device *netdev) clear_bit(MLX5E_STATE_OPENED, &priv->state); mlx5e_redirect_rqts(priv); - mlx5e_set_rx_mode_core(priv); - mlx5e_del_all_vlan_rules(priv); netif_carrier_off(priv->netdev); mlx5e_close_channels(priv); @@ -1794,6 +1780,8 @@ static int mlx5e_set_features(struct net_device *netdev, err = mlx5e_open_locked(priv->netdev); } + mutex_unlock(&priv->state_lock); + if (changes & NETIF_F_HW_VLAN_CTAG_FILTER) { if (features & NETIF_F_HW_VLAN_CTAG_FILTER) mlx5e_enable_vlan_filter(priv); @@ -1801,8 +1789,6 @@ static int mlx5e_set_features(struct net_device *netdev, mlx5e_disable_vlan_filter(priv); } - mutex_unlock(&priv->state_lock); - return 0; } @@ -2094,6 +2080,7 @@ static void *mlx5e_create_netdev(struct mlx5_core_dev *mdev) } mlx5e_enable_async_events(priv); + schedule_work(&priv->set_rx_mode_work); return priv; @@ -2138,6 +2125,9 @@ static void mlx5e_destroy_netdev(struct mlx5_core_dev *mdev, void *vpriv) struct mlx5e_priv *priv = vpriv; struct net_device *netdev = priv->netdev; + set_bit(MLX5E_STATE_DESTROYING, &priv->state); + + schedule_work(&priv->set_rx_mode_work); mlx5e_disable_async_events(priv); flush_scheduled_work(); unregister_netdev(netdev); |