mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 16:44:10 +08:00
net/mlx5: E-Switch, Centralize repersentor reg/unreg to eswitch driver
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>
This commit is contained in:
parent
29d9fd7d5a
commit
f8e8fa0262
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
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;
|
||||
|
||||
rep_if->state = REP_REGISTERED;
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_eswitch_register_vport_rep);
|
||||
|
||||
void mlx5_eswitch_unregister_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport_index, u8 rep_type)
|
||||
{
|
||||
struct mlx5_esw_offload *offloads = &esw->offloads;
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
int i;
|
||||
|
||||
rep = &offloads->vport_reps[vport_index];
|
||||
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;
|
||||
|
||||
if (esw->mode == SRIOV_OFFLOADS &&
|
||||
rep->rep_if[rep_type].state == REP_LOADED)
|
||||
rep->rep_if[rep_type].unload(rep);
|
||||
|
||||
rep->rep_if[rep_type].state = REP_UNREGISTERED;
|
||||
rep_if->state = REP_REGISTERED;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_eswitch_unregister_vport_rep);
|
||||
EXPORT_SYMBOL(mlx5_eswitch_register_vport_reps);
|
||||
|
||||
void mlx5_eswitch_unregister_vport_reps(struct mlx5_eswitch *esw, u8 rep_type)
|
||||
{
|
||||
u16 max_vf = mlx5_core_max_vfs(esw->dev);
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
int i;
|
||||
|
||||
if (esw->mode == SRIOV_OFFLOADS)
|
||||
__unload_reps_all_vport(esw, max_vf, rep_type);
|
||||
|
||||
mlx5_esw_for_all_reps(esw, i, rep)
|
||||
rep->rep_if[rep_type].state = REP_UNREGISTERED;
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_eswitch_unregister_vport_reps);
|
||||
|
||||
void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user