net/mlx5e: Verify dev is present in some ndos
authorRoi Dayan <roid@nvidia.com>
Wed, 16 Sep 2020 07:11:26 +0000 (10:11 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 16 Mar 2021 23:48:40 +0000 (16:48 -0700)
We will re-use the native NIC port net device instance for the Uplink
representor. While changing profiles private resources are not
available but some ndos are not checking if the netdev is present.
So for those ndos check the netdev is present in the driver before
accessing the private resources.

Signed-off-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en/rep/tc.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index fcae3c0a4e9f01ff0e5a0ee5f14c1c566c80a1f8..11a44d30adc7cdce32e6f9665eff9b6c27a93612 100644 (file)
@@ -169,6 +169,9 @@ static int mlx5e_rep_setup_tc_cb(enum tc_setup_type type, void *type_data,
        unsigned long flags = MLX5_TC_FLAG(INGRESS) | MLX5_TC_FLAG(ESW_OFFLOAD);
        struct mlx5e_priv *priv = cb_priv;
 
+       if (!priv->netdev || !netif_device_present(priv->netdev))
+               return -EOPNOTSUPP;
+
        switch (type) {
        case TC_SETUP_CLSFLOWER:
                return mlx5e_rep_setup_tc_cls_flower(priv, type_data, flags);
@@ -321,6 +324,9 @@ mlx5e_rep_indr_offload(struct net_device *netdev,
        struct mlx5e_priv *priv = netdev_priv(indr_priv->rpriv->netdev);
        int err = 0;
 
+       if (!netif_device_present(indr_priv->rpriv->netdev))
+               return -EOPNOTSUPP;
+
        switch (flower->command) {
        case FLOW_CLS_REPLACE:
                err = mlx5e_configure_flower(netdev, priv, flower, flags);
index 39de3156877c9498d476d20de339075d47fd02da..efe8af49b9085968d23efdd2f249784ea8d38651 100644 (file)
@@ -3769,8 +3769,16 @@ static int mlx5e_setup_tc(struct net_device *dev, enum tc_setup_type type,
                          void *type_data)
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
+       bool tc_unbind = false;
        int err;
 
+       if (type == TC_SETUP_BLOCK &&
+           ((struct flow_block_offload *)type_data)->command == FLOW_BLOCK_UNBIND)
+               tc_unbind = true;
+
+       if (!netif_device_present(dev) && !tc_unbind)
+               return -ENODEV;
+
        switch (type) {
        case TC_SETUP_BLOCK: {
                struct flow_block_offload *f = type_data;
@@ -3823,6 +3831,9 @@ mlx5e_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
        struct mlx5e_priv *priv = netdev_priv(dev);
        struct mlx5e_pport_stats *pstats = &priv->stats.pport;
 
+       if (!netif_device_present(dev))
+               return;
+
        /* In switchdev mode, monitor counters doesn't monitor
         * rx/tx stats of 802_3. The update stats mechanism
         * should keep the 802_3 layout counters updated
@@ -4436,6 +4447,9 @@ int mlx5e_get_vf_config(struct net_device *dev,
        struct mlx5_core_dev *mdev = priv->mdev;
        int err;
 
+       if (!netif_device_present(dev))
+               return -EOPNOTSUPP;
+
        err = mlx5_eswitch_get_vport_config(mdev->priv.eswitch, vf + 1, ivi);
        if (err)
                return err;
@@ -4458,6 +4472,9 @@ mlx5e_has_offload_stats(const struct net_device *dev, int attr_id)
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
 
+       if (!netif_device_present(dev))
+               return false;
+
        if (!mlx5e_is_uplink_rep(priv))
                return false;
 
index 8a3b2d76cc82f2be964d870b5e9f43379fa10fe8..b3bf7bb7b97e7fefa8fb3b3e0bb2a4220ecc7258 100644 (file)
@@ -4895,6 +4895,9 @@ int mlx5e_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
        unsigned long flags = MLX5_TC_FLAG(INGRESS);
        struct mlx5e_priv *priv = cb_priv;
 
+       if (!priv->netdev || !netif_device_present(priv->netdev))
+               return -EOPNOTSUPP;
+
        if (mlx5e_is_uplink_rep(priv))
                flags |= MLX5_TC_FLAG(ESW_OFFLOAD);
        else