diff options
-rw-r--r-- | crypto/Kconfig | 6 | ||||
-rw-r--r-- | crypto/Makefile | 6 | ||||
-rw-r--r-- | crypto/xor.c (renamed from drivers/md/xor.c) | 30 | ||||
-rw-r--r-- | drivers/md/Kconfig | 1 | ||||
-rw-r--r-- | drivers/md/Makefile | 4 | ||||
-rw-r--r-- | drivers/md/md.c | 2 | ||||
-rw-r--r-- | drivers/md/raid5.c | 10 | ||||
-rw-r--r-- | include/linux/raid/xor.h | 2 |
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 | # | ||
4 | config 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 | |||
50 | obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o | 50 | obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o |
51 | 51 | ||
52 | obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o | 52 | obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o |
53 | |||
54 | # | ||
55 | # generic algorithms and the async_tx api | ||
56 | # | ||
57 | obj-$(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 @@ | |||
26 | static struct xor_block_template *active_template; | 26 | static struct xor_block_template *active_template; |
27 | 27 | ||
28 | void | 28 | void |
29 | xor_block(unsigned int count, unsigned int bytes, void **ptr) | 29 | xor_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 | } |
55 | EXPORT_SYMBOL(xor_blocks); | ||
55 | 56 | ||
56 | /* Set of all registered templates. */ | 57 | /* Set of all registered templates. */ |
57 | static struct xor_block_template *template_list; | 58 | static 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 | ||
98 | static int | 99 | static int __init |
99 | calibrate_xor_block(void) | 100 | calibrate_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 | ||
148 | static __exit void xor_exit(void) { } | 150 | static __exit void xor_exit(void) { } |
149 | 151 | ||
150 | EXPORT_SYMBOL(xor_block); | ||
151 | MODULE_LICENSE("GPL"); | 152 | MODULE_LICENSE("GPL"); |
152 | 153 | ||
153 | module_init(calibrate_xor_block); | 154 | /* when built-in xor.o must initialize before drivers/md/md.o */ |
155 | core_initcall(calibrate_xor_blocks); | ||
154 | module_exit(xor_exit); | 156 | module_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 | |||
109 | config MD_RAID456 | 109 | config 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 \ | |||
17 | hostprogs-y := mktables | 17 | hostprogs-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 | |||
25 | obj-$(CONFIG_MD_RAID0) += raid0.o | 25 | obj-$(CONFIG_MD_RAID0) += raid0.o |
26 | obj-$(CONFIG_MD_RAID1) += raid1.o | 26 | obj-$(CONFIG_MD_RAID1) += raid1.o |
27 | obj-$(CONFIG_MD_RAID10) += raid10.o | 27 | obj-$(CONFIG_MD_RAID10) += raid10.o |
28 | obj-$(CONFIG_MD_RAID456) += raid456.o xor.o | 28 | obj-$(CONFIG_MD_RAID456) += raid456.o |
29 | obj-$(CONFIG_MD_MULTIPATH) += multipath.o | 29 | obj-$(CONFIG_MD_MULTIPATH) += multipath.o |
30 | obj-$(CONFIG_MD_FAULTY) += faulty.o | 30 | obj-$(CONFIG_MD_FAULTY) += faulty.o |
31 | obj-$(CONFIG_BLK_DEV_MD) += md-mod.o | 31 | obj-$(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 | ||
5817 | module_init(md_init) | 5817 | subsys_initcall(md_init); |
5818 | module_exit(md_exit) | 5818 | module_exit(md_exit) |
5819 | 5819 | ||
5820 | static int get_ro(char *buffer, struct kernel_param *kp) | 5820 | static 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 | ||
8 | extern void xor_block(unsigned int count, unsigned int bytes, void **ptr); | 8 | extern void xor_blocks(unsigned int count, unsigned int bytes, void **ptr); |
9 | 9 | ||
10 | struct xor_block_template { | 10 | struct xor_block_template { |
11 | struct xor_block_template *next; | 11 | struct xor_block_template *next; |