Re: [PATCH] drm/amd/pm/smu11: Prevent division by zero
From: Alex Deucher
Date: Thu Mar 20 2025 - 09:53:01 EST
On Thu, Mar 20, 2025 at 9:11 AM Denis Arefev <arefev@xxxxxxxxx> wrote:
>
> The user can set any speed value.
> If speed is greater than UINT_MAX/8, division by zero is possible.
>
> Found by Linux Verification Center (linuxtesting.org) with SVACE.
>
> Fixes: 1e866f1fe528 ("drm/amd/pm: Prevent divide by zero")
> Signed-off-by: Denis Arefev <arefev@xxxxxxxxx>
Thanks. While you are at it, can you fix up all of the other fan
speed cases? I quick grep shows:
drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c: tach_period = 60 * xclk
* 10000 / (8 * speed);
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.c: tach_period
= 60 * crystal_clock_freq * 10000 / (8 * speed);
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_thermal.c:
tach_period = 60 * crystal_clock_freq * 10000 / (8 * speed);
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_thermal.c:
tach_period = 60 * crystal_clock_freq * 10000 / (8 * speed);
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c: tach_period = 60
* crystal_clock_freq * 10000 / (8 * speed);
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c: tach_period = 60 *
crystal_clock_freq * 10000 / (8 * speed);
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c: tach_period = 60 *
crystal_clock_freq * 10000 / (8 * speed);
Thanks,
Alex
> ---
> drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
> index 189c6a32b6bd..54229b991858 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
> @@ -1200,7 +1200,7 @@ int smu_v11_0_set_fan_speed_rpm(struct smu_context *smu,
> uint32_t crystal_clock_freq = 2500;
> uint32_t tach_period;
>
> - if (speed == 0)
> + if (!speed || speed > UINT_MAX/8)
> return -EINVAL;
> /*
> * To prevent from possible overheat, some ASICs may have requirement
> --
> 2.43.0
>