[PATCH 1/2] arm64/xor: use static calls for inner NEON helpers
Ard Biesheuvel
ardb at kernel.org
Tue Nov 9 04:03:35 PST 2021
Call the inner NEON helpers using static calls rather than loading
their addresses from a struct. This will be used in a subsequent patch
to switch between NEON and SHA3 based implementations of the XOR code.
Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
---
arch/arm64/include/asm/xor.h | 24 ++++++++++++++++----
arch/arm64/lib/xor-neon.c | 20 +++++++++-------
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/arch/arm64/include/asm/xor.h b/arch/arm64/include/asm/xor.h
index 947f6a4f1aa0..f52dbb05b4b1 100644
--- a/arch/arm64/include/asm/xor.h
+++ b/arch/arm64/include/asm/xor.h
@@ -7,19 +7,33 @@
*/
#include <linux/hardirq.h>
+#include <linux/static_call.h>
#include <asm-generic/xor.h>
#include <asm/hwcap.h>
#include <asm/neon.h>
#ifdef CONFIG_KERNEL_MODE_NEON
-extern struct xor_block_template const xor_block_inner_neon;
+void xor_arm64_neon_2(unsigned long bytes, unsigned long *p1,
+ unsigned long *p2);
+void xor_arm64_neon_3(unsigned long bytes, unsigned long *p1,
+ unsigned long *p2, unsigned long *p3);
+void xor_arm64_neon_4(unsigned long bytes, unsigned long *p1,
+ unsigned long *p2, unsigned long *p3,
+ unsigned long *p4);
+void xor_arm64_neon_5(unsigned long bytes, unsigned long *p1,
+ unsigned long *p2, unsigned long *p3,
+ unsigned long *p4, unsigned long *p5);
+
+DECLARE_STATIC_CALL(xor_arm64_3, xor_arm64_neon_3);
+DECLARE_STATIC_CALL(xor_arm64_4, xor_arm64_neon_4);
+DECLARE_STATIC_CALL(xor_arm64_5, xor_arm64_neon_5);
static void
xor_neon_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
{
kernel_neon_begin();
- xor_block_inner_neon.do_2(bytes, p1, p2);
+ xor_arm64_neon_2(bytes, p1, p2);
kernel_neon_end();
}
@@ -28,7 +42,7 @@ xor_neon_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
unsigned long *p3)
{
kernel_neon_begin();
- xor_block_inner_neon.do_3(bytes, p1, p2, p3);
+ static_call(xor_arm64_3)(bytes, p1, p2, p3);
kernel_neon_end();
}
@@ -37,7 +51,7 @@ xor_neon_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
unsigned long *p3, unsigned long *p4)
{
kernel_neon_begin();
- xor_block_inner_neon.do_4(bytes, p1, p2, p3, p4);
+ static_call(xor_arm64_4)(bytes, p1, p2, p3, p4);
kernel_neon_end();
}
@@ -46,7 +60,7 @@ xor_neon_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
unsigned long *p3, unsigned long *p4, unsigned long *p5)
{
kernel_neon_begin();
- xor_block_inner_neon.do_5(bytes, p1, p2, p3, p4, p5);
+ static_call(xor_arm64_5)(bytes, p1, p2, p3, p4, p5);
kernel_neon_end();
}
diff --git a/arch/arm64/lib/xor-neon.c b/arch/arm64/lib/xor-neon.c
index 11bf4f8aca68..ee4795f3e166 100644
--- a/arch/arm64/lib/xor-neon.c
+++ b/arch/arm64/lib/xor-neon.c
@@ -7,6 +7,7 @@
*/
#include <linux/raid/xor.h>
+#include <linux/static_call.h>
#include <linux/module.h>
#include <asm/neon-intrinsics.h>
@@ -36,6 +37,7 @@ void xor_arm64_neon_2(unsigned long bytes, unsigned long *p1,
dp2 += 8;
} while (--lines > 0);
}
+EXPORT_SYMBOL(xor_arm64_neon_2);
void xor_arm64_neon_3(unsigned long bytes, unsigned long *p1,
unsigned long *p2, unsigned long *p3)
@@ -71,6 +73,7 @@ void xor_arm64_neon_3(unsigned long bytes, unsigned long *p1,
dp3 += 8;
} while (--lines > 0);
}
+EXPORT_SYMBOL(xor_arm64_neon_3);
void xor_arm64_neon_4(unsigned long bytes, unsigned long *p1,
unsigned long *p2, unsigned long *p3, unsigned long *p4)
@@ -114,6 +117,7 @@ void xor_arm64_neon_4(unsigned long bytes, unsigned long *p1,
dp4 += 8;
} while (--lines > 0);
}
+EXPORT_SYMBOL(xor_arm64_neon_4);
void xor_arm64_neon_5(unsigned long bytes, unsigned long *p1,
unsigned long *p2, unsigned long *p3,
@@ -166,15 +170,15 @@ void xor_arm64_neon_5(unsigned long bytes, unsigned long *p1,
dp5 += 8;
} while (--lines > 0);
}
+EXPORT_SYMBOL(xor_arm64_neon_5);
-struct xor_block_template const xor_block_inner_neon = {
- .name = "__inner_neon__",
- .do_2 = xor_arm64_neon_2,
- .do_3 = xor_arm64_neon_3,
- .do_4 = xor_arm64_neon_4,
- .do_5 = xor_arm64_neon_5,
-};
-EXPORT_SYMBOL(xor_block_inner_neon);
+DEFINE_STATIC_CALL(xor_arm64_3, xor_arm64_neon_3);
+DEFINE_STATIC_CALL(xor_arm64_4, xor_arm64_neon_4);
+DEFINE_STATIC_CALL(xor_arm64_5, xor_arm64_neon_5);
+
+EXPORT_STATIC_CALL(xor_arm64_3);
+EXPORT_STATIC_CALL(xor_arm64_4);
+EXPORT_STATIC_CALL(xor_arm64_5);
MODULE_AUTHOR("Jackie Liu <liuyun01 at kylinos.cn>");
MODULE_DESCRIPTION("ARMv8 XOR Extensions");
--
2.30.2
More information about the linux-arm-kernel
mailing list