diff options
| author | Jim Kukunas <james.t.kukunas@linux.intel.com> | 2012-05-21 23:54:23 -0400 |
|---|---|---|
| committer | NeilBrown <neilb@suse.de> | 2012-05-21 23:54:23 -0400 |
| commit | 2dbf708448c836754d25fe6108c5bfe1f5697c95 (patch) | |
| tree | e66440e324014436704192e8a8f6549b8637fd03 /lib | |
| parent | 048a8b8c89dc427dd7a58527c8923224b1e66d83 (diff) | |
lib/raid6: update test program for recovery functions
Test each combination of recovery and syndrome generation
functions.
Signed-off-by: Jim Kukunas <james.t.kukunas@linux.intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/raid6/test/Makefile | 2 | ||||
| -rw-r--r-- | lib/raid6/test/test.c | 32 | ||||
| -rw-r--r-- | lib/raid6/x86.h | 15 |
3 files changed, 32 insertions, 17 deletions
diff --git a/lib/raid6/test/Makefile b/lib/raid6/test/Makefile index aa651697b6d..c76151d9476 100644 --- a/lib/raid6/test/Makefile +++ b/lib/raid6/test/Makefile | |||
| @@ -23,7 +23,7 @@ RANLIB = ranlib | |||
| 23 | all: raid6.a raid6test | 23 | all: raid6.a raid6test |
| 24 | 24 | ||
| 25 | raid6.a: int1.o int2.o int4.o int8.o int16.o int32.o mmx.o sse1.o sse2.o \ | 25 | raid6.a: int1.o int2.o int4.o int8.o int16.o int32.o mmx.o sse1.o sse2.o \ |
| 26 | altivec1.o altivec2.o altivec4.o altivec8.o recov.o algos.o \ | 26 | altivec1.o altivec2.o altivec4.o altivec8.o recov.o recov_ssse3.o algos.o \ |
| 27 | tables.o | 27 | tables.o |
| 28 | rm -f $@ | 28 | rm -f $@ |
| 29 | $(AR) cq $@ $^ | 29 | $(AR) cq $@ $^ |
diff --git a/lib/raid6/test/test.c b/lib/raid6/test/test.c index 7a930318b17..5a485b7a7d3 100644 --- a/lib/raid6/test/test.c +++ b/lib/raid6/test/test.c | |||
| @@ -90,25 +90,35 @@ static int test_disks(int i, int j) | |||
| 90 | int main(int argc, char *argv[]) | 90 | int main(int argc, char *argv[]) |
| 91 | { | 91 | { |
| 92 | const struct raid6_calls *const *algo; | 92 | const struct raid6_calls *const *algo; |
| 93 | const struct raid6_recov_calls *const *ra; | ||
| 93 | int i, j; | 94 | int i, j; |
| 94 | int err = 0; | 95 | int err = 0; |
| 95 | 96 | ||
| 96 | makedata(); | 97 | makedata(); |
| 97 | 98 | ||
| 98 | for (algo = raid6_algos; *algo; algo++) { | 99 | for (ra = raid6_recov_algos; *ra; ra++) { |
| 99 | if (!(*algo)->valid || (*algo)->valid()) { | 100 | if ((*ra)->valid && !(*ra)->valid()) |
| 100 | raid6_call = **algo; | 101 | continue; |
| 102 | raid6_2data_recov = (*ra)->data2; | ||
| 103 | raid6_datap_recov = (*ra)->datap; | ||
| 101 | 104 | ||
| 102 | /* Nuke syndromes */ | 105 | printf("using recovery %s\n", (*ra)->name); |
| 103 | memset(data[NDISKS-2], 0xee, 2*PAGE_SIZE); | ||
| 104 | 106 | ||
| 105 | /* Generate assumed good syndrome */ | 107 | for (algo = raid6_algos; *algo; algo++) { |
| 106 | raid6_call.gen_syndrome(NDISKS, PAGE_SIZE, | 108 | if (!(*algo)->valid || (*algo)->valid()) { |
| 107 | (void **)&dataptrs); | 109 | raid6_call = **algo; |
| 108 | 110 | ||
| 109 | for (i = 0; i < NDISKS-1; i++) | 111 | /* Nuke syndromes */ |
| 110 | for (j = i+1; j < NDISKS; j++) | 112 | memset(data[NDISKS-2], 0xee, 2*PAGE_SIZE); |
| 111 | err += test_disks(i, j); | 113 | |
| 114 | /* Generate assumed good syndrome */ | ||
| 115 | raid6_call.gen_syndrome(NDISKS, PAGE_SIZE, | ||
| 116 | (void **)&dataptrs); | ||
| 117 | |||
| 118 | for (i = 0; i < NDISKS-1; i++) | ||
| 119 | for (j = i+1; j < NDISKS; j++) | ||
| 120 | err += test_disks(i, j); | ||
| 121 | } | ||
| 112 | } | 122 | } |
| 113 | printf("\n"); | 123 | printf("\n"); |
| 114 | } | 124 | } |
diff --git a/lib/raid6/x86.h b/lib/raid6/x86.h index cb2a8c91c88..d55d63232c5 100644 --- a/lib/raid6/x86.h +++ b/lib/raid6/x86.h | |||
| @@ -35,24 +35,29 @@ static inline void kernel_fpu_end(void) | |||
| 35 | { | 35 | { |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | #define __aligned(x) __attribute__((aligned(x))) | ||
| 39 | |||
| 38 | #define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ | 40 | #define X86_FEATURE_MMX (0*32+23) /* Multimedia Extensions */ |
| 39 | #define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions | 41 | #define X86_FEATURE_FXSR (0*32+24) /* FXSAVE and FXRSTOR instructions |
| 40 | * (fast save and restore) */ | 42 | * (fast save and restore) */ |
| 41 | #define X86_FEATURE_XMM (0*32+25) /* Streaming SIMD Extensions */ | 43 | #define X86_FEATURE_XMM (0*32+25) /* Streaming SIMD Extensions */ |
| 42 | #define X86_FEATURE_XMM2 (0*32+26) /* Streaming SIMD Extensions-2 */ | 44 | #define X86_FEATURE_XMM2 (0*32+26) /* Streaming SIMD Extensions-2 */ |
| 45 | #define X86_FEATURE_XMM3 (4*32+ 0) /* "pni" SSE-3 */ | ||
| 46 | #define X86_FEATURE_SSSE3 (4*32+ 9) /* Supplemental SSE-3 */ | ||
| 47 | #define X86_FEATURE_AVX (4*32+28) /* Advanced Vector Extensions */ | ||
| 43 | #define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ | 48 | #define X86_FEATURE_MMXEXT (1*32+22) /* AMD MMX extensions */ |
| 44 | 49 | ||
| 45 | /* Should work well enough on modern CPUs for testing */ | 50 | /* Should work well enough on modern CPUs for testing */ |
| 46 | static inline int boot_cpu_has(int flag) | 51 | static inline int boot_cpu_has(int flag) |
| 47 | { | 52 | { |
| 48 | u32 eax = (flag >> 5) ? 0x80000001 : 1; | 53 | u32 eax = (flag & 0x20) ? 0x80000001 : 1; |
| 49 | u32 edx; | 54 | u32 ecx, edx; |
| 50 | 55 | ||
| 51 | asm volatile("cpuid" | 56 | asm volatile("cpuid" |
| 52 | : "+a" (eax), "=d" (edx) | 57 | : "+a" (eax), "=d" (edx), "=c" (ecx) |
| 53 | : : "ecx", "ebx"); | 58 | : : "ebx"); |
| 54 | 59 | ||
| 55 | return (edx >> (flag & 31)) & 1; | 60 | return ((flag & 0x80 ? ecx : edx) >> (flag & 31)) & 1; |
| 56 | } | 61 | } |
| 57 | 62 | ||
| 58 | #endif /* ndef __KERNEL__ */ | 63 | #endif /* ndef __KERNEL__ */ |
