aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 4ca0ab3448d..b749a1a46e2 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 cce46a1c9dc..68e934b4bee 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 324897c4be4..8281ac5e68a 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 7df934d6913..24d93d02a1f 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 38754084eac..71eb45f7417 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 1c54f3c1cca..33beaa7da08 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
5820static int get_ro(char *buffer, struct kernel_param *kp) 5820static int get_ro(char *buffer, struct kernel_param *kp)
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 061375ee659..5adbe0b2268 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -918,7 +918,7 @@ static void copy_data(int frombio, struct bio *bio,
918 918
919#define check_xor() do { \ 919#define check_xor() do { \
920 if (count == MAX_XOR_BLOCKS) { \ 920 if (count == MAX_XOR_BLOCKS) { \
921 xor_block(count, STRIPE_SIZE, ptr); \ 921 xor_blocks(count, STRIPE_SIZE, ptr); \
922 count = 1; \ 922 count = 1; \
923 } \ 923 } \
924 } while(0) 924 } while(0)
@@ -949,7 +949,7 @@ static void compute_block(struct stripe_head *sh, int dd_idx)
949 check_xor(); 949 check_xor();
950 } 950 }
951 if (count != 1) 951 if (count != 1)
952 xor_block(count, STRIPE_SIZE, ptr); 952 xor_blocks(count, STRIPE_SIZE, ptr);
953 set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags); 953 set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags);
954} 954}
955 955
@@ -1004,7 +1004,7 @@ static void compute_parity5(struct stripe_head *sh, int method)
1004 break; 1004 break;
1005 } 1005 }
1006 if (count>1) { 1006 if (count>1) {
1007 xor_block(count, STRIPE_SIZE, ptr); 1007 xor_blocks(count, STRIPE_SIZE, ptr);
1008 count = 1; 1008 count = 1;
1009 } 1009 }
1010 1010
@@ -1038,7 +1038,7 @@ static void compute_parity5(struct stripe_head *sh, int method)
1038 } 1038 }
1039 } 1039 }
1040 if (count != 1) 1040 if (count != 1)
1041 xor_block(count, STRIPE_SIZE, ptr); 1041 xor_blocks(count, STRIPE_SIZE, ptr);
1042 1042
1043 if (method != CHECK_PARITY) { 1043 if (method != CHECK_PARITY) {
1044 set_bit(R5_UPTODATE, &sh->dev[pd_idx].flags); 1044 set_bit(R5_UPTODATE, &sh->dev[pd_idx].flags);
@@ -1160,7 +1160,7 @@ static void compute_block_1(struct stripe_head *sh, int dd_idx, int nozero)
1160 check_xor(); 1160 check_xor();
1161 } 1161 }
1162 if (count != 1) 1162 if (count != 1)
1163 xor_block(count, STRIPE_SIZE, ptr); 1163 xor_blocks(count, STRIPE_SIZE, ptr);
1164 if (!nozero) set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags); 1164 if (!nozero) set_bit(R5_UPTODATE, &sh->dev[dd_idx].flags);
1165 else clear_bit(R5_UPTODATE, &sh->dev[dd_idx].flags); 1165 else clear_bit(R5_UPTODATE, &sh->dev[dd_idx].flags);
1166 } 1166 }
diff --git a/include/linux/raid/xor.h b/include/linux/raid/xor.h
index f0d67cbdea4..7d6c20b654f 100644
--- a/include/linux/raid/xor.h
+++ b/include/linux/raid/xor.h
@@ -5,7 +5,7 @@
5 5
6#define MAX_XOR_BLOCKS 5 6#define MAX_XOR_BLOCKS 5
7 7
8extern void xor_block(unsigned int count, unsigned int bytes, void **ptr); 8extern void xor_blocks(unsigned int count, unsigned int bytes, void **ptr);
9 9
10struct xor_block_template { 10struct xor_block_template {
11 struct xor_block_template *next; 11 struct xor_block_template *next;