public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: chrubis@suse.cz
To: Mike Frysinger <vapier@gentoo.org>
Cc: ltp-list@lists.sourceforge.net
Subject: Re: [LTP] [PATCH???v3] lib/cloner.c: add function ltp_clone7 when clone supports???7 arguments
Date: Thu, 9 Jan 2014 17:37:16 +0100	[thread overview]
Message-ID: <20140109163716.GA8938@rei> (raw)
In-Reply-To: <201401090947.12749.vapier@gentoo.org>

[-- Attachment #1: Type: text/plain, Size: 131 bytes --]

Hi!
And here is a patch. (note that it should be applied over the two
allready commited patches)

-- 
Cyril Hrubis
chrubis@suse.cz

[-- Attachment #2: 0001-lib-cloner.c-add-ltp_clone7-and-fix-build.patch --]
[-- Type: text/x-diff, Size: 7683 bytes --]

From eeb4ae48cb0dfcb3b89d1a368a8870dc5f35aae2 Mon Sep 17 00:00:00 2001
From: Zeng Linggang <zenglg.jy@cn.fujitsu.com>
Date: Thu, 9 Jan 2014 20:10:11 +0800
Subject: [PATCH 1/2] lib/cloner.c: add ltp_clone7() and fix build

The seven argument clone breaks compilation on older distributions
(SLES10, RHEL4, etc.). It was introduced by commit 5f5cb63b7ddb.

This commit adds a configure check and ltp_clone7() library function.

Now the ltp_clone() is the same old ltp_clone() with five arguments and
ltp_clone7() is the new one with eight arguments (but it calls clone
with seven arguments, thus the name).

Tests that does not need the additional arguments should call the
ltp_clone() the rest should call ltp_clone7(). If seven argument clone
is not supproted the ltp_clone7() will return -1 and set errno to
ENOSYS.

Signed-off-by: Zeng Linggang <zenglg.jy@cn.fujitsu.com>
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 configure.ac                              |  1 +
 include/test.h                            |  4 ++-
 lib/cloner.c                              | 55 ++++++++++++++++++++++---------
 m4/ltp-clone7args.m4                      | 38 +++++++++++++++++++++
 testcases/kernel/syscalls/clone/clone08.c |  9 +++--
 5 files changed, 88 insertions(+), 19 deletions(-)
 create mode 100644 m4/ltp-clone7args.m4

diff --git a/configure.ac b/configure.ac
index 4af7662..9e3df00 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_CLONE_SUPPORTS_7_ARGS
 
 AC_OUTPUT
diff --git a/include/test.h b/include/test.h
index ffc1c8c..5211aea 100644
--- a/include/test.h
+++ b/include/test.h
@@ -199,7 +199,9 @@ 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,
+int ltp_clone(unsigned long flags, int (*fn)(void *arg), void *arg,
+		size_t stack_size, void *stack);
+int ltp_clone7(unsigned long flags, int (*fn)(void *arg), void *arg,
 		size_t stack_size, void *stack, ...);
 int ltp_clone_malloc(unsigned long clone_flags, int (*fn)(void *arg),
 		void *arg, size_t stacksize);
diff --git a/lib/cloner.c b/lib/cloner.c
index cb4dc6e..d6aa428 100644
--- a/lib/cloner.c
+++ b/lib/cloner.c
@@ -18,7 +18,7 @@
  */
 
 #ifndef _GNU_SOURCE
-#define _GNU_SOURCE
+# define _GNU_SOURCE
 #endif
 
 #include <stdio.h>
@@ -29,6 +29,7 @@
 #include <sched.h>
 #include <stdarg.h>
 #include "test.h"
+#include "config.h"
 
 #undef clone			/* we want to use clone() */
 
@@ -39,30 +40,25 @@ extern int __clone2(int (*fn) (void *arg), void *child_stack_base,
 		    pid_t *parent_tid, void *tls, pid_t *child_tid);
 #endif
 
+#ifndef CLONE_SUPPORTS_7_ARGS
+# define clone(fn, stack, flags, arg, ptid, tls, ctid) \
+         clone(fn, stack, flags, arg)
+#endif
+
 /*
  * ltp_clone: wrapper for clone to hide the architecture dependencies.
  *   1. hppa takes bottom of stack and no stacksize (stack grows up)
  *   2. __ia64__ takes bottom of stack and uses clone2
  *   3. all others take top of stack (stack grows down)
  */
-int
-ltp_clone(unsigned long clone_flags, int (*fn) (void *arg), void *arg,
-	  size_t stack_size, void *stack, ...)
+static int
+ltp_clone_(unsigned long flags, int (*fn)(void *arg), void *arg,
+	   size_t stack_size, void *stack, pid_t *ptid, void *tls, pid_t *ctid)
 {
 	int ret;
-	pid_t *parent_tid, *child_tid;
-	void *tls;
-	va_list arg_clone;
-
-	va_start(arg_clone, stack);
-	parent_tid = va_arg(arg_clone, pid_t *);
-	tls = va_arg(arg_clone, void *);
-	child_tid = va_arg(arg_clone, pid_t *);
-	va_end(arg_clone);
 
 #if defined(__ia64__)
-	ret = clone2(fn, stack, stack_size, clone_flags, arg,
-		     parent_tid, tls, child_tid);
+	ret = clone2(fn, stack, stack_size, flags, arg, ptid, tls, ctid);
 #else
 # if defined(__hppa__) || defined(__metag__)
 	/*
@@ -78,12 +74,39 @@ ltp_clone(unsigned long clone_flags, int (*fn) (void *arg), void *arg,
 		stack += stack_size;
 # endif
 
-	ret = clone(fn, stack, clone_flags, arg, parent_tid, tls, child_tid);
+	ret = clone(fn, stack, flags, arg, ptid, tls, ctid);
 #endif
 
 	return ret;
 }
 
+int ltp_clone(unsigned long flags, int (*fn)(void *arg), void *arg,
+              size_t stack_size, void *stack)
+{
+	return ltp_clone_(flags, fn, arg, stack_size, stack, NULL, NULL, NULL);
+}
+
+int ltp_clone7(unsigned long flags, int (*fn)(void *arg), void *arg,
+               size_t stack_size, void *stack, ...)
+{
+	pid_t *ptid, *ctid;
+	void *tls;
+	va_list arg_clone;
+
+	va_start(arg_clone, stack);
+	ptid = va_arg(arg_clone, pid_t *);
+	tls = va_arg(arg_clone, void *);
+	ctid = va_arg(arg_clone, pid_t *);
+	va_end(arg_clone);
+
+#ifdef CLONE_SUPPORTS_7_ARGS
+	return ltp_clone_(flags, fn, arg, stack_size, stack, ptid, tls, ctid);
+#else
+	errno = ENOSYS;
+	return -1;
+#endif
+}
+
 /*
  * ltp_clone_malloc: also does the memory allocation for clone with a
  * caller-specified size.
diff --git a/m4/ltp-clone7args.m4 b/m4/ltp-clone7args.m4
new file mode 100644
index 0000000..5857575
--- /dev/null
+++ b/m4/ltp-clone7args.m4
@@ -0,0 +1,38 @@
+dnl
+dnl Copyright (c) Linux Test Project, 2014
+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_CLONE_SUPPORTS_7_ARGS
+dnl -------------------------------
+dnl
+AC_DEFUN([LTP_CHECK_CLONE_SUPPORTS_7_ARGS],[
+AH_TEMPLATE(CLONE_SUPPORTS_7_ARGS,
+[Define to 1 if clone() supports 7 arguments.])
+AC_MSG_CHECKING([if clone() supports 7 args])
+AC_TRY_LINK([#define _GNU_SOURCE
+		#include <sched.h>
+		#include <stdlib.h>],
+		[
+		#ifdef __ia64__
+		__clone2(NULL, NULL, 0, 0, NULL, NULL, NULL, NULL);
+		#else
+		clone(NULL, NULL, 0, NULL, NULL, NULL, NULL);
+		#endif
+		],
+		AC_DEFINE(CLONE_SUPPORTS_7_ARGS) 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 b098f4a..1258b4e 100644
--- a/testcases/kernel/syscalls/clone/clone08.c
+++ b/testcases/kernel/syscalls/clone/clone08.c
@@ -24,6 +24,8 @@
 #include "safe_macros.h"
 #include "linux_syscall_numbers.h"
 
+char *TCID = "clone08";
+
 static pid_t ptid, ctid, tgid;
 static void *child_stack;
 
@@ -76,7 +78,6 @@ static struct test_case {
 	 test_clone_thread, child_clone_thread},
 };
 
-char *TCID = "clone08";
 int TST_TOTAL = ARRAY_SIZE(test_cases);
 
 int main(int ac, char **av)
@@ -122,8 +123,12 @@ static void cleanup(void)
 
 static long clone_child(const struct test_case *t, int use_tst)
 {
-	TEST(ltp_clone(t->flags, t->do_child, NULL, CHILD_STACK_SIZE,
+	TEST(ltp_clone7(t->flags, t->do_child, NULL, CHILD_STACK_SIZE,
 		child_stack, &ptid, NULL, &ctid));
+
+	if (TEST_RETURN == -1 && TTERRNO == ENOSYS)
+		tst_brmk(TCONF, cleanup, "clone does not support 7 args");
+
 	if (TEST_RETURN == -1) {
 		if (use_tst) {
 			tst_brkm(TBROK | TTERRNO, cleanup, "%s clone() failed",
-- 
1.8.3.2


[-- Attachment #3: Type: text/plain, Size: 388 bytes --]

------------------------------------------------------------------------------
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

[-- Attachment #4: Type: text/plain, Size: 155 bytes --]

_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

  parent reply	other threads:[~2014-01-09 16:37 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-18  9:29 [LTP] [PATCH v5 1/2] lib/cloner.c: add more args zenglg.jy
2013-12-23  1:11 ` Wanlong Gao
2014-01-07 14:09 ` chrubis
     [not found]   ` <1389181297.2879.11.camel@G08JYZSD130126>
2014-01-08 13:20     ` chrubis
     [not found]   ` <1389191490.2879.27.camel@G08JYZSD130126>
2014-01-08 15:15     ` [LTP] [PATCH] clone/clone08.c: check whether clone supports 7 arguments chrubis
     [not found]       ` <1389254938.2025.3.camel@G08JYZSD130126>
2014-01-09 11:36         ` chrubis
     [not found]           ` <1389269411.2149.8.camel@G08JYZSD130126>
2014-01-09 13:27             ` [LTP] [PATCH???v3] lib/cloner.c: add function ltp_clone7 when clone supports???7 arguments chrubis
     [not found]             ` <201401090947.12749.vapier@gentoo.org>
2014-01-09 15:04               ` chrubis
2014-01-09 16:37               ` chrubis [this message]
     [not found]                 ` <629935924.13499645.1389289589284.JavaMail.root@redhat.com>
2014-01-09 18:08                   ` chrubis
     [not found]                     ` <201401091417.16506.vapier@gentoo.org>
2014-01-13 16:02                       ` chrubis
     [not found]     ` <201401081447.46449.vapier@gentoo.org>
2014-01-09 11:24       ` [LTP] [PATCH] clone/clone08.c: check whether clone supports 7 arguments chrubis
     [not found]     ` <201401090803.39606.vapier@gentoo.org>
2014-01-09 13:09       ` chrubis
     [not found]         ` <201401090900.59568.vapier@gentoo.org>
2014-01-09 14:34           ` chrubis
2014-01-09 13:23       ` Jan Stancek
2014-01-09 13:51         ` Mike Frysinger
2014-01-09 14:10           ` Jan Stancek
2014-01-09 14:30             ` Mike Frysinger
2014-01-09 14:39               ` chrubis

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140109163716.GA8938@rei \
    --to=chrubis@suse.cz \
    --cc=ltp-list@lists.sourceforge.net \
    --cc=vapier@gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox