From 2016d7fb9c87a4c628c388bf0d1bf1848abbae67 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 25d76970e9..2ce0dc5cc7 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);