]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
xor: move to lib/raid/
authorChristoph Hellwig <hch@lst.de>
Fri, 27 Mar 2026 06:16:37 +0000 (07:16 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Fri, 3 Apr 2026 06:36:16 +0000 (23:36 -0700)
Move the RAID XOR code to lib/raid/ as it has nothing to do with the
crypto API.

Link: https://lkml.kernel.org/r/20260327061704.3707577-6-hch@lst.de
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Eric Biggers <ebiggers@kernel.org>
Tested-by: Eric Biggers <ebiggers@kernel.org>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Alexandre Ghiti <alex@ghiti.fr>
Cc: Andreas Larsson <andreas@gaisler.com>
Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com>
Cc: Ard Biesheuvel <ardb@kernel.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: "Borislav Petkov (AMD)" <bp@alien8.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Chris Mason <clm@fb.com>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: David Sterba <dsterba@suse.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Jason A. Donenfeld <jason@zx2c4.com>
Cc: Johannes Berg <johannes@sipsolutions.net>
Cc: Li Nan <linan122@huawei.com>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Magnus Lindholm <linmag7@gmail.com>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: Richard Henderson <richard.henderson@linaro.org>
Cc: Richard Weinberger <richard@nod.at>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Song Liu <song@kernel.org>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Ted Ts'o <tytso@mit.edu>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: WANG Xuerui <kernel@xen0n.name>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
crypto/Kconfig
crypto/Makefile
crypto/xor.c [deleted file]
lib/Kconfig
lib/Makefile
lib/raid/Kconfig [new file with mode: 0644]
lib/raid/Makefile [new file with mode: 0644]
lib/raid/xor/Makefile [new file with mode: 0644]
lib/raid/xor/xor-core.c [new file with mode: 0644]

index b4bb85e8e226120946a50c1a9d648090ded0db6c..97d73136a0b4b43563dc2bf7dca907f81e49f687 100644 (file)
@@ -2,8 +2,6 @@
 #
 # Generic algorithms support
 #
-config XOR_BLOCKS
-       tristate
 
 #
 # async_tx api: hardware offloaded memory transfer/transform support
index 04e269117589ac9ffc5d57e834b3734f7f4baf3c..795c2eea51fe6e5adede31289d8b6fb6e0448ee8 100644 (file)
@@ -196,7 +196,6 @@ obj-$(CONFIG_CRYPTO_ECRDSA) += ecrdsa_generic.o
 #
 # generic algorithms and the async_tx api
 #
-obj-$(CONFIG_XOR_BLOCKS) += xor.o
 obj-$(CONFIG_ASYNC_CORE) += async_tx/
 obj-$(CONFIG_ASYMMETRIC_KEY_TYPE) += asymmetric_keys/
 crypto_simd-y := simd.o
diff --git a/crypto/xor.c b/crypto/xor.c
deleted file mode 100644 (file)
index df530dd..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * xor.c : Multiple Devices driver for Linux
- *
- * Copyright (C) 1996, 1997, 1998, 1999, 2000,
- * Ingo Molnar, Matti Aarnio, Jakub Jelinek, Richard Henderson.
- *
- * Dispatch optimized RAID-5 checksumming functions.
- */
-
-#define BH_TRACE 0
-#include <linux/module.h>
-#include <linux/gfp.h>
-#include <linux/raid/xor.h>
-#include <linux/jiffies.h>
-#include <linux/preempt.h>
-#include <asm/xor.h>
-
-#ifndef XOR_SELECT_TEMPLATE
-#define XOR_SELECT_TEMPLATE(x) (x)
-#endif
-
-/* The xor routines to use.  */
-static struct xor_block_template *active_template;
-
-void
-xor_blocks(unsigned int src_count, unsigned int bytes, void *dest, void **srcs)
-{
-       unsigned long *p1, *p2, *p3, *p4;
-
-       WARN_ON_ONCE(!in_task() || irqs_disabled() || softirq_count());
-
-       p1 = (unsigned long *) srcs[0];
-       if (src_count == 1) {
-               active_template->do_2(bytes, dest, p1);
-               return;
-       }
-
-       p2 = (unsigned long *) srcs[1];
-       if (src_count == 2) {
-               active_template->do_3(bytes, dest, p1, p2);
-               return;
-       }
-
-       p3 = (unsigned long *) srcs[2];
-       if (src_count == 3) {
-               active_template->do_4(bytes, dest, p1, p2, p3);
-               return;
-       }
-
-       p4 = (unsigned long *) srcs[3];
-       active_template->do_5(bytes, dest, p1, p2, p3, p4);
-}
-EXPORT_SYMBOL(xor_blocks);
-
-/* Set of all registered templates.  */
-static struct xor_block_template *__initdata template_list;
-
-#ifndef MODULE
-static void __init do_xor_register(struct xor_block_template *tmpl)
-{
-       tmpl->next = template_list;
-       template_list = tmpl;
-}
-
-static int __init register_xor_blocks(void)
-{
-       active_template = XOR_SELECT_TEMPLATE(NULL);
-
-       if (!active_template) {
-#define xor_speed      do_xor_register
-               // register all the templates and pick the first as the default
-               XOR_TRY_TEMPLATES;
-#undef xor_speed
-               active_template = template_list;
-       }
-       return 0;
-}
-#endif
-
-#define BENCH_SIZE     4096
-#define REPS           800U
-
-static void __init
-do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
-{
-       int speed;
-       unsigned long reps;
-       ktime_t min, start, t0;
-
-       tmpl->next = template_list;
-       template_list = tmpl;
-
-       preempt_disable();
-
-       reps = 0;
-       t0 = ktime_get();
-       /* delay start until time has advanced */
-       while ((start = ktime_get()) == t0)
-               cpu_relax();
-       do {
-               mb(); /* prevent loop optimization */
-               tmpl->do_2(BENCH_SIZE, b1, b2);
-               mb();
-       } while (reps++ < REPS || (t0 = ktime_get()) == start);
-       min = ktime_sub(t0, start);
-
-       preempt_enable();
-
-       // bytes/ns == GB/s, multiply by 1000 to get MB/s [not MiB/s]
-       speed = (1000 * reps * BENCH_SIZE) / (unsigned int)ktime_to_ns(min);
-       tmpl->speed = speed;
-
-       pr_info("   %-16s: %5d MB/sec\n", tmpl->name, speed);
-}
-
-static int __init
-calibrate_xor_blocks(void)
-{
-       void *b1, *b2;
-       struct xor_block_template *f, *fastest;
-
-       fastest = XOR_SELECT_TEMPLATE(NULL);
-
-       if (fastest) {
-               printk(KERN_INFO "xor: automatically using best "
-                                "checksumming function   %-10s\n",
-                      fastest->name);
-               goto out;
-       }
-
-       b1 = (void *) __get_free_pages(GFP_KERNEL, 2);
-       if (!b1) {
-               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
-        */
-
-#define xor_speed(templ)       do_xor_speed((templ), b1, b2)
-
-       printk(KERN_INFO "xor: measuring software checksum speed\n");
-       template_list = NULL;
-       XOR_TRY_TEMPLATES;
-       fastest = template_list;
-       for (f = fastest; f; f = f->next)
-               if (f->speed > fastest->speed)
-                       fastest = f;
-
-       pr_info("xor: using function: %s (%d MB/sec)\n",
-              fastest->name, fastest->speed);
-
-#undef xor_speed
-
-       free_pages((unsigned long)b1, 2);
-out:
-       active_template = fastest;
-       return 0;
-}
-
-static __exit void xor_exit(void) { }
-
-MODULE_DESCRIPTION("RAID-5 checksumming functions");
-MODULE_LICENSE("GPL");
-
-#ifndef MODULE
-/* when built-in xor.o must initialize before drivers/md/md.o */
-core_initcall(register_xor_blocks);
-#endif
-
-module_init(calibrate_xor_blocks);
-module_exit(xor_exit);
index 2b0c56a53a2a65a939af48668e61271a5684114d..00a9509636c18736f6468bc754c126d2de1927b6 100644 (file)
@@ -138,6 +138,7 @@ config TRACE_MMIO_ACCESS
 
 source "lib/crc/Kconfig"
 source "lib/crypto/Kconfig"
+source "lib/raid/Kconfig"
 
 config XXHASH
        tristate
index 60c9c9e79375e9975f32cdf7123405764a035be6..9ea149e618d21cafa016582e3e81b08022c1cc66 100644 (file)
@@ -120,7 +120,7 @@ endif
 obj-$(CONFIG_DEBUG_INFO_REDUCED) += debug_info.o
 CFLAGS_debug_info.o += $(call cc-option, -femit-struct-debug-detailed=any)
 
-obj-y += math/ crc/ crypto/ tests/ vdso/
+obj-y += math/ crc/ crypto/ tests/ vdso/ raid/
 
 obj-$(CONFIG_GENERIC_IOMAP) += iomap.o
 obj-$(CONFIG_HAS_IOMEM) += iomap_copy.o devres.o
diff --git a/lib/raid/Kconfig b/lib/raid/Kconfig
new file mode 100644 (file)
index 0000000..01b73a1
--- /dev/null
@@ -0,0 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0
+
+config XOR_BLOCKS
+       tristate
diff --git a/lib/raid/Makefile b/lib/raid/Makefile
new file mode 100644 (file)
index 0000000..3540fe8
--- /dev/null
@@ -0,0 +1,3 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-y                          += xor/
diff --git a/lib/raid/xor/Makefile b/lib/raid/xor/Makefile
new file mode 100644 (file)
index 0000000..7bca0ce
--- /dev/null
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0
+
+obj-$(CONFIG_XOR_BLOCKS)       += xor.o
+
+xor-y                          += xor-core.o
diff --git a/lib/raid/xor/xor-core.c b/lib/raid/xor/xor-core.c
new file mode 100644 (file)
index 0000000..df530dd
--- /dev/null
@@ -0,0 +1,176 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * xor.c : Multiple Devices driver for Linux
+ *
+ * Copyright (C) 1996, 1997, 1998, 1999, 2000,
+ * Ingo Molnar, Matti Aarnio, Jakub Jelinek, Richard Henderson.
+ *
+ * Dispatch optimized RAID-5 checksumming functions.
+ */
+
+#define BH_TRACE 0
+#include <linux/module.h>
+#include <linux/gfp.h>
+#include <linux/raid/xor.h>
+#include <linux/jiffies.h>
+#include <linux/preempt.h>
+#include <asm/xor.h>
+
+#ifndef XOR_SELECT_TEMPLATE
+#define XOR_SELECT_TEMPLATE(x) (x)
+#endif
+
+/* The xor routines to use.  */
+static struct xor_block_template *active_template;
+
+void
+xor_blocks(unsigned int src_count, unsigned int bytes, void *dest, void **srcs)
+{
+       unsigned long *p1, *p2, *p3, *p4;
+
+       WARN_ON_ONCE(!in_task() || irqs_disabled() || softirq_count());
+
+       p1 = (unsigned long *) srcs[0];
+       if (src_count == 1) {
+               active_template->do_2(bytes, dest, p1);
+               return;
+       }
+
+       p2 = (unsigned long *) srcs[1];
+       if (src_count == 2) {
+               active_template->do_3(bytes, dest, p1, p2);
+               return;
+       }
+
+       p3 = (unsigned long *) srcs[2];
+       if (src_count == 3) {
+               active_template->do_4(bytes, dest, p1, p2, p3);
+               return;
+       }
+
+       p4 = (unsigned long *) srcs[3];
+       active_template->do_5(bytes, dest, p1, p2, p3, p4);
+}
+EXPORT_SYMBOL(xor_blocks);
+
+/* Set of all registered templates.  */
+static struct xor_block_template *__initdata template_list;
+
+#ifndef MODULE
+static void __init do_xor_register(struct xor_block_template *tmpl)
+{
+       tmpl->next = template_list;
+       template_list = tmpl;
+}
+
+static int __init register_xor_blocks(void)
+{
+       active_template = XOR_SELECT_TEMPLATE(NULL);
+
+       if (!active_template) {
+#define xor_speed      do_xor_register
+               // register all the templates and pick the first as the default
+               XOR_TRY_TEMPLATES;
+#undef xor_speed
+               active_template = template_list;
+       }
+       return 0;
+}
+#endif
+
+#define BENCH_SIZE     4096
+#define REPS           800U
+
+static void __init
+do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
+{
+       int speed;
+       unsigned long reps;
+       ktime_t min, start, t0;
+
+       tmpl->next = template_list;
+       template_list = tmpl;
+
+       preempt_disable();
+
+       reps = 0;
+       t0 = ktime_get();
+       /* delay start until time has advanced */
+       while ((start = ktime_get()) == t0)
+               cpu_relax();
+       do {
+               mb(); /* prevent loop optimization */
+               tmpl->do_2(BENCH_SIZE, b1, b2);
+               mb();
+       } while (reps++ < REPS || (t0 = ktime_get()) == start);
+       min = ktime_sub(t0, start);
+
+       preempt_enable();
+
+       // bytes/ns == GB/s, multiply by 1000 to get MB/s [not MiB/s]
+       speed = (1000 * reps * BENCH_SIZE) / (unsigned int)ktime_to_ns(min);
+       tmpl->speed = speed;
+
+       pr_info("   %-16s: %5d MB/sec\n", tmpl->name, speed);
+}
+
+static int __init
+calibrate_xor_blocks(void)
+{
+       void *b1, *b2;
+       struct xor_block_template *f, *fastest;
+
+       fastest = XOR_SELECT_TEMPLATE(NULL);
+
+       if (fastest) {
+               printk(KERN_INFO "xor: automatically using best "
+                                "checksumming function   %-10s\n",
+                      fastest->name);
+               goto out;
+       }
+
+       b1 = (void *) __get_free_pages(GFP_KERNEL, 2);
+       if (!b1) {
+               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
+        */
+
+#define xor_speed(templ)       do_xor_speed((templ), b1, b2)
+
+       printk(KERN_INFO "xor: measuring software checksum speed\n");
+       template_list = NULL;
+       XOR_TRY_TEMPLATES;
+       fastest = template_list;
+       for (f = fastest; f; f = f->next)
+               if (f->speed > fastest->speed)
+                       fastest = f;
+
+       pr_info("xor: using function: %s (%d MB/sec)\n",
+              fastest->name, fastest->speed);
+
+#undef xor_speed
+
+       free_pages((unsigned long)b1, 2);
+out:
+       active_template = fastest;
+       return 0;
+}
+
+static __exit void xor_exit(void) { }
+
+MODULE_DESCRIPTION("RAID-5 checksumming functions");
+MODULE_LICENSE("GPL");
+
+#ifndef MODULE
+/* when built-in xor.o must initialize before drivers/md/md.o */
+core_initcall(register_xor_blocks);
+#endif
+
+module_init(calibrate_xor_blocks);
+module_exit(xor_exit);