linux/dim: Do nothing if no time delta between samples
Add return value for dim_calc_stats. This is an indication for the caller if curr_stats was assigned by the function. Avoid using curr_stats uninitialized over {rdma/net}_dim, when no time delta between samples. Coverity reported this potential use of an uninitialized variable. Fixes:4c4dbb4a73
("net/mlx5e: Move dynamic interrupt coalescing code to include/linux") Fixes:cb3c7fd4f8
("net/mlx5e: Support adaptive RX coalescing") Signed-off-by: Roy Novich <royno@nvidia.com> Reviewed-by: Aya Levin <ayal@nvidia.com> Reviewed-by: Saeed Mahameed <saeedm@nvidia.com> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> Reviewed-by: Leon Romanovsky <leonro@nvidia.com> Reviewed-by: Michal Kubiak <michal.kubiak@intel.com> Link: https://lore.kernel.org/r/20230507135743.138993-1-tariqt@nvidia.com Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
27c1eaa072
commit
162bd18eb5
|
@ -236,8 +236,9 @@ void dim_park_tired(struct dim *dim);
|
||||||
*
|
*
|
||||||
* Calculate the delta between two samples (in data rates).
|
* Calculate the delta between two samples (in data rates).
|
||||||
* Takes into consideration counter wrap-around.
|
* Takes into consideration counter wrap-around.
|
||||||
|
* Returned boolean indicates whether curr_stats are reliable.
|
||||||
*/
|
*/
|
||||||
void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
|
bool dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
|
||||||
struct dim_stats *curr_stats);
|
struct dim_stats *curr_stats);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -54,7 +54,7 @@ void dim_park_tired(struct dim *dim)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dim_park_tired);
|
EXPORT_SYMBOL(dim_park_tired);
|
||||||
|
|
||||||
void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
|
bool dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
|
||||||
struct dim_stats *curr_stats)
|
struct dim_stats *curr_stats)
|
||||||
{
|
{
|
||||||
/* u32 holds up to 71 minutes, should be enough */
|
/* u32 holds up to 71 minutes, should be enough */
|
||||||
|
@ -66,7 +66,7 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
|
||||||
start->comp_ctr);
|
start->comp_ctr);
|
||||||
|
|
||||||
if (!delta_us)
|
if (!delta_us)
|
||||||
return;
|
return false;
|
||||||
|
|
||||||
curr_stats->ppms = DIV_ROUND_UP(npkts * USEC_PER_MSEC, delta_us);
|
curr_stats->ppms = DIV_ROUND_UP(npkts * USEC_PER_MSEC, delta_us);
|
||||||
curr_stats->bpms = DIV_ROUND_UP(nbytes * USEC_PER_MSEC, delta_us);
|
curr_stats->bpms = DIV_ROUND_UP(nbytes * USEC_PER_MSEC, delta_us);
|
||||||
|
@ -79,5 +79,6 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
|
||||||
else
|
else
|
||||||
curr_stats->cpe_ratio = 0;
|
curr_stats->cpe_ratio = 0;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dim_calc_stats);
|
EXPORT_SYMBOL(dim_calc_stats);
|
||||||
|
|
|
@ -227,7 +227,8 @@ void net_dim(struct dim *dim, struct dim_sample end_sample)
|
||||||
dim->start_sample.event_ctr);
|
dim->start_sample.event_ctr);
|
||||||
if (nevents < DIM_NEVENTS)
|
if (nevents < DIM_NEVENTS)
|
||||||
break;
|
break;
|
||||||
dim_calc_stats(&dim->start_sample, &end_sample, &curr_stats);
|
if (!dim_calc_stats(&dim->start_sample, &end_sample, &curr_stats))
|
||||||
|
break;
|
||||||
if (net_dim_decision(&curr_stats, dim)) {
|
if (net_dim_decision(&curr_stats, dim)) {
|
||||||
dim->state = DIM_APPLY_NEW_PROFILE;
|
dim->state = DIM_APPLY_NEW_PROFILE;
|
||||||
schedule_work(&dim->work);
|
schedule_work(&dim->work);
|
||||||
|
|
|
@ -88,7 +88,8 @@ void rdma_dim(struct dim *dim, u64 completions)
|
||||||
nevents = curr_sample->event_ctr - dim->start_sample.event_ctr;
|
nevents = curr_sample->event_ctr - dim->start_sample.event_ctr;
|
||||||
if (nevents < DIM_NEVENTS)
|
if (nevents < DIM_NEVENTS)
|
||||||
break;
|
break;
|
||||||
dim_calc_stats(&dim->start_sample, curr_sample, &curr_stats);
|
if (!dim_calc_stats(&dim->start_sample, curr_sample, &curr_stats))
|
||||||
|
break;
|
||||||
if (rdma_dim_decision(&curr_stats, dim)) {
|
if (rdma_dim_decision(&curr_stats, dim)) {
|
||||||
dim->state = DIM_APPLY_NEW_PROFILE;
|
dim->state = DIM_APPLY_NEW_PROFILE;
|
||||||
schedule_work(&dim->work);
|
schedule_work(&dim->work);
|
||||||
|
|
Loading…
Reference in New Issue