[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