Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 42e1dafa authored by Roy Novich's avatar Roy Novich Committed by Greg Kroah-Hartman
Browse files

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



[ Upstream commit 162bd18eb55adf464a0fa2b4144b8d61c75ff7c2 ]

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: 4c4dbb4a ("net/mlx5e: Move dynamic interrupt coalescing code to include/linux")
Fixes: cb3c7fd4 ("net/mlx5e: Support adaptive RX coalescing")
Signed-off-by: default avatarRoy Novich <royno@nvidia.com>
Reviewed-by: default avatarAya Levin <ayal@nvidia.com>
Reviewed-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
Reviewed-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Reviewed-by: default avatarMichal Kubiak <michal.kubiak@intel.com>
Link: https://lore.kernel.org/r/20230507135743.138993-1-tariqt@nvidia.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 7460ac5a
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -233,8 +233,9 @@ void dim_park_tired(struct dim *dim);
 *
 * Calculate the delta between two samples (in data rates).
 * 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);

/**
+3 −2
Original line number Diff line number Diff line
@@ -54,7 +54,7 @@ void dim_park_tired(struct dim *dim)
}
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)
{
	/* 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);

	if (!delta_us)
		return;
		return false;

	curr_stats->ppms = DIV_ROUND_UP(npkts * 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
		curr_stats->cpe_ratio = 0;

	return true;
}
EXPORT_SYMBOL(dim_calc_stats);
+2 −1
Original line number Diff line number Diff line
@@ -227,7 +227,8 @@ void net_dim(struct dim *dim, struct dim_sample end_sample)
				  dim->start_sample.event_ctr);
		if (nevents < DIM_NEVENTS)
			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)) {
			dim->state = DIM_APPLY_NEW_PROFILE;
			schedule_work(&dim->work);
+2 −1
Original line number Diff line number Diff line
@@ -88,7 +88,8 @@ void rdma_dim(struct dim *dim, u64 completions)
		nevents = curr_sample->event_ctr - dim->start_sample.event_ctr;
		if (nevents < DIM_NEVENTS)
			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)) {
			dim->state = DIM_APPLY_NEW_PROFILE;
			schedule_work(&dim->work);