[PATCH v2 1/2] perf bench: Fix initialization of union

From: Namhyung Kim

Date: Wed Feb 18 2026 - 19:44:35 EST


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.

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))
--
2.53.0.335.g19a08e0c02-goog