mirror of
https://github.com/amadvance/snapraid.git
synced 2026-10-26 10:51:54 -04:00
Extend the RAID regression test to detect unset parity
This commit is contained in:
parent
f9a1370b42
commit
00d272a8b9
1 changed files with 105 additions and 85 deletions
190
raid/test.c
190
raid/test.c
|
|
@ -31,6 +31,15 @@ static int ipow(int n, int r)
|
|||
return v;
|
||||
}
|
||||
|
||||
static void meminc(void *dst, size_t size)
|
||||
{
|
||||
size_t i;
|
||||
unsigned char *p = dst;
|
||||
|
||||
for (i = 0; i < size; ++i)
|
||||
++p[i];
|
||||
}
|
||||
|
||||
int raid_test_combo(void)
|
||||
{
|
||||
int r;
|
||||
|
|
@ -132,10 +141,11 @@ int raid_test_sort(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#define test_setup(i) f[i - 1][nf[i - 1]++]
|
||||
|
||||
int raid_test_rec(int mode, int nd, size_t size)
|
||||
{
|
||||
void (*f[RAID_PARITY_MAX][128])(
|
||||
int nr, int *id, int *ip, int nd, size_t size, void **vbuf);
|
||||
void (*f[RAID_PARITY_MAX][32])(int nr, int *id, int *ip, int nd, size_t size, void **vbuf);
|
||||
void *v_alloc;
|
||||
void **v;
|
||||
void **data;
|
||||
|
|
@ -183,91 +193,94 @@ int raid_test_rec(int mode, int nd, size_t size)
|
|||
/* fill with pseudo-random data with the arbitrary seed "1" */
|
||||
raid_mrand_vector(1, nd, size, v);
|
||||
|
||||
/* setup recov functions */
|
||||
for (i = 0; i < np; ++i) {
|
||||
/* counters of functions for each parity level */
|
||||
for (i = 0; i < np; ++i)
|
||||
nf[i] = 0;
|
||||
if (i == 0) {
|
||||
f[i][nf[i]++] = raid_rec1_int8;
|
||||
|
||||
/* setup recov functions */
|
||||
for (i = 1; i <= np; ++i) {
|
||||
if (i == 1) {
|
||||
test_setup(i) = raid_rec1_int8;
|
||||
#ifdef CONFIG_X86
|
||||
#ifdef CONFIG_SSSE3
|
||||
if (raid_cpu_has_ssse3())
|
||||
f[i][nf[i]++] = raid_rec1_ssse3;
|
||||
test_setup(i) = raid_rec1_ssse3;
|
||||
#endif
|
||||
#ifdef CONFIG_AVX2
|
||||
if (raid_cpu_has_avx2())
|
||||
f[i][nf[i]++] = raid_rec1_avx2;
|
||||
test_setup(i) = raid_rec1_avx2;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_X86_64
|
||||
#ifdef CONFIG_AVX512BW
|
||||
if (raid_cpu_has_avx512bw())
|
||||
f[i][nf[i]++] = raid_rec1_avx512bw;
|
||||
test_setup(i) = raid_rec1_avx512bw;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_RAID_AES
|
||||
#ifdef CONFIG_AVX2GFNI
|
||||
if (raid_cpu_has_avx2gfni())
|
||||
f[i][nf[i]++] = raid_rec1_avx2gfni;
|
||||
test_setup(i) = raid_rec1_avx2gfni;
|
||||
#endif
|
||||
#ifdef CONFIG_AVX512GFNI
|
||||
if (raid_cpu_has_avx512gfni())
|
||||
f[i][nf[i]++] = raid_rec1_avx512gfni;
|
||||
test_setup(i) = raid_rec1_avx512gfni;
|
||||
#endif
|
||||
#endif
|
||||
} else if (i == 1) {
|
||||
f[i][nf[i]++] = raid_rec2_int8;
|
||||
} else if (i == 2) {
|
||||
test_setup(i) = raid_rec2_int8;
|
||||
#ifdef CONFIG_X86
|
||||
#ifdef CONFIG_SSSE3
|
||||
if (raid_cpu_has_ssse3())
|
||||
f[i][nf[i]++] = raid_rec2_ssse3;
|
||||
test_setup(i) = raid_rec2_ssse3;
|
||||
#endif
|
||||
#ifdef CONFIG_AVX2
|
||||
if (raid_cpu_has_avx2())
|
||||
f[i][nf[i]++] = raid_rec2_avx2;
|
||||
test_setup(i) = raid_rec2_avx2;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_X86_64
|
||||
#ifdef CONFIG_AVX512BW
|
||||
if (raid_cpu_has_avx512bw())
|
||||
f[i][nf[i]++] = raid_rec2_avx512bw;
|
||||
test_setup(i) = raid_rec2_avx512bw;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_RAID_AES
|
||||
#ifdef CONFIG_AVX2GFNI
|
||||
if (raid_cpu_has_avx2gfni())
|
||||
f[i][nf[i]++] = raid_rec2_avx2gfni;
|
||||
test_setup(i) = raid_rec2_avx2gfni;
|
||||
#endif
|
||||
#ifdef CONFIG_AVX512GFNI
|
||||
if (raid_cpu_has_avx512gfni())
|
||||
f[i][nf[i]++] = raid_rec2_avx512gfni;
|
||||
test_setup(i) = raid_rec2_avx512gfni;
|
||||
#endif
|
||||
#endif
|
||||
} else {
|
||||
f[i][nf[i]++] = raid_recX_int8;
|
||||
test_setup(i) = raid_recX_int8;
|
||||
#ifdef CONFIG_X86
|
||||
#ifdef CONFIG_SSSE3
|
||||
if (raid_cpu_has_ssse3())
|
||||
f[i][nf[i]++] = raid_recX_ssse3;
|
||||
test_setup(i) = raid_recX_ssse3;
|
||||
#endif
|
||||
#ifdef CONFIG_AVX2
|
||||
if (raid_cpu_has_avx2())
|
||||
f[i][nf[i]++] = raid_recX_avx2;
|
||||
test_setup(i) = raid_recX_avx2;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_X86_64
|
||||
#ifdef CONFIG_AVX512BW
|
||||
if (raid_cpu_has_avx512bw())
|
||||
f[i][nf[i]++] = raid_recX_avx512bw;
|
||||
test_setup(i) = raid_recX_avx512bw;
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_RAID_AES
|
||||
#ifdef CONFIG_AVX2GFNI
|
||||
if (raid_cpu_has_avx2gfni())
|
||||
f[i][nf[i]++] = raid_recX_avx2gfni;
|
||||
test_setup(i) = raid_recX_avx2gfni;
|
||||
#endif
|
||||
#ifdef CONFIG_AVX512GFNI
|
||||
if (raid_cpu_has_avx512gfni())
|
||||
f[i][nf[i]++] = raid_recX_avx512gfni;
|
||||
test_setup(i) = raid_recX_avx512gfni;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
|
@ -337,12 +350,12 @@ bail:
|
|||
|
||||
int raid_test_par(int mode, int nd, size_t size)
|
||||
{
|
||||
void (*f[128])(int nd, size_t size, void **vbuf);
|
||||
void (*f[RAID_PARITY_MAX][32])(int nd, size_t size, void **vbuf);
|
||||
void *v_alloc;
|
||||
void **v;
|
||||
int nv;
|
||||
int i, j;
|
||||
int nf;
|
||||
int i, j, k;
|
||||
int nf[RAID_PARITY_MAX];
|
||||
int np;
|
||||
|
||||
raid_mode(mode);
|
||||
|
|
@ -377,72 +390,74 @@ int raid_test_par(int mode, int nd, size_t size)
|
|||
for (i = 0; i < np; ++i)
|
||||
memcpy(v[nd + np + i], v[nd + i], size);
|
||||
|
||||
/* load all the available functions */
|
||||
nf = 0;
|
||||
/* counters of functions for each parity level */
|
||||
for (i = 0; i < np; ++i)
|
||||
nf[i] = 0;
|
||||
|
||||
f[nf++] = raid_gen1_int32;
|
||||
f[nf++] = raid_gen1_int64;
|
||||
f[nf++] = raid_gen2_int32;
|
||||
f[nf++] = raid_gen2_int64;
|
||||
/* setup all the available functions */
|
||||
test_setup(1) = raid_gen1_int32;
|
||||
test_setup(1) = raid_gen1_int64;
|
||||
test_setup(2) = raid_gen2_int32;
|
||||
test_setup(2) = raid_gen2_int64;
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#ifdef CONFIG_SSE2
|
||||
if (raid_cpu_has_sse2()) {
|
||||
f[nf++] = raid_gen1_sse2;
|
||||
f[nf++] = raid_gen2_sse2;
|
||||
test_setup(1) = raid_gen1_sse2;
|
||||
test_setup(2) = raid_gen2_sse2;
|
||||
#ifdef CONFIG_X86_64
|
||||
f[nf++] = raid_gen2_sse2ext;
|
||||
test_setup(2) = raid_gen2_sse2ext;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AVX2
|
||||
if (raid_cpu_has_avx2()) {
|
||||
f[nf++] = raid_gen1_avx2;
|
||||
f[nf++] = raid_gen2_avx2;
|
||||
test_setup(1) = raid_gen1_avx2;
|
||||
test_setup(2) = raid_gen2_avx2;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AVX512BW
|
||||
#ifdef CONFIG_X86_64
|
||||
if (raid_cpu_has_avx512bw()) {
|
||||
f[nf++] = raid_gen1_avx512bw;
|
||||
f[nf++] = raid_gen2_avx512bw;
|
||||
test_setup(1) = raid_gen1_avx512bw;
|
||||
test_setup(2) = raid_gen2_avx512bw;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_RAID_AES
|
||||
#ifdef CONFIG_AVX2GFNI
|
||||
if (raid_cpu_has_avx2gfni()) {
|
||||
f[nf++] = raid_gen2_avx2gfni;
|
||||
test_setup(2) = raid_gen2_avx2gfni;
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_AVX512GFNI
|
||||
if (raid_cpu_has_avx512gfni()) {
|
||||
f[nf++] = raid_gen2_avx512gfni;
|
||||
test_setup(2) = raid_gen2_avx512gfni;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /* CONFIG_X86 */
|
||||
|
||||
if (mode == RAID_MODE_CAUCHY) {
|
||||
f[nf++] = raid_gen3_int8;
|
||||
f[nf++] = raid_gen4_int8;
|
||||
f[nf++] = raid_gen5_int8;
|
||||
f[nf++] = raid_gen6_int8;
|
||||
test_setup(3) = raid_gen3_int8;
|
||||
test_setup(4) = raid_gen4_int8;
|
||||
test_setup(5) = raid_gen5_int8;
|
||||
test_setup(6) = raid_gen6_int8;
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#ifdef CONFIG_SSSE3
|
||||
if (raid_cpu_has_ssse3()) {
|
||||
f[nf++] = raid_gen3_ssse3;
|
||||
f[nf++] = raid_gen4_ssse3;
|
||||
f[nf++] = raid_gen5_ssse3;
|
||||
f[nf++] = raid_gen6_ssse3;
|
||||
test_setup(3) = raid_gen3_ssse3;
|
||||
test_setup(4) = raid_gen4_ssse3;
|
||||
test_setup(5) = raid_gen5_ssse3;
|
||||
test_setup(6) = raid_gen6_ssse3;
|
||||
#ifdef CONFIG_X86_64
|
||||
f[nf++] = raid_gen3_ssse3ext;
|
||||
f[nf++] = raid_gen4_ssse3ext;
|
||||
f[nf++] = raid_gen5_ssse3ext;
|
||||
f[nf++] = raid_gen6_ssse3ext;
|
||||
test_setup(3) = raid_gen3_ssse3ext;
|
||||
test_setup(4) = raid_gen4_ssse3ext;
|
||||
test_setup(5) = raid_gen5_ssse3ext;
|
||||
test_setup(6) = raid_gen6_ssse3ext;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
|
@ -450,10 +465,10 @@ int raid_test_par(int mode, int nd, size_t size)
|
|||
#ifdef CONFIG_AVX2
|
||||
#ifdef CONFIG_X86_64
|
||||
if (raid_cpu_has_avx2()) {
|
||||
f[nf++] = raid_gen3_avx2ext;
|
||||
f[nf++] = raid_gen4_avx2ext;
|
||||
f[nf++] = raid_gen5_avx2ext;
|
||||
f[nf++] = raid_gen6_avx2ext;
|
||||
test_setup(3) = raid_gen3_avx2ext;
|
||||
test_setup(4) = raid_gen4_avx2ext;
|
||||
test_setup(5) = raid_gen5_avx2ext;
|
||||
test_setup(6) = raid_gen6_avx2ext;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -461,43 +476,43 @@ int raid_test_par(int mode, int nd, size_t size)
|
|||
#ifdef CONFIG_AVX512BW
|
||||
#ifdef CONFIG_X86_64
|
||||
if (raid_cpu_has_avx512bw()) {
|
||||
f[nf++] = raid_gen3_avx512bw;
|
||||
f[nf++] = raid_gen4_avx512bw;
|
||||
f[nf++] = raid_gen5_avx512bw;
|
||||
f[nf++] = raid_gen6_avx512bw;
|
||||
test_setup(3) = raid_gen3_avx512bw;
|
||||
test_setup(4) = raid_gen4_avx512bw;
|
||||
test_setup(5) = raid_gen5_avx512bw;
|
||||
test_setup(6) = raid_gen6_avx512bw;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#ifdef USE_RAID_AES
|
||||
#ifdef CONFIG_AVX2GFNI
|
||||
if (raid_cpu_has_avx2gfni()) {
|
||||
f[nf++] = raid_gen3_avx2gfni;
|
||||
f[nf++] = raid_gen4_avx2gfni;
|
||||
f[nf++] = raid_gen5_avx2gfni;
|
||||
f[nf++] = raid_gen6_avx2gfni;
|
||||
test_setup(3) = raid_gen3_avx2gfni;
|
||||
test_setup(4) = raid_gen4_avx2gfni;
|
||||
test_setup(5) = raid_gen5_avx2gfni;
|
||||
test_setup(6) = raid_gen6_avx2gfni;
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_AVX512GFNI
|
||||
if (raid_cpu_has_avx512gfni()) {
|
||||
f[nf++] = raid_gen3_avx512gfni;
|
||||
f[nf++] = raid_gen4_avx512gfni;
|
||||
f[nf++] = raid_gen5_avx512gfni;
|
||||
f[nf++] = raid_gen6_avx512gfni;
|
||||
test_setup(3) = raid_gen3_avx512gfni;
|
||||
test_setup(4) = raid_gen4_avx512gfni;
|
||||
test_setup(5) = raid_gen5_avx512gfni;
|
||||
test_setup(6) = raid_gen6_avx512gfni;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_X86 */
|
||||
} else {
|
||||
f[nf++] = raid_genz_int32;
|
||||
f[nf++] = raid_genz_int64;
|
||||
test_setup(3) = raid_genz_int32;
|
||||
test_setup(3) = raid_genz_int64;
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
#ifdef CONFIG_SSE2
|
||||
if (raid_cpu_has_sse2()) {
|
||||
f[nf++] = raid_genz_sse2;
|
||||
test_setup(3) = raid_genz_sse2;
|
||||
#ifdef CONFIG_X86_64
|
||||
f[nf++] = raid_genz_sse2ext;
|
||||
test_setup(3) = raid_genz_sse2ext;
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
|
@ -505,23 +520,29 @@ int raid_test_par(int mode, int nd, size_t size)
|
|||
#ifdef CONFIG_AVX2
|
||||
#ifdef CONFIG_X86_64
|
||||
if (raid_cpu_has_avx2())
|
||||
f[nf++] = raid_genz_avx2ext;
|
||||
test_setup(3) = raid_genz_avx2ext;
|
||||
#endif
|
||||
#endif
|
||||
#endif /* CONFIG_X86 */
|
||||
}
|
||||
|
||||
/* check all the functions */
|
||||
for (j = 0; j < nf; ++j) {
|
||||
/* compute parity */
|
||||
f[j](nd, size, v);
|
||||
for (k = 0; k < np; ++k) {
|
||||
for (j = 0; j < nf[k]; ++j) {
|
||||
/* change the buffers incrementing all values */
|
||||
for (i = 0; i <= k; ++i)
|
||||
meminc(v[nd + i], size);
|
||||
|
||||
/* check it */
|
||||
for (i = 0; i < np; ++i) {
|
||||
if (memcmp(v[nd + np + i], v[nd + i], size) != 0) {
|
||||
/* LCOV_EXCL_START */
|
||||
goto bail;
|
||||
/* LCOV_EXCL_STOP */
|
||||
/* compute parity */
|
||||
f[k][j](nd, size, v);
|
||||
|
||||
/* check it */
|
||||
for (i = 0; i < np; ++i) {
|
||||
if (memcmp(v[nd + np + i], v[nd + i], size) != 0) {
|
||||
/* LCOV_EXCL_START */
|
||||
goto bail;
|
||||
/* LCOV_EXCL_STOP */
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -537,4 +558,3 @@ bail:
|
|||
return -1;
|
||||
/* LCOV_EXCL_STOP */
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue