On Wed, 2014-01-08 at 16:15 +0100, chru...@suse.cz wrote: > Hi! > > Create m4/ltp-clone7args.m4 to check whether clone support 7 arguments. > > When HAVE_CLONE7ARGS is not defined, make clone08 return TCONF > > > > Signed-off-by: Zeng Linggang <zenglg...@cn.fujitsu.com> > > --- > > configure.ac | 1 + > > include/test.h | 9 +++++++- > > lib/cloner.c | 24 +++++++++++++++++++++ > > m4/ltp-clone7args.m4 | 36 > > +++++++++++++++++++++++++++++++ > > testcases/kernel/syscalls/clone/clone08.c | 14 ++++++++++++ > > 5 files changed, 83 insertions(+), 1 deletion(-) > > create mode 100644 m4/ltp-clone7args.m4 > > > > diff --git a/configure.ac b/configure.ac > > index 4af7662..e564ee5 100644 > > --- a/configure.ac > > +++ b/configure.ac > > @@ -171,5 +171,6 @@ LTP_CHECK_FS_IOC_FLAGS > > LTP_CHECK_MREMAP_FIXED > > LTP_CHECK_KERNEL_DEVEL > > LTP_CHECK_XFS_QUOTACTL > > +LTP_CHECK_CLONE7ARGS > > > > AC_OUTPUT > > diff --git a/include/test.h b/include/test.h > > index ffc1c8c..050dba5 100644 > > --- a/include/test.h > > +++ b/include/test.h > > @@ -46,6 +46,7 @@ > > #include "tst_checkpoint.h" > > #include "tst_process_state.h" > > #include "tst_resource.h" > > +#include "config.h" > > > > /* Use low 6 bits to encode test type */ > > #define TTYPE_MASK 0x3f > > @@ -199,8 +200,14 @@ void maybe_run_child(void (*child)(), char *fmt, ...); > > int self_exec(char *argv0, char *fmt, ...); > > > > /* Functions from lib/cloner.c */ > > -int ltp_clone(unsigned long clone_flags, int (*fn)(void *arg), void *arg, > > +#ifdef HAVE_CLONE7ARGS > > +int ltp_clone(unsigned long clone_flags, int (*fn) (void *arg), void *arg, > > size_t stack_size, void *stack, ...); > > +#else > > +int ltp_clone(unsigned long clone_flags, int (*fn)(void *arg), void *arg, > > + size_t stack_size, void *stack); > > +#endif > > I wonder if having two different definitions is worth the trouble. > Because we can easily use the definition with the ... in both cases. > > The result is not optimal in either case. In the first case there would > be compilation failures on older distributions, in the second there is a > posibility that some of the arguments are ignored if test is not ifdefed > properly. I think I like the second case better. > Hi What do you think that we create a new ltp_clone7args function when the HAVE_CLONE7ARGS macro is defined. If so, the existing clone test cases will not be affected. And test cases, like clone08, need 7 arguments, using ltp_clone7args will be ok.
> > int ltp_clone_malloc(unsigned long clone_flags, int (*fn)(void *arg), > > void *arg, size_t stacksize); > > int ltp_clone_quick(unsigned long clone_flags, int (*fn)(void *arg), > > diff --git a/lib/cloner.c b/lib/cloner.c > > index 93e3f8c..e0c92cc 100644 > > --- a/lib/cloner.c > > +++ b/lib/cloner.c > > @@ -29,6 +29,7 @@ > > #include <sched.h> > > #include <stdarg.h> > > #include "test.h" > > +#include "config.h" > > > > #undef clone /* we want to use clone() */ > > > > @@ -49,6 +50,7 @@ extern int __clone2(int (*fn) (void *arg), void > > *child_stack_base, > > * 2. __ia64__ takes bottom of stack and uses clone2 > > * 3. all others take top of stack (stack grows down) > > */ > > +#ifdef HAVE_CLONE7ARGS > > int > > ltp_clone(unsigned long clone_flags, int (*fn) (void *arg), void *arg, > > size_t stack_size, void *stack, ...) > > @@ -80,6 +82,28 @@ ltp_clone(unsigned long clone_flags, int (*fn) (void > > *arg), void *arg, > > > > return ret; > > } > > +#else > > +int > > +ltp_clone(unsigned long clone_flags, int (*fn) (void *arg), void *arg, > > + size_t stack_size, void *stack) > > +{ > > + int ret; > > + > > +#if defined(__hppa__) || defined(__metag__) > > + ret = clone(fn, stack, clone_flags, arg); > > +#elif defined(__ia64__) > > + ret = clone2(fn, stack, stack_size, clone_flags, arg, NULL, NULL, NULL); > > +#else > > + /* > > + * For archs where stack grows downwards, stack points to the topmost > > + * address of the memory space set up for the child stack. > > + */ > > + ret = clone(fn, (stack ? stack + stack_size : NULL), clone_flags, arg); > > +#endif > > + > > + return ret; > > +} > > +#endif > > > > /* > > * ltp_clone_malloc: also does the memory allocation for clone with a > > diff --git a/m4/ltp-clone7args.m4 b/m4/ltp-clone7args.m4 > > new file mode 100644 > > index 0000000..927c9f8 > > --- /dev/null > > +++ b/m4/ltp-clone7args.m4 > > @@ -0,0 +1,36 @@ > > +dnl > > +dnl Copyright (c) Linux Test Project, 2013 > > +dnl > > +dnl This program is free software; you can redistribute it and/or modify > > +dnl it under the terms of the GNU General Public License as published by > > +dnl the Free Software Foundation; either version 2 of the License, or > > +dnl (at your option) any later version. > > +dnl > > +dnl This program is distributed in the hope that it will be useful, > > +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of > > +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See > > +dnl the GNU General Public License for more details. > > +dnl > > +dnl You should have received a copy of the GNU General Public License > > +dnl along with this program; if not, write to the Free Software > > +dnl Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > > 02110-1301 USA > > +dnl > > + > > +dnl > > +dnl LTP_CHECK_CLONE7ARGS > > +dnl ---------------------------- > > +dnl > > +AC_DEFUN([LTP_CHECK_CLONE7ARGS],[ > > +AH_TEMPLATE(HAVE_CLONE7ARGS, > > +[Define to 1 if clone() supports 7 arguments.]) > > +AC_MSG_CHECKING([for CLONE7ARGS]) > > +AC_TRY_LINK([#define _GNU_SOURCE > > + #include <sched.h> > > + #include <stdlib.h>], > > + [ > > + #if !defined(__ia64__) > > + clone(NULL, NULL, 0, NULL, NULL, NULL, NULL); > > + #endif > > + ], > > + AC_DEFINE(HAVE_CLONE7ARGS) AC_MSG_RESULT(yes), > > AC_MSG_RESULT(no)) > > +]) > > diff --git a/testcases/kernel/syscalls/clone/clone08.c > > b/testcases/kernel/syscalls/clone/clone08.c > > index ec559a3..3a70a49 100644 > > --- a/testcases/kernel/syscalls/clone/clone08.c > > +++ b/testcases/kernel/syscalls/clone/clone08.c > > @@ -23,6 +23,9 @@ > > #include "clone_platform.h" > > #include "safe_macros.h" > > #include "linux_syscall_numbers.h" > > +#include "config.h" > > + > > +#ifdef HAVE_CLONE7ARGS > > > > static pid_t ptid, ctid, tgid; > > static void *child_stack; > > @@ -305,3 +308,14 @@ static int child_clone_thread(void) > > ltp_syscall(__NR_exit, 0); > > return 0; > > } > > + > > +#else > > + > > +char *TCID = "clone08"; > > + > > +int main(int ac, char **av) > > +{ > > + tst_brkm(TCONF, NULL, "This test needs clone support " > > + "7 args"); > > Is this string really over 80 chars? > > Also in this case it should be main(void) to avoid unused warnings. > > And I would rather see one TCID and TST_TOTAL at the top of the test > (before the #ifdef HAVE_CLONE7ARGS). In clone08, TCID really should be put at the top, sorry. But TST_TOTAL is computed by ARRAY_SIZE(test_cases) when macro HAVE_CLONE7ARGS is defined. When not defined, TST_TOTAL should be 1. It seems that we couldn't put the TST_TOTAL at the top. > > > +} > > +#endif > > -- > > 1.8.4.2 > > > > > > > ------------------------------------------------------------------------------ CenturyLink Cloud: The Leader in Enterprise Cloud Services. Learn Why More Businesses Are Choosing CenturyLink Cloud For Critical Workloads, Development Environments & Everything In Between. Get a Quote or Start a Free Trial Today. http://pubads.g.doubleclick.net/gampad/clk?id=119420431&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list