]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
net/mlx5: E-Switch, Properly refer to the esw manager vport
authorBodong Wang <bodong@mellanox.com>
Thu, 8 Nov 2018 20:37:04 +0000 (22:37 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Sat, 16 Feb 2019 01:25:56 +0000 (17:25 -0800)
In SmartNIC mode, the eswitch manager is not necessarily the PF
(vport 0). Use a helper function to get the correct eswitch manager
vport number and cache on the eswitch instance for fast reference.

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

index 05830696abd8bc92b169e31f139ca3588a17aaf5..9c622749dbde8fcc53e5ff0718da33406529334b 100644 (file)
@@ -378,16 +378,16 @@ static int esw_add_uc_addr(struct mlx5_eswitch *esw, struct vport_addr *vaddr)
        u16 vport = vaddr->vport;
        int err;
 
-       /* Skip mlx5_mpfs_add_mac for PFs,
-        * it is already done by the PF netdev in mlx5e_execute_l2_action
+       /* Skip mlx5_mpfs_add_mac for eswitch_managers,
+        * it is already done by its netdev in mlx5e_execute_l2_action
         */
-       if (!vport)
+       if (esw->manager_vport == vport)
                goto fdb_add;
 
        err = mlx5_mpfs_add_mac(esw->dev, mac);
        if (err) {
                esw_warn(esw->dev,
-                        "Failed to add L2 table mac(%pM) for vport(%d), err(%d)\n",
+                        "Failed to add L2 table mac(%pM) for vport(0x%x), err(%d)\n",
                         mac, vport, err);
                return err;
        }
@@ -410,10 +410,10 @@ static int esw_del_uc_addr(struct mlx5_eswitch *esw, struct vport_addr *vaddr)
        u16 vport = vaddr->vport;
        int err = 0;
 
-       /* Skip mlx5_mpfs_del_mac for PFs,
-        * it is already done by the PF netdev in mlx5e_execute_l2_action
+       /* Skip mlx5_mpfs_del_mac for eswitch managerss,
+        * it is already done by its netdev in mlx5e_execute_l2_action
         */
-       if (!vport || !vaddr->mpfs)
+       if (!vaddr->mpfs || esw->manager_vport == vport)
                goto fdb_del;
 
        err = mlx5_mpfs_del_mac(esw->dev, mac);
@@ -1457,15 +1457,22 @@ static void esw_apply_vport_conf(struct mlx5_eswitch *esw,
 {
        int vport_num = vport->vport;
 
-       if (!vport_num)
+       if (esw->manager_vport == vport_num)
                return;
 
        mlx5_modify_vport_admin_state(esw->dev,
                                      MLX5_VPORT_STATE_OP_MOD_ESW_VPORT,
                                      vport_num,
                                      vport->info.link_state);
-       mlx5_modify_nic_vport_mac_address(esw->dev, vport_num, vport->info.mac);
-       mlx5_modify_nic_vport_node_guid(esw->dev, vport_num, vport->info.node_guid);
+
+       /* Host PF has its own mac/guid. */
+       if (vport_num) {
+               mlx5_modify_nic_vport_mac_address(esw->dev, vport_num,
+                                                 vport->info.mac);
+               mlx5_modify_nic_vport_node_guid(esw->dev, vport_num,
+                                               vport->info.node_guid);
+       }
+
        modify_esw_vport_cvlan(esw->dev, vport_num, vport->info.vlan, vport->info.qos,
                               (vport->info.vlan || vport->info.qos));
 
@@ -1537,8 +1544,11 @@ static void esw_enable_vport(struct mlx5_eswitch *esw, int vport_num,
        vport->enabled_events = enable_events;
        vport->enabled = true;
 
-       /* only PF is trusted by default */
-       if (!vport_num)
+       /* Esw manager is trusted by default. Host PF (vport 0) is trusted as well
+        * in smartNIC as it's a vport group manager.
+        */
+       if (esw->manager_vport == vport_num ||
+           (!vport_num && mlx5_core_is_ecpf(esw->dev)))
                vport->info.trusted = true;
 
        esw_vport_change_handle_locked(vport);
@@ -1733,6 +1743,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
                return -ENOMEM;
 
        esw->dev = dev;
+       esw->manager_vport = mlx5_eswitch_manager_vport(dev);
 
        esw->work_queue = create_singlethread_workqueue("mlx5_esw_wq");
        if (!esw->work_queue) {
index 0a3eee8746c145d97ff36410ed587f2d39e737c4..959a9e28d08f806e1cfe416b63b3391cf8c45d68 100644 (file)
@@ -38,6 +38,7 @@
 #include <net/devlink.h>
 #include <linux/mlx5/device.h>
 #include <linux/mlx5/eswitch.h>
+#include <linux/mlx5/vport.h>
 #include <linux/mlx5/fs.h>
 #include "lib/mpfs.h"
 
@@ -204,6 +205,7 @@ struct mlx5_eswitch {
        struct mlx5_esw_offload offloads;
        int                     mode;
        int                     nvports;
+       u16                     manager_vport;
 };
 
 void esw_offloads_cleanup(struct mlx5_eswitch *esw, int nvports);
@@ -363,6 +365,14 @@ bool mlx5_esw_lag_prereq(struct mlx5_core_dev *dev0,
 
 #define esw_debug(dev, format, ...)                            \
        mlx5_core_dbg_mask(dev, MLX5_DEBUG_ESWITCH_MASK, format, ##__VA_ARGS__)
+
+/* The returned number is valid only when the dev is eswitch manager. */
+static inline u16 mlx5_eswitch_manager_vport(struct mlx5_core_dev *dev)
+{
+       return mlx5_core_is_ecpf_esw_manager(dev) ?
+               MLX5_VPORT_ECPF : MLX5_VPORT_PF;
+}
+
 #else  /* CONFIG_MLX5_ESWITCH */
 /* eswitch API stubs */
 static inline int  mlx5_eswitch_init(struct mlx5_core_dev *dev) { return 0; }
index 9128b45f3f37ec2b28b40bf62f413e5aaa55c697..af2c44d313574cb1028d7de2821278ee5a9a2e7f 100644 (file)
@@ -522,7 +522,8 @@ mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw, int vport, u32 sqn
 
        misc = MLX5_ADDR_OF(fte_match_param, spec->match_value, misc_parameters);
        MLX5_SET(fte_match_set_misc, misc, source_sqn, sqn);
-       MLX5_SET(fte_match_set_misc, misc, source_port, 0x0); /* source vport is 0 */
+       /* source vport is the esw manager */
+       MLX5_SET(fte_match_set_misc, misc, source_port, esw->manager_vport);
 
        misc = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, misc_parameters);
        MLX5_SET_TO_ONES(fte_match_set_misc, misc, source_sqn);
@@ -567,7 +568,7 @@ static void peer_miss_rules_setup(struct mlx5_core_dev *peer_dev,
                         source_eswitch_owner_vhca_id);
 
        dest->type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-       dest->vport.num = 0;
+       dest->vport.num = peer_dev->priv.eswitch->manager_vport;
        dest->vport.vhca_id = MLX5_CAP_GEN(peer_dev, vhca_id);
        dest->vport.flags |= MLX5_FLOW_DEST_VPORT_VHCA_ID;
 }
@@ -666,7 +667,7 @@ static int esw_add_fdb_miss_rule(struct mlx5_eswitch *esw)
        dmac_c[0] = 0x01;
 
        dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
-       dest.vport.num = 0;
+       dest.vport.num = esw->manager_vport;
        flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
 
        flow_rule = mlx5_add_flow_rules(esw->fdb_table.offloads.slow_fdb, spec,
index 3bc05449ac39f3a2d2d390cdaa44a69673ea8417..b67bcc95ab5defcd5e05f02e33cfdf5762d90cf5 100644 (file)
@@ -52,6 +52,8 @@ enum {
 };
 
 enum {
+       MLX5_VPORT_PF                   = 0x0,
+       MLX5_VPORT_ECPF                 = 0xfffe,
        MLX5_VPORT_UPLINK               = 0xffff
 };