2024-03-18 10:54:38

by Thorsten Blum

[permalink] [raw]
Subject: [PATCH] tracing: Explicitly cast divisor to fix Coccinelle warning

Explicitly cast the divisor to u32 to fix a Coccinelle/coccicheck warning
reported by do_div.cocci.

Signed-off-by: Thorsten Blum <[email protected]>
---
kernel/trace/trace_benchmark.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/trace/trace_benchmark.c b/kernel/trace/trace_benchmark.c
index 54d5fa35c90a..218b40050629 100644
--- a/kernel/trace/trace_benchmark.c
+++ b/kernel/trace/trace_benchmark.c
@@ -105,7 +105,7 @@ static void trace_do_benchmark(void)
stddev = 0;

delta = bm_total;
- do_div(delta, bm_cnt);
+ do_div(delta, (u32)bm_cnt);
avg = delta;

if (stddev > 0) {
--
2.44.0



2024-03-20 10:31:12

by Masami Hiramatsu

[permalink] [raw]
Subject: Re: [PATCH] tracing: Explicitly cast divisor to fix Coccinelle warning

On Mon, 18 Mar 2024 11:52:44 +0100
Thorsten Blum <[email protected]> wrote:

> Explicitly cast the divisor to u32 to fix a Coccinelle/coccicheck warning
> reported by do_div.cocci.
>

Hmm, strange, trace_do_benchmark() has another do_div(u64, u64).

do {
last_seed = seed;
seed = stddev;
if (!last_seed)
break;
do_div(seed, last_seed);
seed += last_seed;
do_div(seed, 2);
} while (i++ < 10 && last_seed != seed);

Didn't Coccinelle find that?

Thank you,

> Signed-off-by: Thorsten Blum <[email protected]>
> ---
> kernel/trace/trace_benchmark.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel/trace/trace_benchmark.c b/kernel/trace/trace_benchmark.c
> index 54d5fa35c90a..218b40050629 100644
> --- a/kernel/trace/trace_benchmark.c
> +++ b/kernel/trace/trace_benchmark.c
> @@ -105,7 +105,7 @@ static void trace_do_benchmark(void)
> stddev = 0;
>
> delta = bm_total;
> - do_div(delta, bm_cnt);
> + do_div(delta, (u32)bm_cnt);
> avg = delta;
>
> if (stddev > 0) {
> --
> 2.44.0
>


--
Masami Hiramatsu (Google) <[email protected]>

2024-03-20 16:30:20

by Thorsten Blum

[permalink] [raw]
Subject: Re: [PATCH] tracing: Explicitly cast divisor to fix Coccinelle warning

On 20. Mar 2024, at 16:01, Thorsten Blum <[email protected]> wrote:
>
> Coccinelle also finds this one, but please ignore this patch as I just realized
> this was already fixed in another patch of mine from February.
>
> Sorry for the inconvenience.
>
> Link: https://lore.kernel.org/linux-kernel/[email protected]/

Actually, I will submit a new patch to revert

delta = div64_u64(delta, bm_cnt);

back to

do_div(delta, bm_cnt);

but this time include an explicit cast to u32

do_div(delta, (u32)bm_cnt);

to remove the Coccinelle warning reported by do_div.cocci and to improve
performance.

The do_div() macro does a 64-by-32 division which is faster than the 64-by-64
division done by div64_u64(). Casting the divisor bm_cnt to u32 is safe since
we return early from trace_do_benchmark() if bm_cnt > UINT_MAX (something I
missed in d6cb38e10810).

This approach is already used when calculating the standard deviation:

do_div(stddev, (u32)bm_cnt);
do_div(stddev, (u32)bm_cnt - 1);

Thanks,
Thorsten

2024-03-20 15:10:25

by Thorsten Blum

[permalink] [raw]
Subject: Re: [PATCH] tracing: Explicitly cast divisor to fix Coccinelle warning

On 20. Mar 2024, at 11:27, Masami Hiramatsu (Google) <[email protected]> wrote:
>
> Hmm, strange, trace_do_benchmark() has another do_div(u64, u64).
>
> do {
> last_seed = seed;
> seed = stddev;
> if (!last_seed)
> break;
> do_div(seed, last_seed);
> seed += last_seed;
> do_div(seed, 2);
> } while (i++ < 10 && last_seed != seed);
>
> Didn't Coccinelle find that?

Coccinelle also finds this one, but please ignore this patch as I just realized
this was already fixed in another patch of mine from February.

Sorry for the inconvenience.

Link: https://lore.kernel.org/linux-kernel/[email protected]/