Merge tag 'pinctrl-for-3.7-late' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-3.10.git] / crypto / xor.c
index 8281ac5..65c7b41 100644 (file)
 
 #define BH_TRACE 0
 #include <linux/module.h>
-#include <linux/raid/md.h>
+#include <linux/gfp.h>
 #include <linux/raid/xor.h>
+#include <linux/jiffies.h>
+#include <linux/preempt.h>
 #include <asm/xor.h>
 
 /* The xor routines to use.  */
 static struct xor_block_template *active_template;
 
 void
-xor_blocks(unsigned int count, unsigned int bytes, void **ptr)
+xor_blocks(unsigned int src_count, unsigned int bytes, void *dest, void **srcs)
 {
-       unsigned long *p0, *p1, *p2, *p3, *p4;
+       unsigned long *p1, *p2, *p3, *p4;
 
-       p0 = (unsigned long *) ptr[0];
-       p1 = (unsigned long *) ptr[1];
-       if (count == 2) {
-               active_template->do_2(bytes, p0, p1);
+       p1 = (unsigned long *) srcs[0];
+       if (src_count == 1) {
+               active_template->do_2(bytes, dest, p1);
                return;
        }
 
-       p2 = (unsigned long *) ptr[2];
-       if (count == 3) {
-               active_template->do_3(bytes, p0, p1, p2);
+       p2 = (unsigned long *) srcs[1];
+       if (src_count == 2) {
+               active_template->do_3(bytes, dest, p1, p2);
                return;
        }
 
-       p3 = (unsigned long *) ptr[3];
-       if (count == 4) {
-               active_template->do_4(bytes, p0, p1, p2, p3);
+       p3 = (unsigned long *) srcs[2];
+       if (src_count == 3) {
+               active_template->do_4(bytes, dest, p1, p2, p3);
                return;
        }
 
-       p4 = (unsigned long *) ptr[4];
-       active_template->do_5(bytes, p0, p1, p2, p3, p4);
+       p4 = (unsigned long *) srcs[3];
+       active_template->do_5(bytes, dest, p1, p2, p3, p4);
 }
 EXPORT_SYMBOL(xor_blocks);
 
@@ -63,12 +64,14 @@ static void
 do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
 {
        int speed;
-       unsigned long now;
+       unsigned long now, j;
        int i, count, max;
 
        tmpl->next = template_list;
        template_list = tmpl;
 
+       preempt_disable();
+
        /*
         * Count the number of XORs done during a whole jiffy, and use
         * this to calculate the speed of checksumming.  We use a 2-page
@@ -76,9 +79,11 @@ do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
         */
        max = 0;
        for (i = 0; i < 5; i++) {
-               now = jiffies;
+               j = jiffies;
                count = 0;
-               while (jiffies == now) {
+               while ((now = jiffies) == j)
+                       cpu_relax();
+               while (time_before(jiffies, now + 1)) {
                        mb(); /* prevent loop optimzation */
                        tmpl->do_2(BENCH_SIZE, b1, b2);
                        mb();
@@ -89,6 +94,8 @@ do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
                        max = count;
        }
 
+       preempt_enable();
+
        speed = max * (HZ * BENCH_SIZE / 1024);
        tmpl->speed = speed;
 
@@ -102,7 +109,12 @@ calibrate_xor_blocks(void)
        void *b1, *b2;
        struct xor_block_template *f, *fastest;
 
-       b1 = (void *) __get_free_pages(GFP_KERNEL, 2);
+       /*
+        * Note: Since the memory is not actually used for _anything_ but to
+        * test the XOR speed, we don't really want kmemcheck to warn about
+        * reading uninitialized bytes here.
+        */
+       b1 = (void *) __get_free_pages(GFP_KERNEL | __GFP_NOTRACK, 2);
        if (!b1) {
                printk(KERN_WARNING "xor: Yikes!  No memory available.\n");
                return -ENOMEM;
@@ -124,11 +136,11 @@ calibrate_xor_blocks(void)
 
        if (fastest) {
                printk(KERN_INFO "xor: automatically using best "
-                       "checksumming function: %s\n",
-                       fastest->name);
+                                "checksumming function:\n");
                xor_speed(fastest);
+               goto out;
        } else {
-               printk(KERN_INFO "xor: measuring checksumming speed\n");
+               printk(KERN_INFO "xor: measuring software checksum speed\n");
                XOR_TRY_TEMPLATES;
                fastest = template_list;
                for (f = fastest; f; f = f->next)
@@ -141,6 +153,7 @@ calibrate_xor_blocks(void)
 
 #undef xor_speed
 
+ out:
        free_pages((unsigned long)b1, 2);
 
        active_template = fastest;