lib/raid6: update test program for recovery functions
authorJim Kukunas <james.t.kukunas@linux.intel.com>
Tue, 22 May 2012 03:54:23 +0000 (13:54 +1000)
committerNeilBrown <neilb@suse.de>
Tue, 22 May 2012 03:54:23 +0000 (13:54 +1000)
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>
lib/raid6/test/Makefile
lib/raid6/test/test.c
lib/raid6/x86.h

index aa651697b6dcee47f8378d07a65ef5df186b4cf9..c76151d94764dec2965dbc20b0e4cdb1a03b5408 100644 (file)
@@ -23,7 +23,7 @@ RANLIB         = ranlib
 all:   raid6.a raid6test
 
 raid6.a: int1.o int2.o int4.o int8.o int16.o int32.o mmx.o sse1.o sse2.o \
-        altivec1.o altivec2.o altivec4.o altivec8.o recov.o algos.o \
+        altivec1.o altivec2.o altivec4.o altivec8.o recov.o recov_ssse3.o algos.o \
         tables.o
         rm -f $@
         $(AR) cq $@ $^
index 7a930318b17d60c406bb1d421ba406c0f3bcb139..5a485b7a7d3c3f8004924f638ad9db77b35ebf5c 100644 (file)
@@ -90,25 +90,35 @@ static int test_disks(int i, int j)
 int main(int argc, char *argv[])
 {
        const struct raid6_calls *const *algo;
+       const struct raid6_recov_calls *const *ra;
        int i, j;
        int err = 0;
 
        makedata();
 
-       for (algo = raid6_algos; *algo; algo++) {
-               if (!(*algo)->valid || (*algo)->valid()) {
-                       raid6_call = **algo;
+       for (ra = raid6_recov_algos; *ra; ra++) {
+               if ((*ra)->valid  && !(*ra)->valid())
+                       continue;
+               raid6_2data_recov = (*ra)->data2;
+               raid6_datap_recov = (*ra)->datap;
 
-                       /* Nuke syndromes */
-                       memset(data[NDISKS-2], 0xee, 2*PAGE_SIZE);
+               printf("using recovery %s\n", (*ra)->name);
 
-                       /* Generate assumed good syndrome */
-                       raid6_call.gen_syndrome(NDISKS, PAGE_SIZE,
-                                               (void **)&dataptrs);
+               for (algo = raid6_algos; *algo; algo++) {
+                       if (!(*algo)->valid || (*algo)->valid()) {
+                               raid6_call = **algo;
 
-                       for (i = 0; i < NDISKS-1; i++)
-                               for (j = i+1; j < NDISKS; j++)
-                                       err += test_disks(i, j);
+                               /* Nuke syndromes */
+                               memset(data[NDISKS-2], 0xee, 2*PAGE_SIZE);
+
+                               /* Generate assumed good syndrome */
+                               raid6_call.gen_syndrome(NDISKS, PAGE_SIZE,
+                                                       (void **)&dataptrs);
+
+                               for (i = 0; i < NDISKS-1; i++)
+                                       for (j = i+1; j < NDISKS; j++)
+                                               err += test_disks(i, j);
+                       }
                }
                printf("\n");
        }
index cb2a8c91c886a6c4ca5f6ebc3aec4d4e0f447258..d55d63232c55e1fa3ac77d7d443d3bddfd94c406 100644 (file)
@@ -35,24 +35,29 @@ static inline void kernel_fpu_end(void)
 {
 }
 
+#define __aligned(x) __attribute__((aligned(x)))
+
 #define X86_FEATURE_MMX                (0*32+23) /* Multimedia Extensions */
 #define X86_FEATURE_FXSR       (0*32+24) /* FXSAVE and FXRSTOR instructions
                                           * (fast save and restore) */
 #define X86_FEATURE_XMM                (0*32+25) /* Streaming SIMD Extensions */
 #define X86_FEATURE_XMM2       (0*32+26) /* Streaming SIMD Extensions-2 */
+#define X86_FEATURE_XMM3       (4*32+ 0) /* "pni" SSE-3 */
+#define X86_FEATURE_SSSE3      (4*32+ 9) /* Supplemental SSE-3 */
+#define X86_FEATURE_AVX        (4*32+28) /* Advanced Vector Extensions */
 #define X86_FEATURE_MMXEXT     (1*32+22) /* AMD MMX extensions */
 
 /* Should work well enough on modern CPUs for testing */
 static inline int boot_cpu_has(int flag)
 {
-       u32 eax = (flag >> 5) ? 0x80000001 : 1;
-       u32 edx;
+       u32 eax = (flag & 0x20) ? 0x80000001 : 1;
+       u32 ecx, edx;
 
        asm volatile("cpuid"
-                    : "+a" (eax), "=d" (edx)
-                    : : "ecx", "ebx");
+                    : "+a" (eax), "=d" (edx), "=c" (ecx)
+                    : : "ebx");
 
-       return (edx >> (flag & 31)) & 1;
+       return ((flag & 0x80 ? ecx : edx) >> (flag & 31)) & 1;
 }
 
 #endif /* ndef __KERNEL__ */