linux/dim: Do nothing if no time delta between samples

[ Upstream commit 162bd18eb5 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Roy Novich 2023-05-07 16:57:43 +03:00 committed by Greg Kroah-Hartman
parent a84b08314f
commit 9e916db758
4 changed files with 9 additions and 5 deletions

View File

@ -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);
/** /**

View File

@ -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);

View File

@ -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);

View File

@ -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);