Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 685784aa authored by Dan Williams's avatar Dan Williams
Browse files

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: default avatarDan Williams <dan.j.williams@intel.com>
parent d379b01e
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
#
# Generic algorithms support
#
config XOR_BLOCKS
	tristate

#
# Cryptographic API Configuration
#
+6 −0
Original line number Diff line number Diff line
@@ -50,3 +50,9 @@ obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o

obj-$(CONFIG_CRYPTO_TEST) += tcrypt.o

#
# generic algorithms and the async_tx api
#
obj-$(CONFIG_XOR_BLOCKS) += xor.o
+16 −14
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
static struct xor_block_template *active_template;

void
xor_block(unsigned int count, unsigned int bytes, void **ptr)
xor_blocks(unsigned int count, unsigned int bytes, void **ptr)
{
	unsigned long *p0, *p1, *p2, *p3, *p4;

@@ -52,6 +52,7 @@ xor_block(unsigned int count, unsigned int bytes, void **ptr)
	p4 = (unsigned long *) ptr[4];
	active_template->do_5(bytes, p0, p1, p2, p3, p4);
}
EXPORT_SYMBOL(xor_blocks);

/* Set of all registered templates.  */
static struct xor_block_template *template_list;
@@ -78,7 +79,7 @@ do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
		now = jiffies;
		count = 0;
		while (jiffies == now) {
			mb();
			mb(); /* prevent loop optimzation */
			tmpl->do_2(BENCH_SIZE, b1, b2);
			mb();
			count++;
@@ -91,26 +92,26 @@ do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
	speed = max * (HZ * BENCH_SIZE / 1024);
	tmpl->speed = speed;

	printk("   %-10s: %5d.%03d MB/sec\n", tmpl->name,
	printk(KERN_INFO "   %-10s: %5d.%03d MB/sec\n", tmpl->name,
	       speed / 1000, speed % 1000);
}

static int
calibrate_xor_block(void)
static int __init
calibrate_xor_blocks(void)
{
	void *b1, *b2;
	struct xor_block_template *f, *fastest;

	b1 = (void *) __get_free_pages(GFP_KERNEL, 2);
	if (!b1) {
		printk("raid5: Yikes!  No memory available.\n");
		printk(KERN_WARNING "xor: Yikes!  No memory available.\n");
		return -ENOMEM;
	}
	b2 = b1 + 2*PAGE_SIZE + BENCH_SIZE;

	/*
	 * If this arch/cpu has a short-circuited selection, don't loop through all
	 * the possible functions, just test the best one
	 * If this arch/cpu has a short-circuited selection, don't loop through
	 * all the possible functions, just test the best one
	 */

	fastest = NULL;
@@ -122,11 +123,12 @@ calibrate_xor_block(void)
#define xor_speed(templ)	do_xor_speed((templ), b1, b2)

	if (fastest) {
		printk(KERN_INFO "raid5: automatically using best checksumming function: %s\n",
		printk(KERN_INFO "xor: automatically using best "
			"checksumming function: %s\n",
			fastest->name);
		xor_speed(fastest);
	} else {
		printk(KERN_INFO "raid5: measuring checksumming speed\n");
		printk(KERN_INFO "xor: measuring checksumming speed\n");
		XOR_TRY_TEMPLATES;
		fastest = template_list;
		for (f = fastest; f; f = f->next)
@@ -134,7 +136,7 @@ calibrate_xor_block(void)
				fastest = f;
	}

	printk("raid5: using function: %s (%d.%03d MB/sec)\n",
	printk(KERN_INFO "xor: using function: %s (%d.%03d MB/sec)\n",
	       fastest->name, fastest->speed / 1000, fastest->speed % 1000);

#undef xor_speed
@@ -147,8 +149,8 @@ calibrate_xor_block(void)

static __exit void xor_exit(void) { }

EXPORT_SYMBOL(xor_block);
MODULE_LICENSE("GPL");

module_init(calibrate_xor_block);
/* when built-in xor.o must initialize before drivers/md/md.o */
core_initcall(calibrate_xor_blocks);
module_exit(xor_exit);
+1 −0
Original line number Diff line number Diff line
@@ -109,6 +109,7 @@ config MD_RAID10
config MD_RAID456
	tristate "RAID-4/RAID-5/RAID-6 mode"
	depends on BLK_DEV_MD
	select XOR_BLOCKS
	---help---
	  A RAID-5 set of N drives with a capacity of C MB per drive provides
	  the capacity of C * (N - 1) MB, and protects against a failure
+2 −2
Original line number Diff line number Diff line
@@ -17,7 +17,7 @@ raid456-objs := raid5.o raid6algos.o raid6recov.o raid6tables.o \
hostprogs-y	:= mktables

# Note: link order is important.  All raid personalities
# and xor.o must come before md.o, as they each initialise 
# and must come before md.o, as they each initialise 
# themselves, and md.o may use the personalities when it 
# auto-initialised.

@@ -25,7 +25,7 @@ obj-$(CONFIG_MD_LINEAR) += linear.o
obj-$(CONFIG_MD_RAID0)		+= raid0.o
obj-$(CONFIG_MD_RAID1)		+= raid1.o
obj-$(CONFIG_MD_RAID10)		+= raid10.o
obj-$(CONFIG_MD_RAID456)	+= raid456.o xor.o
obj-$(CONFIG_MD_RAID456)	+= raid456.o
obj-$(CONFIG_MD_MULTIPATH)	+= multipath.o
obj-$(CONFIG_MD_FAULTY)		+= faulty.o
obj-$(CONFIG_BLK_DEV_MD)	+= md-mod.o
Loading