]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
net/mlx5: E-Switch, Refactor vport representors initialization
authorMark Bloch <markb@mellanox.com>
Wed, 9 Aug 2017 11:47:14 +0000 (11:47 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Thu, 28 Dec 2017 10:36:33 +0000 (12:36 +0200)
Refactor the init stage of vport representors registration.
vport number and hw id can be assigned by the E-Switch driver and not by
the netdevice driver. While here, make the error path of mlx5_eswitch_init()
a reverse order of the good path, also use kcalloc to allocate an array
instead of kzalloc.

Signed-off-by: Mark Bloch <markb@mellanox.com>
Reviewed-by: Or Gerlitz <ogerlitz@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/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index 2c43606c26b59871d2232ab14c816b10cb8bdc83..4661ef12c18c8c506031234add95e892fb0de828 100644 (file)
@@ -1100,17 +1100,12 @@ static void mlx5e_rep_register_vf_vports(struct mlx5e_priv *priv)
        struct mlx5_eswitch *esw   = mdev->priv.eswitch;
        int total_vfs = MLX5_TOTAL_VPORTS(mdev);
        int vport;
-       u8 mac[ETH_ALEN];
-
-       mlx5_query_nic_vport_mac_address(mdev, 0, mac);
 
        for (vport = 1; vport < total_vfs; vport++) {
                struct mlx5_eswitch_rep rep;
 
                rep.load = mlx5e_vport_rep_load;
                rep.unload = mlx5e_vport_rep_unload;
-               rep.vport = vport;
-               ether_addr_copy(rep.hw_id, mac);
                mlx5_eswitch_register_vport_rep(esw, vport, &rep);
        }
 }
@@ -1132,10 +1127,8 @@ void mlx5e_register_vport_reps(struct mlx5e_priv *priv)
        struct mlx5_eswitch *esw   = mdev->priv.eswitch;
        struct mlx5_eswitch_rep rep;
 
-       mlx5_query_nic_vport_mac_address(mdev, 0, rep.hw_id);
        rep.load = mlx5e_nic_rep_load;
        rep.unload = mlx5e_nic_rep_unload;
-       rep.vport = FDB_UPLINK_VPORT;
        rep.netdev = priv->netdev;
        mlx5_eswitch_register_vport_rep(esw, 0, &rep); /* UPLINK PF vport*/
 
index bbb140f517c416299204cbafb77e1f9d8032fe31..6d4cbdb698231e83d8654308d8d7b26f32fb3dc6 100644 (file)
@@ -1644,13 +1644,9 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
                goto abort;
        }
 
-       esw->offloads.vport_reps =
-               kzalloc(total_vports * sizeof(struct mlx5_eswitch_rep),
-                       GFP_KERNEL);
-       if (!esw->offloads.vport_reps) {
-               err = -ENOMEM;
+       err = esw_offloads_init_reps(esw);
+       if (err)
                goto abort;
-       }
 
        hash_init(esw->offloads.encap_tbl);
        hash_init(esw->offloads.mod_hdr_tbl);
@@ -1681,8 +1677,8 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
 abort:
        if (esw->work_queue)
                destroy_workqueue(esw->work_queue);
+       esw_offloads_cleanup_reps(esw);
        kfree(esw->vports);
-       kfree(esw->offloads.vport_reps);
        kfree(esw);
        return err;
 }
@@ -1696,7 +1692,7 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
 
        esw->dev->priv.eswitch = NULL;
        destroy_workqueue(esw->work_queue);
-       kfree(esw->offloads.vport_reps);
+       esw_offloads_cleanup_reps(esw);
        kfree(esw->vports);
        kfree(esw);
 }
index 565c8b7a399af7559c910faabbec4e8d99738bb6..9722c2a96090092f16662ac562ecce0798a523ac 100644 (file)
@@ -197,6 +197,8 @@ struct mlx5_eswitch {
 
 void esw_offloads_cleanup(struct mlx5_eswitch *esw, int nvports);
 int esw_offloads_init(struct mlx5_eswitch *esw, int nvports);
+void esw_offloads_cleanup_reps(struct mlx5_eswitch *esw);
+int esw_offloads_init_reps(struct mlx5_eswitch *esw);
 
 /* E-Switch API */
 int mlx5_eswitch_init(struct mlx5_core_dev *dev);
index 1143d80119bd8a67ffd9e9636afcffe32deaa4c9..7e15854c108712959d17ac699d47bac0b3b8992e 100644 (file)
@@ -732,6 +732,41 @@ static int esw_offloads_start(struct mlx5_eswitch *esw)
        return err;
 }
 
+void esw_offloads_cleanup_reps(struct mlx5_eswitch *esw)
+{
+       kfree(esw->offloads.vport_reps);
+}
+
+int esw_offloads_init_reps(struct mlx5_eswitch *esw)
+{
+       int total_vfs = MLX5_TOTAL_VPORTS(esw->dev);
+       struct mlx5_core_dev *dev = esw->dev;
+       struct mlx5_esw_offload *offloads;
+       struct mlx5_eswitch_rep *rep;
+       u8 hw_id[ETH_ALEN];
+       int vport;
+
+       esw->offloads.vport_reps = kcalloc(total_vfs,
+                                          sizeof(struct mlx5_eswitch_rep),
+                                          GFP_KERNEL);
+       if (!esw->offloads.vport_reps)
+               return -ENOMEM;
+
+       offloads = &esw->offloads;
+       mlx5_query_nic_vport_mac_address(dev, 0, hw_id);
+
+       for (vport = 0; vport < total_vfs; vport++) {
+               rep = &offloads->vport_reps[vport];
+
+               rep->vport = vport;
+               ether_addr_copy(rep->hw_id, hw_id);
+       }
+
+       offloads->vport_reps[0].vport = FDB_UPLINK_VPORT;
+
+       return 0;
+}
+
 int esw_offloads_init(struct mlx5_eswitch *esw, int nvports)
 {
        struct mlx5_eswitch_rep *rep;
@@ -1127,13 +1162,9 @@ void mlx5_eswitch_register_vport_rep(struct mlx5_eswitch *esw,
 
        rep = &offloads->vport_reps[vport_index];
 
-       memset(rep, 0, sizeof(*rep));
-
        rep->load   = __rep->load;
        rep->unload = __rep->unload;
-       rep->vport  = __rep->vport;
        rep->netdev = __rep->netdev;
-       ether_addr_copy(rep->hw_id, __rep->hw_id);
 
        INIT_LIST_HEAD(&rep->vport_sqs_list);
        rep->valid = true;