net/mlx5: E-Switch, Properly refer to host PF vport as other vport
authorBodong Wang <bodong@mellanox.com>
Fri, 1 Feb 2019 23:34:55 +0000 (17:34 -0600)
committerSaeed Mahameed <saeedm@mellanox.com>
Sat, 16 Feb 2019 01:25:56 +0000 (17:25 -0800)
Commands referring to vports use the following scheme:

1. When referring to my own vport, put 0 in vport and 0 in other_vport.
2. When referring to another vport, put the vport number of the
   referred vport and put 1 in other_vport. It was assumed that driver
   is accessing other vport when vport number is greater than 0.

With the above scheme, the case that ECPF eswitch manager is trying
to access host PF vport will fall over with scheme 1 as the vport
number is 0. This is apparently wrong as driver is trying to refer
other vport.

As such usage can only happen in the eswitch context, change relevant
functions to provide other vport input properly.

Signed-off-by: Bodong Wang <bodong@mellanox.com>
Signed-off-by: Eli Cohen <eli@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
drivers/net/ethernet/mellanox/mlx5/core/vport.c
include/linux/mlx5/vport.h

index 685f1975be58be6f7bee0ef18def27bf4a6516a4..f84889bbe2a0c9bc719952c825dbb3f03eef368e 100644 (file)
@@ -1083,7 +1083,8 @@ static int mlx5e_vf_rep_open(struct net_device *dev)
 
        if (!mlx5_modify_vport_admin_state(priv->mdev,
                                           MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
-                                          rep->vport, MLX5_VPORT_ADMIN_STATE_UP))
+                                          rep->vport, 1,
+                                          MLX5_VPORT_ADMIN_STATE_UP))
                netif_carrier_on(dev);
 
 unlock:
@@ -1101,7 +1102,8 @@ static int mlx5e_vf_rep_close(struct net_device *dev)
        mutex_lock(&priv->state_lock);
        mlx5_modify_vport_admin_state(priv->mdev,
                                      MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
-                                     rep->vport, MLX5_VPORT_ADMIN_STATE_DOWN);
+                                     rep->vport, 1,
+                                     MLX5_VPORT_ADMIN_STATE_DOWN);
        ret = mlx5e_close_locked(dev);
        mutex_unlock(&priv->state_lock);
        return ret;
index 9c622749dbde8fcc53e5ff0718da33406529334b..648c743cc947c6b66ef827f4feaf2a4256e79fc3 100644 (file)
@@ -1462,7 +1462,7 @@ static void esw_apply_vport_conf(struct mlx5_eswitch *esw,
 
        mlx5_modify_vport_admin_state(esw->dev,
                                      MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
-                                     vport_num,
+                                     vport_num, 1,
                                      vport->info.link_state);
 
        /* Host PF has its own mac/guid. */
@@ -1581,10 +1581,10 @@ static void esw_disable_vport(struct mlx5_eswitch *esw, int vport_num)
        esw_vport_change_handle_locked(vport);
        vport->enabled_events = 0;
        esw_vport_disable_qos(esw, vport_num);
-       if (vport_num && esw->mode == SRIOV_LEGACY) {
+       if (esw->mode == SRIOV_LEGACY) {
                mlx5_modify_vport_admin_state(esw->dev,
                                              MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
-                                             vport_num,
+                                             vport_num, 1,
                                              MLX5_VPORT_ADMIN_STATE_DOWN);
                esw_vport_disable_egress_acl(esw, vport);
                esw_vport_disable_ingress_acl(esw, vport);
@@ -1875,7 +1875,7 @@ int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw,
 
        err = mlx5_modify_vport_admin_state(esw->dev,
                                            MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
-                                           vport, link_state);
+                                           vport, 1, link_state);
        if (err) {
                mlx5_core_warn(esw->dev,
                               "Failed to set vport %d link state, err = %d",
@@ -2137,7 +2137,7 @@ static int mlx5_eswitch_query_vport_drop_stats(struct mlx5_core_dev *dev,
            !MLX5_CAP_GEN(dev, transmit_discard_vport_down))
                return 0;
 
-       err = mlx5_query_vport_down_stats(dev, vport_idx,
+       err = mlx5_query_vport_down_stats(dev, vport_idx, 1,
                                          &rx_discard_vport_down,
                                          &tx_discard_vport_down);
        if (err)
@@ -2174,8 +2174,7 @@ int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,
                 MLX5_CMD_OP_QUERY_VPORT_COUNTER);
        MLX5_SET(query_vport_counter_in, in, op_mod, 0);
        MLX5_SET(query_vport_counter_in, in, vport_number, vport);
-       if (vport)
-               MLX5_SET(query_vport_counter_in, in, other_vport, 1);
+       MLX5_SET(query_vport_counter_in, in, other_vport, 1);
 
        memset(out, 0, outlen);
        err = mlx5_cmd_exec(esw->dev, in, sizeof(in), out, outlen);
index 9a928eb48522f3c2965ef2fc38a198663dd6c725..ef95feca9961b2fe031ef56b3c857fc79365a309 100644 (file)
@@ -64,7 +64,7 @@ u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport)
 }
 
 int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
-                                 u16 vport, u8 state)
+                                 u16 vport, u8 other_vport, u8 state)
 {
        u32 in[MLX5_ST_SZ_DW(modify_vport_state_in)]   = {0};
        u32 out[MLX5_ST_SZ_DW(modify_vport_state_out)] = {0};
@@ -73,8 +73,7 @@ int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
                 MLX5_CMD_OP_MODIFY_VPORT_STATE);
        MLX5_SET(modify_vport_state_in, in, op_mod, opmod);
        MLX5_SET(modify_vport_state_in, in, vport_number, vport);
-       if (vport)
-               MLX5_SET(modify_vport_state_in, in, other_vport, 1);
+       MLX5_SET(modify_vport_state_in, in, other_vport, other_vport);
        MLX5_SET(modify_vport_state_in, in, admin_state, state);
 
        return mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));
@@ -1057,7 +1056,7 @@ free:
 EXPORT_SYMBOL_GPL(mlx5_core_query_vport_counter);
 
 int mlx5_query_vport_down_stats(struct mlx5_core_dev *mdev, u16 vport,
-                               u64 *rx_discard_vport_down,
+                               u8 other_vport, u64 *rx_discard_vport_down,
                                u64 *tx_discard_vport_down)
 {
        u32 out[MLX5_ST_SZ_DW(query_vnic_env_out)] = {0};
@@ -1068,8 +1067,7 @@ int mlx5_query_vport_down_stats(struct mlx5_core_dev *mdev, u16 vport,
                 MLX5_CMD_OP_QUERY_VNIC_ENV);
        MLX5_SET(query_vnic_env_in, in, op_mod, 0);
        MLX5_SET(query_vnic_env_in, in, vport_number, vport);
-       if (vport)
-               MLX5_SET(query_vnic_env_in, in, other_vport, 1);
+       MLX5_SET(query_vnic_env_in, in, other_vport, other_vport);
 
        err = mlx5_cmd_exec(mdev, in, sizeof(in), out, sizeof(out));
        if (err)
index b67bcc95ab5defcd5e05f02e33cfdf5762d90cf5..b7edcb1dadd8ecae3c8dd46f7bde8205a3834296 100644 (file)
@@ -59,7 +59,7 @@ enum {
 
 u8 mlx5_query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport);
 int mlx5_modify_vport_admin_state(struct mlx5_core_dev *mdev, u8 opmod,
-                                 u16 vport, u8 state);
+                                 u16 vport, u8 other_vport, u8 state);
 int mlx5_query_nic_vport_mac_address(struct mlx5_core_dev *mdev,
                                     u16 vport, u8 *addr);
 int mlx5_query_nic_vport_min_inline(struct mlx5_core_dev *mdev,
@@ -121,7 +121,7 @@ int mlx5_modify_nic_vport_vlans(struct mlx5_core_dev *dev,
 int mlx5_nic_vport_enable_roce(struct mlx5_core_dev *mdev);
 int mlx5_nic_vport_disable_roce(struct mlx5_core_dev *mdev);
 int mlx5_query_vport_down_stats(struct mlx5_core_dev *mdev, u16 vport,
-                               u64 *rx_discard_vport_down,
+                               u8 other_vport, u64 *rx_discard_vport_down,
                                u64 *tx_discard_vport_down);
 int mlx5_core_query_vport_counter(struct mlx5_core_dev *dev, u8 other_vport,
                                  int vf, u8 port_num, void *out,