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
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 061375ee6592..5adbe0b22684 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 f0d67cbdea40..7d6c20b654fa 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;