net/mlx5: Disable QoS when min_rates on all VFs are zero
Currently when QoS is enabled for VF and any min_rate is configured,
the driver sets bw_share value to at least 1 and doesn’t allow to set
it to 0 to make minimal rate unlimited. It means there is always a
minimal rate configured for every VF, even if user tries to remove it.
In order to make QoS disable possible, check whether all vports have
configured min_rate = 0. If this is true, set their bw_share to 0 to
disable min_rate limitations.
Fixes: c9497c9890
("net/mlx5: Add support for setting VF min rate")
Signed-off-by: Vladyslav Tarasiuk <vladyslavt@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
parent
1ce5fc724a
commit
470b747582
@ -2222,12 +2222,15 @@ static u32 calculate_vports_min_rate_divider(struct mlx5_eswitch *esw)
|
|||||||
max_guarantee = evport->info.min_rate;
|
max_guarantee = evport->info.min_rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
return max_t(u32, max_guarantee / fw_max_bw_share, 1);
|
if (max_guarantee)
|
||||||
|
return max_t(u32, max_guarantee / fw_max_bw_share, 1);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
|
static int normalize_vports_min_rate(struct mlx5_eswitch *esw)
|
||||||
{
|
{
|
||||||
u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share);
|
u32 fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share);
|
||||||
|
u32 divider = calculate_vports_min_rate_divider(esw);
|
||||||
struct mlx5_vport *evport;
|
struct mlx5_vport *evport;
|
||||||
u32 vport_max_rate;
|
u32 vport_max_rate;
|
||||||
u32 vport_min_rate;
|
u32 vport_min_rate;
|
||||||
@ -2240,9 +2243,9 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
|
|||||||
continue;
|
continue;
|
||||||
vport_min_rate = evport->info.min_rate;
|
vport_min_rate = evport->info.min_rate;
|
||||||
vport_max_rate = evport->info.max_rate;
|
vport_max_rate = evport->info.max_rate;
|
||||||
bw_share = MLX5_MIN_BW_SHARE;
|
bw_share = 0;
|
||||||
|
|
||||||
if (vport_min_rate)
|
if (divider)
|
||||||
bw_share = MLX5_RATE_TO_BW_SHARE(vport_min_rate,
|
bw_share = MLX5_RATE_TO_BW_SHARE(vport_min_rate,
|
||||||
divider,
|
divider,
|
||||||
fw_max_bw_share);
|
fw_max_bw_share);
|
||||||
@ -2267,7 +2270,6 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
|
|||||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||||
u32 fw_max_bw_share;
|
u32 fw_max_bw_share;
|
||||||
u32 previous_min_rate;
|
u32 previous_min_rate;
|
||||||
u32 divider;
|
|
||||||
bool min_rate_supported;
|
bool min_rate_supported;
|
||||||
bool max_rate_supported;
|
bool max_rate_supported;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
@ -2292,8 +2294,7 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
|
|||||||
|
|
||||||
previous_min_rate = evport->info.min_rate;
|
previous_min_rate = evport->info.min_rate;
|
||||||
evport->info.min_rate = min_rate;
|
evport->info.min_rate = min_rate;
|
||||||
divider = calculate_vports_min_rate_divider(esw);
|
err = normalize_vports_min_rate(esw);
|
||||||
err = normalize_vports_min_rate(esw, divider);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
evport->info.min_rate = previous_min_rate;
|
evport->info.min_rate = previous_min_rate;
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
Loading…
Reference in New Issue
Block a user