mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-06 07:34:03 -04:00
net/mlx5: Rework devlink port alloc/free into init/cleanup
In order to prepare the devlink port registration function to be common for PFs/VFs and SFs, change the existing devlink port allocation and free functions into PF/VF init and cleanup, so similar helpers could be later on introduced for SFs. Make the init/cleanup helpers responsible for setting/clearing the vport->dl_port pointer. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Reviewed-by: Shay Drory <shayd@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
committed by
Saeed Mahameed
parent
6176b8c4a1
commit
4c0dac1ef8
@@ -21,19 +21,16 @@ static bool mlx5_esw_devlink_port_supported(struct mlx5_eswitch *esw, u16 vport_
|
||||
mlx5_core_is_ec_vf_vport(esw->dev, vport_num);
|
||||
}
|
||||
|
||||
static struct devlink_port *mlx5_esw_dl_port_alloc(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
static void mlx5_esw_offloads_pf_vf_devlink_port_attrs_set(struct mlx5_eswitch *esw,
|
||||
u16 vport_num,
|
||||
struct devlink_port *dl_port)
|
||||
{
|
||||
struct mlx5_core_dev *dev = esw->dev;
|
||||
struct netdev_phys_item_id ppid = {};
|
||||
struct devlink_port *dl_port;
|
||||
u32 controller_num = 0;
|
||||
bool external;
|
||||
u16 pfnum;
|
||||
|
||||
dl_port = kzalloc(sizeof(*dl_port), GFP_KERNEL);
|
||||
if (!dl_port)
|
||||
return NULL;
|
||||
|
||||
mlx5_esw_get_port_parent_id(dev, &ppid);
|
||||
pfnum = mlx5_get_dev_index(dev);
|
||||
external = mlx5_core_is_ecpf_esw_manager(dev);
|
||||
@@ -55,12 +52,40 @@ static struct devlink_port *mlx5_esw_dl_port_alloc(struct mlx5_eswitch *esw, u16
|
||||
devlink_port_attrs_pci_vf_set(dl_port, 0, pfnum,
|
||||
vport_num - 1, false);
|
||||
}
|
||||
return dl_port;
|
||||
}
|
||||
|
||||
static void mlx5_esw_dl_port_free(struct devlink_port *dl_port)
|
||||
static int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
kfree(dl_port);
|
||||
struct devlink_port *dl_port;
|
||||
struct mlx5_vport *vport;
|
||||
|
||||
if (!mlx5_esw_devlink_port_supported(esw, vport_num))
|
||||
return 0;
|
||||
|
||||
vport = mlx5_eswitch_get_vport(esw, vport_num);
|
||||
if (IS_ERR(vport))
|
||||
return PTR_ERR(vport);
|
||||
|
||||
dl_port = kzalloc(sizeof(*dl_port), GFP_KERNEL);
|
||||
if (!dl_port)
|
||||
return -ENOMEM;
|
||||
|
||||
mlx5_esw_offloads_pf_vf_devlink_port_attrs_set(esw, vport_num, dl_port);
|
||||
|
||||
vport->dl_port = dl_port;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
{
|
||||
struct mlx5_vport *vport;
|
||||
|
||||
vport = mlx5_eswitch_get_vport(esw, vport_num);
|
||||
if (IS_ERR(vport) || !vport->dl_port)
|
||||
return;
|
||||
|
||||
kfree(vport->dl_port);
|
||||
vport->dl_port = NULL;
|
||||
}
|
||||
|
||||
static const struct devlink_port_ops mlx5_esw_pf_vf_dl_port_ops = {
|
||||
@@ -81,16 +106,17 @@ int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_
|
||||
struct devlink *devlink;
|
||||
int err;
|
||||
|
||||
if (!mlx5_esw_devlink_port_supported(esw, vport_num))
|
||||
return 0;
|
||||
|
||||
vport = mlx5_eswitch_get_vport(esw, vport_num);
|
||||
if (IS_ERR(vport))
|
||||
return PTR_ERR(vport);
|
||||
|
||||
dl_port = mlx5_esw_dl_port_alloc(esw, vport_num);
|
||||
err = mlx5_esw_offloads_pf_vf_devlink_port_init(esw, vport_num);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
dl_port = vport->dl_port;
|
||||
if (!dl_port)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
||||
devlink = priv_to_devlink(dev);
|
||||
dl_port_index = mlx5_esw_vport_to_devlink_port_index(dev, vport_num);
|
||||
@@ -103,13 +129,12 @@ int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_
|
||||
if (err)
|
||||
goto rate_err;
|
||||
|
||||
vport->dl_port = dl_port;
|
||||
return 0;
|
||||
|
||||
rate_err:
|
||||
devl_port_unregister(dl_port);
|
||||
reg_err:
|
||||
mlx5_esw_dl_port_free(dl_port);
|
||||
mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport_num);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -117,19 +142,15 @@ void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, u16 vpo
|
||||
{
|
||||
struct mlx5_vport *vport;
|
||||
|
||||
if (!mlx5_esw_devlink_port_supported(esw, vport_num))
|
||||
return;
|
||||
|
||||
vport = mlx5_eswitch_get_vport(esw, vport_num);
|
||||
if (IS_ERR(vport))
|
||||
if (IS_ERR(vport) || !vport->dl_port)
|
||||
return;
|
||||
|
||||
mlx5_esw_qos_vport_update_group(esw, vport, NULL, NULL);
|
||||
devl_rate_leaf_destroy(vport->dl_port);
|
||||
|
||||
devl_port_unregister(vport->dl_port);
|
||||
mlx5_esw_dl_port_free(vport->dl_port);
|
||||
vport->dl_port = NULL;
|
||||
mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport_num);
|
||||
}
|
||||
|
||||
struct devlink_port *mlx5_esw_offloads_devlink_port(struct mlx5_eswitch *esw, u16 vport_num)
|
||||
|
||||
Reference in New Issue
Block a user