linux/crypto/xor.c
<<
>>
Prefs
   1/*
   2 * xor.c : Multiple Devices driver for Linux
   3 *
   4 * Copyright (C) 1996, 1997, 1998, 1999, 2000,
   5 * Ingo Molnar, Matti Aarnio, Jakub Jelinek, Richard Henderson.
   6 *
   7 * Dispatch optimized RAID-5 checksumming functions.
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License as published by
  11 * the Free Software Foundation; either version 2, or (at your option)
  12 * any later version.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * (for example /usr/src/linux/COPYING); if not, write to the Free
  16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17 */
  18
  19#define BH_TRACE 0
  20#include <linux/module.h>
  21#include <linux/gfp.h>
  22#include <linux/raid/xor.h>
  23#include <linux/jiffies.h>
  24#include <linux/preempt.h>
  25#include <asm/xor.h>
  26
  27/* The xor routines to use.  */
  28static struct xor_block_template *active_template;
  29
  30void
  31xor_blocks(unsigned int src_count, unsigned int bytes, void *dest, void **srcs)
  32{
  33        unsigned long *p1, *p2, *p3, *p4;
  34
  35        p1 = (unsigned long *) srcs[0];
  36        if (src_count == 1) {
  37                active_template->do_2(bytes, dest, p1);
  38                return;
  39        }
  40
  41        p2 = (unsigned long *) srcs[1];
  42        if (src_count == 2) {
  43                active_template->do_3(bytes, dest, p1, p2);
  44                return;
  45        }
  46
  47        p3 = (unsigned long *) srcs[2];
  48        if (src_count == 3) {
  49                active_template->do_4(bytes, dest, p1, p2, p3);
  50                return;
  51        }
  52
  53        p4 = (unsigned long *) srcs[3];
  54        active_template->do_5(bytes, dest, p1, p2, p3, p4);
  55}
  56EXPORT_SYMBOL(xor_blocks);
  57
  58/* Set of all registered templates.  */
  59static struct xor_block_template *__initdata template_list;
  60
  61#define BENCH_SIZE (PAGE_SIZE)
  62
  63static void __init
  64do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
  65{
  66        int speed;
  67        unsigned long now, j;
  68        int i, count, max;
  69
  70        tmpl->next = template_list;
  71        template_list = tmpl;
  72
  73        preempt_disable();
  74
  75        /*
  76         * Count the number of XORs done during a whole jiffy, and use
  77         * this to calculate the speed of checksumming.  We use a 2-page
  78         * allocation to have guaranteed color L1-cache layout.
  79         */
  80        max = 0;
  81        for (i = 0; i < 5; i++) {
  82                j = jiffies;
  83                count = 0;
  84                while ((now = jiffies) == j)
  85                        cpu_relax();
  86                while (time_before(jiffies, now + 1)) {
  87                        mb(); /* prevent loop optimzation */
  88                        tmpl->do_2(BENCH_SIZE, b1, b2);
  89                        mb();
  90                        count++;
  91                        mb();
  92                }
  93                if (count > max)
  94                        max = count;
  95        }
  96
  97        preempt_enable();
  98
  99        speed = max * (HZ * BENCH_SIZE / 1024);
 100        tmpl->speed = speed;
 101
 102        printk(KERN_INFO "   %-10s: %5d.%03d MB/sec\n", tmpl->name,
 103               speed / 1000, speed % 1000);
 104}
 105
 106static int __init
 107calibrate_xor_blocks(void)
 108{
 109        void *b1, *b2;
 110        struct xor_block_template *f, *fastest;
 111
 112        /*
 113         * Note: Since the memory is not actually used for _anything_ but to
 114         * test the XOR speed, we don't really want kmemcheck to warn about
 115         * reading uninitialized bytes here.
 116         */
 117        b1 = (void *) __get_free_pages(GFP_KERNEL | __GFP_NOTRACK, 2);
 118        if (!b1) {
 119                printk(KERN_WARNING "xor: Yikes!  No memory available.\n");
 120                return -ENOMEM;
 121        }
 122        b2 = b1 + 2*PAGE_SIZE + BENCH_SIZE;
 123
 124        /*
 125         * If this arch/cpu has a short-circuited selection, don't loop through
 126         * all the possible functions, just test the best one
 127         */
 128
 129        fastest = NULL;
 130
 131#ifdef " id)MPLATrypto/xor.c#L123="L126">" id)MPLATr class="line" name="L131"> 131     ref="crypto/xor.c#L33" i1d="L313ss="sref">j = NULL;
" id)MPLATrypto/xor.c#L123="L126">" id)MPLATr cla>KERN_WARNINGNULL 12/a>      1  unsigned long * 12/     ef="crypto/xor.c#L35" id1="L351 class="line" name="L35">  35<1/a>      1  p1sref">BENCH_SIZE (nam)a> = nam)b2);
  35<1/  97<1/a>      1           > NULL 11/a>      1          return;
KERN_INFO "   %-10s: %5d.%03d MB/sec\n&qu/spanautomf">_href="cef="" id=" id="L120" css="line" name="L119"> 11/       }
mb();
" id="L39<37;5d.%03d MB/sec\n&quypto/xor.c#L8" id="L8:20" id="L120" class="line" name="L120"> 12/a>
NULL 12/a>      1  mbgotofNCH_SIZE ( 13/a>      1  if ( 11/a>      1          active_templcode=KERN_INFO" class="sref">KERN_INFO "   %-10s: %5d.%03d MB/sec\n&qu/spanmeasf="cryodify 12/a> * You sho"L351pto/xor.c#L45" id="L45;
 13/a>      1  }
NULL;
  71<1/a>
fa/a>;
;
faa>;
fa/a>;
fat =   35<1/a>      1  mb(); nt > fat = )
 =   35<1/a>      1  if (tmplclass="shref="+code=jiff="+code=NULL" class="sref">NULL;
faa="line" name="L35">  35<1/                 40<1/a>      1          return;
 13/a>      1  }
p2 = (unsigned long *)ode=KERN_INFO" class="sref">KERN_INFO "   %-10s: %5d.%03d MB/sec\n&qu/span"cef="" id="L8:id="L1s (d="L1"+code=tmpl" clas)s="sref">tmpl 13/a>      1ef="crypto/xor.c#L53" id1="L5315ss="sref">j =  =  = speed % 1000);="crypto/xor.c#L111" id="L111" clt =  10/a>      1   12/a>      1   12/a>      1ref="crypto/xor.c#L56" i1d="L515" class="line" name="L106"> 10/a> ( 10/a>      1ef="crypto/xor.c#L58" id1="L5815f">b1 = (void *) (GFss="sref">srcs) href="+code=b2" class="sref">b2);
 11/a>/* Set o1f all15" class="line" name="L129"> 12/a>static1 struct fastest = ->do_/a>;
 12/a>
ENOMEss="line" name="L84">  84<1/a>#defin1e   40<1/a>
  63<1/a>static1 void _>__GFP_NOTRACK  40<1/a>  35<1/a>{

KERN37;5d.%03d MB/sec\n&quGPL" id="L120" class="line" name="L120"> 12/a>      1  int   97<1/a>      1  unsigned long 
or.c#L3s/md/mdao L128" class="line" name="L128"> 12/a>      1  int 
L107"_hreypto/xor.c#L123cf">L107"_hre">KERN_INFO (void)
 12/a>static1ef="crypto/xor.c#L70" id1="L701 classN_INFO KERN_INFO  12/a>      1  <25" h_result

contents">
f="coriginal LXRyodifyLXRyspanu07"ya>);

lxr@l.c#L.noa>);.
content">
lxr.l.c#L.no kindly hostc#L117s="line" http://www.redpill-l.c5"o.no">Redpill="L35"o ASa>);
<5"oviduse

<"crypnd oper id="s serpto/xosanyth1995.
contents"/bodynt"/htmllt