Re: [PATCH v2 1/2] perf bench: Fix initialization of union
From: James Clark
Date: Thu Feb 19 2026 - 05:39:49 EST
On 19/02/2026 10:36 am, James Clark wrote:
On 19/02/2026 12:44 am, Namhyung Kim wrote:
Recent compilers don't initialize all members (or the largest member) in
an union. Instead it seems to set the first member only. So some perf
bench output shows invalid numbers like below on my system with GCC 15.
I couldn't find V1 of this so I wasn't sure if it was discussed already, but wasn't the plan to fix this with a compiler option:
https://lore.kernel.org/linux-perf-users/20250319110454.3230687-1- leo.yan@xxxxxxx/
and
https://lore.kernel.org/linux-perf-users/20250320105235.3498106-1- leo.yan@xxxxxxx/
Oh I see V1 was only the second patch, that's why I couldn't find it.
Before:
$ perf bench mem mmap
# Running 'mem/mmap' benchmark:
# function 'demand' (Demand loaded mmap())
# Copying 1MB bytes ...
0.011127 bytes/sec
# function 'populate' (Eagerly populated mmap())
# Copying 1MB bytes ...
0.011127 bytes/sec
After:
$ perf bench mem mmap
# Running 'mem/mmap' benchmark:
# function 'demand' (Demand loaded mmap())
# Copying 1MB bytes ...
2.209417 GB/sec
# function 'populate' (Eagerly populated mmap())
# Copying 1MB bytes ...
7.875504 GB/sec
Because the first member of bench_clock is u64 ('cycles'), the default
struct timeval wasn't fully initialized. Let's use memset to reset the
whole memory.
Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>
---
tools/perf/bench/mem-functions.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/tools/perf/bench/mem-functions.c b/tools/perf/bench/mem- functions.c
index 2908a3a796c932d0..676c8d18f4c2e259 100644
--- a/tools/perf/bench/mem-functions.c
+++ b/tools/perf/bench/mem-functions.c
@@ -193,9 +193,10 @@ static void __bench_mem_function(struct bench_mem_info *info, struct bench_param
{
const struct function *r = &info->functions[r_idx];
double result_bps = 0.0;
- union bench_clock rt = { 0 };
+ union bench_clock rt;
void *src = NULL, *dst = NULL;
+ memset(&rt, 0, sizeof(rt));
printf("# function '%s' (%s)\n", r->name, r->desc);
if (r->fn.init && r->fn.init(info, p, &src, &dst))