diff options
author | Mark Johnston <[email protected]> | 2021-08-23 14:10:17 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2021-08-23 11:10:17 -0700 |
commit | 3ee9a997a34dea4f9b509ac3e45085929b068008 (patch) | |
tree | d6d1c13105f1d161e1d2362051415b1c29e3ff0b | |
parent | 8ae86e2edc736483c1530fd689525aa2460eaec8 (diff) |
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 <[email protected]>
Signed-off-by: Mark Johnston <[email protected]>
Closes #12473
-rw-r--r-- | module/zfs/vdev_raidz_math.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/module/zfs/vdev_raidz_math.c b/module/zfs/vdev_raidz_math.c index 138b7dac5..03df2df5a 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); |