]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
net/mlx5: E-Switch, Centralize repersentor reg/unreg to eswitch driver
authorBodong Wang <bodong@mellanox.com>
Thu, 31 Jan 2019 23:42:57 +0000 (17:42 -0600)
committerSaeed Mahameed <saeedm@mellanox.com>
Sat, 16 Feb 2019 01:25:58 +0000 (17:25 -0800)
Eswitch has two users: IB and ETH. They both register repersentors
when mlx5 interface is added, and unregister the repersentors when
mlx5 interface is removed. Ideally, each driver should only deal with
the entities which are unique to itself. However, current IB and ETH
drivers have to perform the following eswitch operations:

1. When registering, specify how many vports to register. This number
   is the same for both drivers which is the total available vport
   numbers.
2. When unregistering, specify the number of registered vports to do
   unregister. Also, unload the repersentors which are already loaded.

It's unnecessary for eswitch driver to hands out the control of above
operations to individual driver users, as they're not unique to each
driver. Instead, such operations should be centralized to eswitch
driver. This consolidates eswitch control flow, and simplified IB and
ETH driver.

This patch doesn't change any functionality.

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

index 99cae9a10195b0dcafa30ccc8c3db5516d9ce341..4700cffb5a008dfb224ae667046fcb3e95c8bf64 100644 (file)
@@ -95,26 +95,20 @@ static void *mlx5_ib_vport_get_proto_dev(struct mlx5_eswitch_rep *rep)
 void mlx5_ib_register_vport_reps(struct mlx5_core_dev *mdev)
 {
        struct mlx5_eswitch *esw = mdev->priv.eswitch;
-       int total_vports = MLX5_TOTAL_VPORTS(mdev);
        struct mlx5_eswitch_rep_if rep_if = {};
-       int vport;
-
-       for (vport = 0; vport < total_vports; vport++) {
-               rep_if.load = mlx5_ib_vport_rep_load;
-               rep_if.unload = mlx5_ib_vport_rep_unload;
-               rep_if.get_proto_dev = mlx5_ib_vport_get_proto_dev;
-               mlx5_eswitch_register_vport_rep(esw, vport, &rep_if, REP_IB);
-       }
+
+       rep_if.load = mlx5_ib_vport_rep_load;
+       rep_if.unload = mlx5_ib_vport_rep_unload;
+       rep_if.get_proto_dev = mlx5_ib_vport_get_proto_dev;
+
+       mlx5_eswitch_register_vport_reps(esw, &rep_if, REP_IB);
 }
 
 void mlx5_ib_unregister_vport_reps(struct mlx5_core_dev *mdev)
 {
        struct mlx5_eswitch *esw = mdev->priv.eswitch;
-       int total_vports = MLX5_TOTAL_VPORTS(mdev);
-       int vport;
 
-       for (vport = total_vports - 1; vport >= 0; vport--)
-               mlx5_eswitch_unregister_vport_rep(esw, vport, REP_IB);
+       mlx5_eswitch_unregister_vport_reps(esw, REP_IB);
 }
 
 u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw)
index f84889bbe2a0c9bc719952c825dbb3f03eef368e..287d48e5b073944db1e7ea0636d893c76114685c 100644 (file)
@@ -1798,25 +1798,18 @@ static void *mlx5e_vport_rep_get_proto_dev(struct mlx5_eswitch_rep *rep)
 void mlx5e_rep_register_vport_reps(struct mlx5_core_dev *mdev)
 {
        struct mlx5_eswitch *esw = mdev->priv.eswitch;
-       int total_vfs = MLX5_TOTAL_VPORTS(mdev);
-       int vport;
+       struct mlx5_eswitch_rep_if rep_if = {};
 
-       for (vport = 0; vport < total_vfs; vport++) {
-               struct mlx5_eswitch_rep_if rep_if = {};
+       rep_if.load = mlx5e_vport_rep_load;
+       rep_if.unload = mlx5e_vport_rep_unload;
+       rep_if.get_proto_dev = mlx5e_vport_rep_get_proto_dev;
 
-               rep_if.load = mlx5e_vport_rep_load;
-               rep_if.unload = mlx5e_vport_rep_unload;
-               rep_if.get_proto_dev = mlx5e_vport_rep_get_proto_dev;
-               mlx5_eswitch_register_vport_rep(esw, vport, &rep_if, REP_ETH);
-       }
+       mlx5_eswitch_register_vport_reps(esw, &rep_if, REP_ETH);
 }
 
 void mlx5e_rep_unregister_vport_reps(struct mlx5_core_dev *mdev)
 {
        struct mlx5_eswitch *esw = mdev->priv.eswitch;
-       int total_vfs = MLX5_TOTAL_VPORTS(mdev);
-       int vport;
 
-       for (vport = total_vfs - 1; vport >= 0; vport--)
-               mlx5_eswitch_unregister_vport_rep(esw, vport, REP_ETH);
+       mlx5_eswitch_unregister_vport_reps(esw, REP_ETH);
 }
index 7131d41796fb272584ae83e38d6a41f1f5d56bf1..b702b56c457ea4c279edb9d8d9d98745f39a05a1 100644 (file)
@@ -1923,40 +1923,39 @@ int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink, u8 *encap)
        return 0;
 }
 
-void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw,
-                                    int vport_index,
-                                    struct mlx5_eswitch_rep_if *__rep_if,
-                                    u8 rep_type)
+void mlx5_eswitch_register_vport_reps(struct mlx5_eswitch *esw,
+                                     struct mlx5_eswitch_rep_if *__rep_if,
+                                     u8 rep_type)
 {
-       struct mlx5_esw_offload *offloads = &esw->offloads;
        struct mlx5_eswitch_rep_if *rep_if;
+       struct mlx5_eswitch_rep *rep;
+       int i;
 
-       rep_if = &offloads->vport_reps[vport_index].rep_if[rep_type];
-
-       rep_if->load   = __rep_if->load;
-       rep_if->unload = __rep_if->unload;
-       rep_if->get_proto_dev = __rep_if->get_proto_dev;
-       rep_if->priv = __rep_if->priv;
+       mlx5_esw_for_all_reps(esw, i, rep) {
+               rep_if = &rep->rep_if[rep_type];
+               rep_if->load   = __rep_if->load;
+               rep_if->unload = __rep_if->unload;
+               rep_if->get_proto_dev = __rep_if->get_proto_dev;
+               rep_if->priv = __rep_if->priv;
 
-       rep_if->state = REP_REGISTERED;
+               rep_if->state = REP_REGISTERED;
+       }
 }
-EXPORT_SYMBOL(mlx5_eswitch_register_vport_rep);
+EXPORT_SYMBOL(mlx5_eswitch_register_vport_reps);
 
-void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw,
-                                      int vport_index, u8 rep_type)
+void mlx5_eswitch_unregister_vport_reps(struct mlx5_eswitch *esw, u8 rep_type)
 {
-       struct mlx5_esw_offload *offloads = &esw->offloads;
+       u16 max_vf = mlx5_core_max_vfs(esw->dev);
        struct mlx5_eswitch_rep *rep;
+       int i;
 
-       rep = &offloads->vport_reps[vport_index];
-
-       if (esw->mode == SRIOV_OFFLOADS &&
-           rep->rep_if[rep_type].state == REP_LOADED)
-               rep->rep_if[rep_type].unload(rep);
+       if (esw->mode == SRIOV_OFFLOADS)
+               __unload_reps_all_vport(esw, max_vf, rep_type);
 
-       rep->rep_if[rep_type].state = REP_UNREGISTERED;
+       mlx5_esw_for_all_reps(esw, i, rep)
+               rep->rep_if[rep_type].state = REP_UNREGISTERED;
 }
-EXPORT_SYMBOL(mlx5_eswitch_unregister_vport_rep);
+EXPORT_SYMBOL(mlx5_eswitch_unregister_vport_reps);
 
 void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type)
 {
index e3dbc1bc091754504f5c7d8ffb50dc8290da3f84..96d8435421de85810815362c89828e11106785b3 100644 (file)
@@ -46,13 +46,10 @@ struct mlx5_eswitch_rep {
        u32                    vlan_refcount;
 };
 
-void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw,
-                                    int vport_index,
-                                    struct mlx5_eswitch_rep_if *rep_if,
-                                    u8 rep_type);
-void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw,
-                                      int vport_index,
-                                      u8 rep_type);
+void mlx5_eswitch_register_vport_reps(struct mlx5_eswitch *esw,
+                                     struct mlx5_eswitch_rep_if *rep_if,
+                                     u8 rep_type);
+void mlx5_eswitch_unregister_vport_reps(struct mlx5_eswitch *esw, u8 rep_type);
 void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
                                 int vport,
                                 u8 rep_type);