Message ID | 20230213134619.27486-1-wegao@suse.com |
---|---|
State | Superseded |
Headers | show |
Series | [v1] rseq01: basic test rseq | expand |
Hi! > Add basic check for the newly added glibc API in LTP. > This test references the glibc test case tst-rseq.c. > > Signed-off-by: Wei Gao <wegao@suse.com> > --- > runtest/syscalls | 2 + > testcases/kernel/syscalls/rseq/.gitignore | 1 + > testcases/kernel/syscalls/rseq/Makefile | 7 +++ > testcases/kernel/syscalls/rseq/rseq01.c | 74 +++++++++++++++++++++++ > 4 files changed, 84 insertions(+) > create mode 100644 testcases/kernel/syscalls/rseq/.gitignore > create mode 100644 testcases/kernel/syscalls/rseq/Makefile > create mode 100644 testcases/kernel/syscalls/rseq/rseq01.c > > diff --git a/runtest/syscalls b/runtest/syscalls > index ae37a1192..f46950b27 100644 > --- a/runtest/syscalls > +++ b/runtest/syscalls > @@ -1752,6 +1752,8 @@ copy_file_range01 copy_file_range01 > copy_file_range02 copy_file_range02 > copy_file_range03 copy_file_range03 > > +rseq01 rseq01 > + > statx01 statx01 > statx02 statx02 > statx03 statx03 > diff --git a/testcases/kernel/syscalls/rseq/.gitignore b/testcases/kernel/syscalls/rseq/.gitignore > new file mode 100644 > index 000000000..8a6c7ee36 > --- /dev/null > +++ b/testcases/kernel/syscalls/rseq/.gitignore > @@ -0,0 +1 @@ > +/rseq01 > diff --git a/testcases/kernel/syscalls/rseq/Makefile b/testcases/kernel/syscalls/rseq/Makefile > new file mode 100644 > index 000000000..159d5651c > --- /dev/null > +++ b/testcases/kernel/syscalls/rseq/Makefile > @@ -0,0 +1,7 @@ > +# SPDX-License-Identifier: GPL-2.0-or-later > +# Copyright (C) 2012 Linux Test Project, Inc. > + > +top_srcdir ?= ../../../.. > + > +include $(top_srcdir)/include/mk/testcases.mk > +include $(top_srcdir)/include/mk/generic_leaf_target.mk > diff --git a/testcases/kernel/syscalls/rseq/rseq01.c b/testcases/kernel/syscalls/rseq/rseq01.c > new file mode 100644 > index 000000000..ac096471e > --- /dev/null > +++ b/testcases/kernel/syscalls/rseq/rseq01.c > @@ -0,0 +1,74 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (C) 2021-2023 Free Software Foundation, Inc. > + * > + * 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/>. This part that says anything about GNU C Library shouldn't be there, the copyright itself should be enough to keep the reference where the code came from. > + * Restartable Sequences single-threaded tests. > + * These tests validate that rseq is registered from main in an executable > + * not linked against libpthread. > + */ This should be changed into docparse readable description. > +#define _GNU_SOURCE > +#include <errno.h> > +#include <stdio.h> > +#include <unistd.h> > +#include "tst_test.h" > +#include <stdbool.h> > + > +#if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 35)) > +# include <sys/rseq.h> > +#endif > + > +#ifdef RSEQ_SIG > +# include <stdlib.h> > +# include <string.h> > +# include <syscall.h> > +# include <sched.h> > + > +static int sys_rseq(struct rseq *rseq_abi, uint32_t rseq_len, int flags, uint32_t sig) > +{ > + return syscall(__NR_rseq, rseq_abi, rseq_len, flags, sig); > +} Can we please add a configure cehck and a fallback header into a lapi/ ? LTP runs on different libc implmentations and such ifdefs shouldn't be used at all. > +static void check_rseq_available(void) > +{ > + int rc; > + > + rc = sys_rseq(NULL, 0, 0, 0); > + if (rc != -1) > + tst_brk(TFAIL | TTERRNO, "Unexpected rseq return value %d ", rc); > + switch (errno) { > + case ENOSYS: > + tst_res(TCONF, > + "kernel does not support rseq, skipping test"); > + case EINVAL: > + /* rseq is implemented, but detected an invalid rseq_len parameter. */ > + break; > + default: > + tst_brk(TFAIL | TTERRNO, "Unexpected rseq error "); > + } > +} > + > +static void run(void) > +{ > + check_rseq_available(); > + > + TST_EXP_PASS(!(sched_getcpu() >= 0)); > +} > +#else /* RSEQ_SIG */ > + > +static void run(void) > +{ > + tst_res(TCONF, > + "glibc does not define RSEQ_SIG, skipping test"); > +} > + > +#endif /* RSEQ_SIG */ > + > +static struct tst_test test = { > + .test_all = run, > + .needs_root = 1, > +}; > -- > 2.35.3 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp
diff --git a/runtest/syscalls b/runtest/syscalls index ae37a1192..f46950b27 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -1752,6 +1752,8 @@ copy_file_range01 copy_file_range01 copy_file_range02 copy_file_range02 copy_file_range03 copy_file_range03 +rseq01 rseq01 + statx01 statx01 statx02 statx02 statx03 statx03 diff --git a/testcases/kernel/syscalls/rseq/.gitignore b/testcases/kernel/syscalls/rseq/.gitignore new file mode 100644 index 000000000..8a6c7ee36 --- /dev/null +++ b/testcases/kernel/syscalls/rseq/.gitignore @@ -0,0 +1 @@ +/rseq01 diff --git a/testcases/kernel/syscalls/rseq/Makefile b/testcases/kernel/syscalls/rseq/Makefile new file mode 100644 index 000000000..159d5651c --- /dev/null +++ b/testcases/kernel/syscalls/rseq/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2012 Linux Test Project, Inc. + +top_srcdir ?= ../../../.. + +include $(top_srcdir)/include/mk/testcases.mk +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/syscalls/rseq/rseq01.c b/testcases/kernel/syscalls/rseq/rseq01.c new file mode 100644 index 000000000..ac096471e --- /dev/null +++ b/testcases/kernel/syscalls/rseq/rseq01.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2021-2023 Free Software Foundation, Inc. + * + * 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/>. + * + * Restartable Sequences single-threaded tests. + * These tests validate that rseq is registered from main in an executable + * not linked against libpthread. + */ + +#define _GNU_SOURCE +#include <errno.h> +#include <stdio.h> +#include <unistd.h> +#include "tst_test.h" +#include <stdbool.h> + +#if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 35)) +# include <sys/rseq.h> +#endif + +#ifdef RSEQ_SIG +# include <stdlib.h> +# include <string.h> +# include <syscall.h> +# include <sched.h> + +static int sys_rseq(struct rseq *rseq_abi, uint32_t rseq_len, int flags, uint32_t sig) +{ + return syscall(__NR_rseq, rseq_abi, rseq_len, flags, sig); +} + +static void check_rseq_available(void) +{ + int rc; + + rc = sys_rseq(NULL, 0, 0, 0); + if (rc != -1) + tst_brk(TFAIL | TTERRNO, "Unexpected rseq return value %d ", rc); + switch (errno) { + case ENOSYS: + tst_res(TCONF, + "kernel does not support rseq, skipping test"); + case EINVAL: + /* rseq is implemented, but detected an invalid rseq_len parameter. */ + break; + default: + tst_brk(TFAIL | TTERRNO, "Unexpected rseq error "); + } +} + +static void run(void) +{ + check_rseq_available(); + + TST_EXP_PASS(!(sched_getcpu() >= 0)); +} +#else /* RSEQ_SIG */ + +static void run(void) +{ + tst_res(TCONF, + "glibc does not define RSEQ_SIG, skipping test"); +} + +#endif /* RSEQ_SIG */ + +static struct tst_test test = { + .test_all = run, + .needs_root = 1, +};
Add basic check for the newly added glibc API in LTP. This test references the glibc test case tst-rseq.c. Signed-off-by: Wei Gao <wegao@suse.com> --- runtest/syscalls | 2 + testcases/kernel/syscalls/rseq/.gitignore | 1 + testcases/kernel/syscalls/rseq/Makefile | 7 +++ testcases/kernel/syscalls/rseq/rseq01.c | 74 +++++++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 testcases/kernel/syscalls/rseq/.gitignore create mode 100644 testcases/kernel/syscalls/rseq/Makefile create mode 100644 testcases/kernel/syscalls/rseq/rseq01.c