diff mbox series

[v2,5/6] scripts: Added Vector Length Set test helper script

Message ID 20210512092922.901289-1-naohirot@fujitsu.com
State New
Headers show
Series aarch64: Added optimized memcpy/memmove/memset for A64FX | expand

Commit Message

Naohiro Tamura May 12, 2021, 9:29 a.m. UTC
From: Naohiro Tamura <naohirot@jp.fujitsu.com>

This patch is a test helper script to change Vector Length for child
process. This script can be used as test-wrapper for 'make check'.

Usage examples:

ubuntu@bionic:~/build$ make check subdirs=string \
test-wrapper='~/glibc/scripts/vltest.py 16'

ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 16 make test \
t=string/test-memcpy

ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 32 ./debugglibc.sh \
string/test-memmove

ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 64 ./testrun.sh
string/test-memset
---
 scripts/vltest.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 82 insertions(+)
 create mode 100755 scripts/vltest.py

Comments

Joseph Myers May 12, 2021, 4:58 p.m. UTC | #1
On Wed, 12 May 2021, Naohiro Tamura wrote:

> From: Naohiro Tamura <naohirot@jp.fujitsu.com>
> 
> This patch is a test helper script to change Vector Length for child
> process. This script can be used as test-wrapper for 'make check'.

This is specific to AArch64, so I think it would better go under 
sysdeps/unix/sysv/linux/aarch64/ rather than under scripts/.

There is also the question of how to make this discoverable to people 
developing glibc.  Maybe this script should be mentioned in install.texi 
(with INSTALL regenerated accordingly), with the documentation there 
clearly explaining that it's specific to AArch64 GNU/Linux.
Naohiro Tamura May 13, 2021, 9:53 a.m. UTC | #2
Hi Joseph,

Thank you for the review.

> From: Joseph Myers <joseph@codesourcery.com>

> > This patch is a test helper script to change Vector Length for child
> > process. This script can be used as test-wrapper for 'make check'.
> 
> This is specific to AArch64, so I think it would better go under
> sysdeps/unix/sysv/linux/aarch64/ rather than under scripts/.

OK, I moved it to sysdeps/unix/sysv/linux/aarch64/.

> There is also the question of how to make this discoverable to people developing
> glibc.  Maybe this script should be mentioned in install.texi (with INSTALL
> regenerated accordingly), with the documentation there clearly explaining that it's
> specific to AArch64 GNU/Linux.

OK, I updated install.texi, INSTALL, vlset.py doc part as well as commit message
such as the followings or my github [1].

[1] https://github.com/NaohiroTamura/glibc/commit/37a5832fea109ab939ffdf58a2a19d5707849cc5

[commit message] aarch64: Added Vector Length Set test helper script

This patch is a test helper script to change Vector Length for child
process. This script can be used as test-wrapper for 'make check'.

Usage examples:

~/build$ make check subdirs=string \
test-wrapper='~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16'

~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16 \
make test t=string/test-memcpy

~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 32 \
./debugglibc.sh string/test-memmove

~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 64 \
./testrun.sh string/test-memset
---
 INSTALL                                   |  4 ++
 manual/install.texi                       |  3 +
 sysdeps/unix/sysv/linux/aarch64/vltest.py | 82 +++++++++++++++++++++++
 3 files changed, 89 insertions(+)
 create mode 100755 sysdeps/unix/sysv/linux/aarch64/vltest.py

diff --git a/INSTALL b/INSTALL
index 065a568585..bc761ab98b 100644
--- a/INSTALL
+++ b/INSTALL
@@ -380,6 +380,10 @@ the same syntax as 'test-wrapper-env', the only difference in its
 semantics being starting with an empty set of environment variables
 rather than the ambient set.

+   For AArch64 with SVE, when testing the GNU C Library, 'test-wrapper'
+may be set to "SRCDIR/sysdeps/unix/sysv/linux/aarch64/vltest.py
+VECTOR-LENGTH" to change Vector Length.
+
 Installing the C Library
 ========================

diff --git a/manual/install.texi b/manual/install.texi
index eb41fbd0b5..f1d858fb78 100644
--- a/manual/install.texi
+++ b/manual/install.texi
@@ -418,6 +418,9 @@ use has the same syntax as @samp{test-wrapper-env}, the only
 difference in its semantics being starting with an empty set of
 environment variables rather than the ambient set.

+For AArch64 with SVE, when testing @theglibc{}, @samp{test-wrapper}
+may be set to "@var{srcdir}/sysdeps/unix/sysv/linux/aarch64/vltest.py
+@var{vector-length}" to change Vector Length.

 @node Running make install
 @appendixsec Installing the C Library
diff --git a/sysdeps/unix/sysv/linux/aarch64/vltest.py b/sysdeps/unix/sysv/linux/aarch64/vltest.py
new file mode 100755
index 0000000000..bed62ad151
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/aarch64/vltest.py
@@ -0,0 +1,82 @@
+#!/usr/bin/python3
+# Set Scalable Vector Length test helper
+# Copyright (C) 2021 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+#
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <https://www.gnu.org/licenses/>.
+"""Set Scalable Vector Length test helper.
+
+Set Scalable Vector Length for child process.
+
+examples:
+
+~/build$ make check subdirs=string \
+test-wrapper='~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16'
+
+~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16 \
+make test t=string/test-memcpy
+
+~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 32 \
+./debugglibc.sh string/test-memmove
+
+~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 64 \
+./testrun.sh string/test-memset
+"""

Thanks.
Naohiro
diff mbox series

Patch

diff --git a/scripts/vltest.py b/scripts/vltest.py
new file mode 100755
index 0000000000..264dfa449f
--- /dev/null
+++ b/scripts/vltest.py
@@ -0,0 +1,82 @@ 
+#!/usr/bin/python3
+# Set Scalable Vector Length test helper
+# Copyright (C) 2019-2021 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+#
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with the GNU C Library; if not, see
+# <https://www.gnu.org/licenses/>.
+"""Set Scalable Vector Length test helper.
+
+Set Scalable Vector Length for child process.
+
+examples:
+
+ubuntu@bionic:~/build$ make check subdirs=string \
+test-wrapper='~/glibc/scripts/vltest.py 16'
+
+ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 16 make test \
+t=string/test-memcpy
+
+ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 32 ./debugglibc.sh \
+string/test-memmove
+
+ubuntu@bionic:~/build$ ~/glibc/scripts/vltest.py 64 ./testrun.sh \
+string/test-memset
+"""
+import argparse
+from ctypes import cdll, CDLL
+import os
+import sys
+
+EXIT_SUCCESS = 0
+EXIT_FAILURE = 1
+EXIT_UNSUPPORTED = 77
+
+AT_HWCAP = 16
+HWCAP_SVE = (1 << 22)
+
+PR_SVE_GET_VL = 51
+PR_SVE_SET_VL = 50
+PR_SVE_SET_VL_ONEXEC = (1 << 18)
+PR_SVE_VL_INHERIT = (1 << 17)
+PR_SVE_VL_LEN_MASK = 0xffff
+
+def main(args):
+    libc = CDLL("libc.so.6")
+    if not libc.getauxval(AT_HWCAP) & HWCAP_SVE:
+        print("CPU doesn't support SVE")
+        sys.exit(EXIT_UNSUPPORTED)
+
+    libc.prctl(PR_SVE_SET_VL,
+               args.vl[0] | PR_SVE_SET_VL_ONEXEC | PR_SVE_VL_INHERIT)
+    os.execvp(args.args[0], args.args)
+    print("exec system call failure")
+    sys.exit(EXIT_FAILURE)
+
+if __name__ == '__main__':
+    parser = argparse.ArgumentParser(description=
+            "Set Scalable Vector Length test helper",
+            formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+
+    # positional argument
+    parser.add_argument("vl", nargs=1, type=int,
+                        choices=range(16, 257, 16),
+                        help=('vector length '\
+                              'which is multiples of 16 from 16 to 256'))
+    # remainDer arguments
+    parser.add_argument('args', nargs=argparse.REMAINDER,
+                        help=('args '\
+                              'which is passed to child process'))
+    args = parser.parse_args()
+    main(args)