From 3ee9a997a34dea4f9b509ac3e45085929b068008 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Mon, 23 Aug 2021 14:10:17 -0400 Subject: [PATCH] Initialize parity blocks before RAID-Z reconstruction benchmarking benchmark_raidz() allocates a row to benchmark parity calculation and reconstruction. In the latter case, the parity blocks are left uninitialized, leading to reports from KMSAN. Initialize parity blocks to 0xAA as we do for the data earlier in the function. This does not affect the selected RAID-Z implementation on any of several systems tested. Reviewed-by: Brian Behlendorf Signed-off-by: Mark Johnston Closes #12473 --- module/zfs/vdev_raidz_math.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/module/zfs/vdev_raidz_math.c b/module/zfs/vdev_raidz_math.c index 138b7dac5956..03df2df5adaf 100644 --- a/module/zfs/vdev_raidz_math.c +++ b/module/zfs/vdev_raidz_math.c @@ -465,6 +465,7 @@ benchmark_raidz(void) raidz_supp_impl_cnt = c; /* number of supported impl */ #if defined(_KERNEL) + abd_t *pabd; zio_t *bench_zio = NULL; raidz_map_t *bench_rm = NULL; uint64_t bench_parity; @@ -492,6 +493,12 @@ benchmark_raidz(void) bench_rm = vdev_raidz_map_alloc(bench_zio, SPA_MINBLOCKSHIFT, BENCH_COLS, PARITY_PQR); + /* Ensure that fake parity blocks are initialized */ + for (c = 0; c < bench_rm->rm_row[0]->rr_firstdatacol; c++) { + pabd = bench_rm->rm_row[0]->rr_col[c].rc_abd; + memset(abd_to_buf(pabd), 0xAA, abd_get_size(pabd)); + } + for (int fn = 0; fn < RAIDZ_REC_NUM; fn++) benchmark_raidz_impl(bench_rm, fn, benchmark_rec_impl);