VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / md / xor.c
index e2103a8..324897c 100644 (file)
@@ -108,29 +108,40 @@ calibrate_xor_block(void)
        }
        b2 = b1 + 2*PAGE_SIZE + BENCH_SIZE;
 
-       printk(KERN_INFO "raid5: measuring checksumming speed\n");
+       /*
+        * If this arch/cpu has a short-circuited selection, don't loop through all
+        * the possible functions, just test the best one
+        */
+
+       fastest = NULL;
+
+#ifdef XOR_SELECT_TEMPLATE
+               fastest = XOR_SELECT_TEMPLATE(fastest);
+#endif
 
 #define xor_speed(templ)       do_xor_speed((templ), b1, b2)
 
-       XOR_TRY_TEMPLATES;
+       if (fastest) {
+               printk(KERN_INFO "raid5: automatically using best checksumming function: %s\n",
+                       fastest->name);
+               xor_speed(fastest);
+       } else {
+               printk(KERN_INFO "raid5: measuring checksumming speed\n");
+               XOR_TRY_TEMPLATES;
+               fastest = template_list;
+               for (f = fastest; f; f = f->next)
+                       if (f->speed > fastest->speed)
+                               fastest = f;
+       }
+
+       printk("raid5: using function: %s (%d.%03d MB/sec)\n",
+              fastest->name, fastest->speed / 1000, fastest->speed % 1000);
 
 #undef xor_speed
 
        free_pages((unsigned long)b1, 2);
 
-       fastest = template_list;
-       for (f = fastest; f; f = f->next)
-               if (f->speed > fastest->speed)
-                       fastest = f;
-
-#ifdef XOR_SELECT_TEMPLATE
-       fastest = XOR_SELECT_TEMPLATE(fastest);
-#endif
-
        active_template = fastest;
-       printk("raid5: using function: %s (%d.%03d MB/sec)\n",
-              fastest->name, fastest->speed / 1000, fastest->speed % 1000);
-
        return 0;
 }