aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2007-07-09 14:56:42 -0400
committerDan Williams <dan.j.williams@intel.com>2007-07-13 11:06:14 -0400
commit685784aaf3cd0e3ff5e36c7ecf6f441cdbf57f73 (patch)
tree10f99829f7d877b87614fe69be77e363c026a8d7
parentd379b01e9087a582d58f4b678208a4f8d8376fe7 (diff)
xor: make 'xor_blocks' a library routine for use with async_tx
The async_tx api tries to use a dma engine for an operation, but will fall back to an optimized software routine otherwise. Xor support is implemented using the raid5 xor routines. For organizational purposes this routine is moved to a common area. The following fixes are also made: * rename xor_block => xor_blocks, suggested by Adrian Bunk * ensure that xor.o initializes before md.o in the built-in case * checkpatch.pl fixes * mark calibrate_xor_blocks __init, Adrian Bunk Cc: Adrian Bunk <bunk@stusta.de> Cc: NeilBrown <neilb@suse.de> Cc: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r--crypto/Kconfig6
-rw-r--r--crypto/Makefile6
-rw-r--r--crypto/xor.c (renamed from drivers/md/xor.c)30
-rw-r--r--drivers/md/Kconfig1
-rw-r--r--drivers/md/Makefile4
-rw-r--r--drivers/md/md.c2
-rw-r--r--drivers/md/raid5.c10
-rw-r--r--include/linux/raid/xor.h2
8 files changed, 38 insertions, 23 deletions
diff --git a/crypto/Kconfig b/crypto/Kconfig
index 4ca0ab3448d9..b749a1a46e22 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -1,4 +1,10 @@
1# 1#
2# Generic algorithms support
3#
4config XOR_BLOCKS
5 tristate
6
7#
2# Cryptographic API Configuration 8# Cryptographic API Configuration
3# 9#
4 10
diff --git a/crypto/Makefile b/crypto/Makefile
index cce46a1c9dc7..68e934b4bee2 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -50,3 +50,9 @@ obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
50obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o 50obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
51 51
52obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o 52obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o
53
54#
55# generic algorithms and the async_tx api
56#
57obj-$(CONFIG_XOR_BLOCKS) += xor.o
58
diff --git a/drivers/md/xor.c b/crypto/xor.c
index 324897c4be4e..8281ac5e68a8 100644
--- a/drivers/md/xor.c
+++ b/crypto/xor.c
@@ -26,7 +26,7 @@
26static struct xor_block_template *active_template; 26static struct xor_block_template *active_template;
27 27
28void 28void
29xor_block(unsigned int count, unsigned int bytes, void **ptr) 29xor_blocks(unsigned int count, unsigned int bytes, void **ptr)
30{ 30{
31 unsigned long *p0, *p1, *p2, *p3, *p4; 31 unsigned long *p0, *p1, *p2, *p3, *p4;
32 32
@@ -52,6 +52,7 @@ xor_block(unsigned int count, unsigned int bytes, void **ptr)
52 p4 = (unsigned long *) ptr[4]; 52 p4 = (unsigned long *) ptr[4];
53 active_template->do_5(bytes, p0, p1, p2, p3, p4); 53 active_template->do_5(bytes, p0, p1, p2, p3, p4);
54} 54}
55EXPORT_SYMBOL(xor_blocks);
55 56
56/* Set of all registered templates. */ 57/* Set of all registered templates. */
57static struct xor_block_template *template_list; 58static struct xor_block_template *template_list;
@@ -78,7 +79,7 @@ do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
78 now = jiffies; 79 now = jiffies;
79 count = 0; 80 count = 0;
80 while (jiffies == now) { 81 while (jiffies == now) {
81 mb(); 82 mb(); /* prevent loop optimzation */
82 tmpl->do_2(BENCH_SIZE, b1, b2); 83 tmpl->do_2(BENCH_SIZE, b1, b2);
83 mb(); 84 mb();
84 count++; 85 count++;
@@ -91,26 +92,26 @@ do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
91 speed = max * (HZ * BENCH_SIZE / 1024); 92 speed = max * (HZ * BENCH_SIZE / 1024);
92 tmpl->speed = speed; 93 tmpl->speed = speed;
93 94
94 printk(" %-10s: %5d.%03d MB/sec\n", tmpl->name, 95 printk(KERN_INFO " %-10s: %5d.%03d MB/sec\n", tmpl->name,
95 speed / 1000, speed % 1000); 96 speed / 1000, speed % 1000);
96} 97}
97 98
98static int 99static int __init
99calibrate_xor_block(void) 100calibrate_xor_blocks(void)
100{ 101{
101 void *b1, *b2; 102 void *b1, *b2;
102 struct xor_block_template *f, *fastest; 103 struct xor_block_template *f, *fastest;
103 104
104 b1 = (void *) __get_free_pages(GFP_KERNEL, 2); 105 b1 = (void *) __get_free_pages(GFP_KERNEL, 2);
105 if (! b1) { 106 if (!b1) {
106 printk("raid5: Yikes! No memory available.\n"); 107 printk(KERN_WARNING "xor: Yikes! No memory available.\n");
107 return -ENOMEM; 108 return -ENOMEM;
108 } 109 }
109 b2 = b1 + 2*PAGE_SIZE + BENCH_SIZE; 110 b2 = b1 + 2*PAGE_SIZE + BENCH_SIZE;
110 111
111 /* 112 /*
112 * If this arch/cpu has a short-circuited selection, don't loop through all 113 * If this arch/cpu has a short-circuited selection, don't loop through
113 * the possible functions, just test the best one 114 * all the possible functions, just test the best one
114 */ 115 */
115 116
116 fastest = NULL; 117 fastest = NULL;
@@ -122,11 +123,12 @@ calibrate_xor_block(void)
122#define xor_speed(templ) do_xor_speed((templ), b1, b2) 123#define xor_speed(templ) do_xor_speed((templ), b1, b2)
123 124
124 if (fastest) { 125 if (fastest) {
125 printk(KERN_INFO "raid5: automatically using best checksumming function: %s\n", 126 printk(KERN_INFO "xor: automatically using best "
127 "checksumming function: %s\n",
126 fastest->name); 128 fastest->name);
127 xor_speed(fastest); 129 xor_speed(fastest);
128 } else { 130 } else {
129 printk(KERN_INFO "raid5: measuring checksumming speed\n"); 131 printk(KERN_INFO "xor: measuring checksumming speed\n");
130 XOR_TRY_TEMPLATES; 132 XOR_TRY_TEMPLATES;
131 fastest = template_list; 133 fastest = template_list;
132 for (f = fastest; f; f = f->next) 134 for (f = fastest; f; f = f->next)
@@ -134,7 +136,7 @@ calibrate_xor_block(void)
134 fastest = f; 136 fastest = f;
135 } 137 }
136 138
137 printk("raid5: using function: %s (%d.%03d MB/sec)\n", 139 printk(KERN_INFO "xor: using function: %s (%d.%03d MB/sec)\n",
138 fastest->name, fastest->speed / 1000, fastest->speed % 1000); 140 fastest->name, fastest->speed / 1000, fastest->speed % 1000);
139 141
140#undef xor_speed 142#undef xor_speed
@@ -147,8 +149,8 @@ calibrate_xor_block(void)
147 149
148static __exit void xor_exit(void) { } 150static __exit void xor_exit(void) { }
149 151
150EXPORT_SYMBOL(xor_block);
151MODULE_LICENSE("GPL"); 152MODULE_LICENSE("GPL");
152 153
153module_init(calibrate_xor_block); 154/* when built-in xor.o must initialize before drivers/md/md.o */
155core_initcall(calibrate_xor_blocks);
154module_exit(xor_exit); 156module_exit(xor_exit);
diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig
index 7df934d69134..24d93d02a1f3 100644
--- a/drivers/md/Kconfig
+++ b/drivers/md/Kconfig
@@ -109,6 +109,7 @@ config MD_RAID10
109config MD_RAID456 109config MD_RAID456
110 tristate "RAID-4/RAID-5/RAID-6 mode" 110 tristate "RAID-4/RAID-5/RAID-6 mode"
111 depends on BLK_DEV_MD 111 depends on BLK_DEV_MD
112 select XOR_BLOCKS
112 ---help--- 113 ---help---
113 A RAID-5 set of N drives with a capacity of C MB per drive provides 114 A RAID-5 set of N drives with a capacity of C MB per drive provides
114 the capacity of C * (N - 1) MB, and protects against a failure 115 the capacity of C * (N - 1) MB, and protects against a failure
diff --git a/drivers/md/Makefile b/drivers/md/Makefile
index 38754084eac7..71eb45f74171 100644
--- a/drivers/md/Makefile
+++ b/drivers/md/Makefile
@@ -17,7 +17,7 @@ raid456-objs := raid5.o raid6algos.o raid6recov.o raid6tables.o \
17hostprogs-y := mktables 17hostprogs-y := mktables
18 18
19# Note: link order is important. All raid personalities 19# Note: link order is important. All raid personalities
20# and xor.o must come before md.o, as they each initialise 20# and must come before md.o, as they each initialise
21# themselves, and md.o may use the personalities when it 21# themselves, and md.o may use the personalities when it
22# auto-initialised. 22# auto-initialised.
23 23
@@ -25,7 +25,7 @@ obj-$(CONFIG_MD_LINEAR) += linear.o
25obj-$(CONFIG_MD_RAID0) += raid0.o 25obj-$(CONFIG_MD_RAID0) += raid0.o
26obj-$(CONFIG_MD_RAID1) += raid1.o 26obj-$(CONFIG_MD_RAID1) += raid1.o
27obj-$(CONFIG_MD_RAID10) += raid10.o 27obj-$(CONFIG_MD_RAID10) += raid10.o
28obj-$(CONFIG_MD_RAID456) += raid456.o xor.o 28obj-$(CONFIG_MD_RAID456) += raid456.o
29obj-$(CONFIG_MD_MULTIPATH) += multipath.o 29obj-$(CONFIG_MD_MULTIPATH) += multipath.o
30obj-$(CONFIG_MD_FAULTY) += faulty.o 30obj-$(CONFIG_MD_FAULTY) += faulty.o
31obj-$(CONFIG_BLK_DEV_MD) += md-mod.o 31obj-$(CONFIG_BLK_DEV_MD) += md-mod.o
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 1c54f3c1cca7..33beaa7da085 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -5814,7 +5814,7 @@ static __exit void md_exit(void)
5814 } 5814 }
5815} 5815}
5816 5816
5817module_init(md_init) 5817subsys_initcall(md_init);
5818module_exit(md_exit) 5818module_exit(md_exit)
5819 5819
<