net/mlx5: E-Switch, Refactor vport representors initialization
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>
This commit is contained in:
parent
1291a0d504
commit
e8d31c4d65
@ -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*/
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user