]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
powerpc/selftests/copyloops: extend selftest to exercise __copy_tofrom_user_power7_vmx
authorSayali Patil <sayalip@linux.ibm.com>
Wed, 4 Mar 2026 12:22:01 +0000 (17:52 +0530)
committerMadhavan Srinivasan <maddy@linux.ibm.com>
Thu, 12 Mar 2026 05:33:48 +0000 (11:03 +0530)
The new PowerPC VMX fast path (__copy_tofrom_user_power7_vmx) is not
exercised by existing copyloops selftests. This patch updates
the selftest to exercise the VMX variant, ensuring the VMX copy path
is validated.

Changes include:
  - COPY_LOOP=test___copy_tofrom_user_power7_vmx with -D VMX_TEST is used
    in existing selftest build targets.
  - Inclusion of ../utils.c to provide get_auxv_entry() for hardware
    feature detection.
  - At runtime, the test skips execution if Altivec is not available.
  - Copy sizes above VMX_COPY_THRESHOLD are used to ensure the VMX
    path is taken.

This enables validation of the VMX fast path without affecting systems
that do not support Altivec.

Signed-off-by: Sayali Patil <sayalip@linux.ibm.com>
Tested-by: Venkat Rao Bagalkote <venkat88@linux.ibm.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/20260304122201.153049-2-sayalip@linux.ibm.com
tools/testing/selftests/powerpc/copyloops/.gitignore
tools/testing/selftests/powerpc/copyloops/Makefile
tools/testing/selftests/powerpc/copyloops/stubs.S
tools/testing/selftests/powerpc/copyloops/validate.c

index 7283e8b07b75ba8e4b5490b4065a5214163b2b01..80d4270a71ac275d5fbb0eb0b15f3b85026a11b2 100644 (file)
@@ -2,8 +2,8 @@
 copyuser_64_t0
 copyuser_64_t1
 copyuser_64_t2
-copyuser_p7_t0
-copyuser_p7_t1
+copyuser_p7
+copyuser_p7_vmx
 memcpy_64_t0
 memcpy_64_t1
 memcpy_64_t2
index 42940f92d832236152a07300f8903b559a059d43..0c8efb0bddeb90466d336149aecb17ecc50edc53 100644 (file)
@@ -1,6 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 TEST_GEN_PROGS := copyuser_64_t0 copyuser_64_t1 copyuser_64_t2 \
-               copyuser_p7_t0 copyuser_p7_t1 \
+               copyuser_p7 copyuser_p7_vmx \
                memcpy_64_t0 memcpy_64_t1 memcpy_64_t2 \
                memcpy_p7_t0 memcpy_p7_t1 copy_mc_64 \
                copyuser_64_exc_t0 copyuser_64_exc_t1 copyuser_64_exc_t2 \
@@ -28,10 +28,15 @@ $(OUTPUT)/copyuser_64_t%:   copyuser_64.S $(EXTRA_SOURCES)
                -D SELFTEST_CASE=$(subst copyuser_64_t,,$(notdir $@)) \
                -o $@ $^
 
-$(OUTPUT)/copyuser_p7_t%:      copyuser_power7.S $(EXTRA_SOURCES)
+$(OUTPUT)/copyuser_p7: copyuser_power7.S $(EXTRA_SOURCES)
        $(CC) $(CPPFLAGS) $(CFLAGS) \
                -D COPY_LOOP=test___copy_tofrom_user_power7 \
-               -D SELFTEST_CASE=$(subst copyuser_p7_t,,$(notdir $@)) \
+               -o $@ $^
+
+$(OUTPUT)/copyuser_p7_vmx:       copyuser_power7.S $(EXTRA_SOURCES) ../utils.c
+       $(CC) $(CPPFLAGS) $(CFLAGS) \
+               -D COPY_LOOP=test___copy_tofrom_user_power7_vmx \
+               -D VMX_TEST \
                -o $@ $^
 
 # Strictly speaking, we only need the memcpy_64 test cases for big-endian
index ec8bcf2bf1c274c1274bbe49f759170a90dd6e12..3a9cb8c9a3eed2e8ca1c2805eb0009518ff51019 100644 (file)
@@ -1,13 +1,5 @@
 #include <asm/ppc_asm.h>
 
-FUNC_START(enter_vmx_usercopy)
-       li      r3,1
-       blr
-
-FUNC_START(exit_vmx_usercopy)
-       li      r3,0
-       blr
-
 FUNC_START(enter_vmx_ops)
        li      r3,1
        blr
index 0f6873618552339b537cab5fa7939b0b23e1b8d4..fb822534fbe956e747129c9ad3c0337e6be8059b 100644 (file)
 #define BUFLEN (MAX_LEN+MAX_OFFSET+2*MIN_REDZONE)
 #define POISON 0xa5
 
+#ifdef VMX_TEST
+#define VMX_COPY_THRESHOLD 3328
+#endif
+
 unsigned long COPY_LOOP(void *to, const void *from, unsigned long size);
 
 static void do_one(char *src, char *dst, unsigned long src_off,
@@ -81,8 +85,12 @@ int test_copy_loop(void)
        /* Fill with sequential bytes */
        for (i = 0; i < BUFLEN; i++)
                fill[i] = i & 0xff;
-
+#ifdef VMX_TEST
+       /* Force sizes above kernel VMX threshold (3328) */
+       for (len = VMX_COPY_THRESHOLD + 1; len < MAX_LEN; len++) {
+#else
        for (len = 1; len < MAX_LEN; len++) {
+#endif
                for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
                        for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
                                do_one(src, dst, src_off, dst_off, len,
@@ -96,5 +104,10 @@ int test_copy_loop(void)
 
 int main(void)
 {
+#ifdef VMX_TEST
+       /* Skip if Altivec not present */
+       SKIP_IF_MSG(!have_hwcap(PPC_FEATURE_HAS_ALTIVEC), "ALTIVEC not supported");
+#endif
+
        return test_harness(test_copy_loop, str(COPY_LOOP));
 }