linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] gpu: drm: msm: use div64_u64() instead of do_div()
@ 2022-02-09  8:37 Qing Wang
  2022-02-09 22:17 ` Dmitry Baryshkov
  0 siblings, 1 reply; 3+ messages in thread
From: Qing Wang @ 2022-02-09  8:37 UTC (permalink / raw)
  To: Rob Clark, Sean Paul, David Airlie, Daniel Vetter, linux-arm-msm,
	dri-devel, freedreno, linux-kernel
  Cc: Wang Qing

From: Wang Qing <wangqing@vivo.com>

do_div() does a 64-by-32 division.
When the divisor is u64, do_div() truncates it to 32 bits, this means it
can test non-zero and be truncated to zero for division.

fix do_div.cocci warning:
do_div() does a 64-by-32 division, please consider using div64_u64 instead.

Signed-off-by: Wang Qing <wangqing@vivo.com>
---
 drivers/gpu/drm/msm/msm_gpu.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index 2c1049c..aa4617b
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -648,7 +648,7 @@ static void retire_submit(struct msm_gpu *gpu, struct msm_ringbuffer *ring,
 	/* Calculate the clock frequency from the number of CP cycles */
 	if (elapsed) {
 		clock = (stats->cpcycles_end - stats->cpcycles_start) * 1000;
-		do_div(clock, elapsed);
+		div64_u64(clock, elapsed);
 	}
 
 	trace_msm_gpu_submit_retired(submit, elapsed, clock,
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: gpu: drm: msm: use div64_u64() instead of do_div()
  2022-02-09  8:37 [PATCH] gpu: drm: msm: use div64_u64() instead of do_div() Qing Wang
@ 2022-02-09 22:17 ` Dmitry Baryshkov
  2022-02-10  9:50   ` Dmitry Baryshkov
  0 siblings, 1 reply; 3+ messages in thread
From: Dmitry Baryshkov @ 2022-02-09 22:17 UTC (permalink / raw)
  To: Qing Wang, Rob Clark, Sean Paul, David Airlie, Daniel Vetter,
	linux-arm-msm, dri-devel, freedreno, linux-kernel

On 09/02/2022 11:37, Qing Wang wrote:
> From: Wang Qing <wangqing@vivo.com>
> 
> do_div() does a 64-by-32 division.
> When the divisor is u64, do_div() truncates it to 32 bits, this means it
> can test non-zero and be truncated to zero for division.
> 
> fix do_div.cocci warning:
> do_div() does a 64-by-32 division, please consider using div64_u64 instead.
> 
> Signed-off-by: Wang Qing <wangqing@vivo.com>

Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

> ---
>   drivers/gpu/drm/msm/msm_gpu.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
> index 2c1049c..aa4617b
> --- a/drivers/gpu/drm/msm/msm_gpu.c
> +++ b/drivers/gpu/drm/msm/msm_gpu.c
> @@ -648,7 +648,7 @@ static void retire_submit(struct msm_gpu *gpu, struct msm_ringbuffer *ring,
>   	/* Calculate the clock frequency from the number of CP cycles */
>   	if (elapsed) {
>   		clock = (stats->cpcycles_end - stats->cpcycles_start) * 1000;
> -		do_div(clock, elapsed);
> +		div64_u64(clock, elapsed);
>   	}
>   
>   	trace_msm_gpu_submit_retired(submit, elapsed, clock,


-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: gpu: drm: msm: use div64_u64() instead of do_div()
  2022-02-09 22:17 ` Dmitry Baryshkov
@ 2022-02-10  9:50   ` Dmitry Baryshkov
  0 siblings, 0 replies; 3+ messages in thread
From: Dmitry Baryshkov @ 2022-02-10  9:50 UTC (permalink / raw)
  To: Qing Wang, Rob Clark, Sean Paul, David Airlie, Daniel Vetter,
	linux-arm-msm, dri-devel, freedreno, linux-kernel

On 10/02/2022 01:17, Dmitry Baryshkov wrote:
> On 09/02/2022 11:37, Qing Wang wrote:
>> From: Wang Qing <wangqing@vivo.com>
>>
>> do_div() does a 64-by-32 division.
>> When the divisor is u64, do_div() truncates it to 32 bits, this means it
>> can test non-zero and be truncated to zero for division.
>>
>> fix do_div.cocci warning:
>> do_div() does a 64-by-32 division, please consider using div64_u64 
>> instead.
>>
>> Signed-off-by: Wang Qing <wangqing@vivo.com>
> 
> Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

After rechecking, I'd like to withdraw my R-B tag (Minecrell, thanks for 
pointing this out!)

The div64_u64 is not equivalent to do_div. It returns the quotient 
rather than modifying the first arg. Moreover it is unoptimal on 32-bit 
arches.

I'd suggest changing the math to remove multiplications by 1000 and 
10000 before division. Or just ignoring this at all, judging from the 
fact that these values are used only for tracing rather than actual 
calculations.

> 
>> ---
>>   drivers/gpu/drm/msm/msm_gpu.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/gpu/drm/msm/msm_gpu.c 
>> b/drivers/gpu/drm/msm/msm_gpu.c
>> index 2c1049c..aa4617b
>> --- a/drivers/gpu/drm/msm/msm_gpu.c
>> +++ b/drivers/gpu/drm/msm/msm_gpu.c
>> @@ -648,7 +648,7 @@ static void retire_submit(struct msm_gpu *gpu, 
>> struct msm_ringbuffer *ring,
>>       /* Calculate the clock frequency from the number of CP cycles */
>>       if (elapsed) {
>>           clock = (stats->cpcycles_end - stats->cpcycles_start) * 1000;
>> -        do_div(clock, elapsed);
>> +        div64_u64(clock, elapsed);
>>       }
>>       trace_msm_gpu_submit_retired(submit, elapsed, clock,
> 
> 


-- 
With best wishes
Dmitry

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-02-10  9:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-09  8:37 [PATCH] gpu: drm: msm: use div64_u64() instead of do_div() Qing Wang
2022-02-09 22:17 ` Dmitry Baryshkov
2022-02-10  9:50   ` Dmitry Baryshkov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).