* [LTP] [PATCH] waitpid/waitpid03: break test if fork failed
@ 2016-04-12 13:22 Han Pingtian
2016-04-12 15:52 ` Cyril Hrubis
0 siblings, 1 reply; 8+ messages in thread
From: Han Pingtian @ 2016-04-12 13:22 UTC (permalink / raw)
To: ltp
If continue after the fork failure, a lot of processes may be killed by
the kill() on line 125.
Signed-off-by: Han Pingtian <hanpt@linux.vnet.ibm.com>
---
testcases/kernel/syscalls/waitpid/waitpid03.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/testcases/kernel/syscalls/waitpid/waitpid03.c b/testcases/kernel/syscalls/waitpid/waitpid03.c
index 2599a92..648870c 100644
--- a/testcases/kernel/syscalls/waitpid/waitpid03.c
+++ b/testcases/kernel/syscalls/waitpid/waitpid03.c
@@ -106,7 +106,8 @@ int main(int argc, char **argv)
if (DEBUG)
tst_resm(TINFO, "child # %d", ikids);
} else if (pid[ikids] == -1) {
- tst_resm(TFAIL, "cannot open fork #%d", ikids);
+ tst_brkm(TBROK|TERRNO, cleanup,
+ "cannot open fork #%d", ikids);
} else {
#ifdef UCLINUX
if (self_exec(argv[0], "d", ikids) < 0) {
--
1.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [LTP] [PATCH] waitpid/waitpid03: break test if fork failed
2016-04-12 13:22 [LTP] [PATCH] waitpid/waitpid03: break test if fork failed Han Pingtian
@ 2016-04-12 15:52 ` Cyril Hrubis
2016-04-13 3:29 ` Han Pingtian
2016-04-13 6:58 ` Han Pingtian
0 siblings, 2 replies; 8+ messages in thread
From: Cyril Hrubis @ 2016-04-12 15:52 UTC (permalink / raw)
To: ltp
Hi!
> - tst_resm(TFAIL, "cannot open fork #%d", ikids);
> + tst_brkm(TBROK|TERRNO, cleanup,
> + "cannot open fork #%d", ikids);
I guess that we should kill any of the allready sleeping children at this point.
If we move the pid[] array to be global we can create a kill_children()
function to send a signal to all pids in pid[] that are > 0 and call it
if fork fails with SIGKILL as well as from the main loop with the
SIGTERM as well.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 8+ messages in thread
* [LTP] [PATCH] waitpid/waitpid03: break test if fork failed
2016-04-12 15:52 ` Cyril Hrubis
@ 2016-04-13 3:29 ` Han Pingtian
2016-04-13 12:51 ` Cyril Hrubis
2016-04-13 6:58 ` Han Pingtian
1 sibling, 1 reply; 8+ messages in thread
From: Han Pingtian @ 2016-04-13 3:29 UTC (permalink / raw)
To: ltp
On Tue, Apr 12, 2016 at 05:52:41PM +0200, Cyril Hrubis wrote:
> Hi!
> > - tst_resm(TFAIL, "cannot open fork #%d", ikids);
> > + tst_brkm(TBROK|TERRNO, cleanup,
> > + "cannot open fork #%d", ikids);
>
> I guess that we should kill any of the allready sleeping children at this point.
>
> If we move the pid[] array to be global we can create a kill_children()
> function to send a signal to all pids in pid[] that are > 0 and call it
> if fork fails with SIGKILL as well as from the main loop with the
> SIGTERM as well.
>
Thanks. How about this one? I think it is simple and enough for the
purpose.
From 5ec101da361dae875fc3f9293cf4ec65be8bbb93 Mon Sep 17 00:00:00 2001
From: Han Pingtian <hanpt@linux.vnet.ibm.com>
Date: Tue, 12 Apr 2016 11:12:28 +0800
Subject: [PATCH] waitpid/waitpid03: break test if fork failed
If continue after the fork failure, a lot of processes may be killed by
the kill() on line 125.
Signed-off-by: Han Pingtian <hanpt@linux.vnet.ibm.com>
---
testcases/kernel/syscalls/waitpid/waitpid03.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/testcases/kernel/syscalls/waitpid/waitpid03.c b/testcases/kernel/syscalls/waitpid/waitpid03.c
index 2599a92..ba4be50 100644
--- a/testcases/kernel/syscalls/waitpid/waitpid03.c
+++ b/testcases/kernel/syscalls/waitpid/waitpid03.c
@@ -106,7 +106,13 @@ int main(int argc, char **argv)
if (DEBUG)
tst_resm(TINFO, "child # %d", ikids);
} else if (pid[ikids] == -1) {
- tst_resm(TFAIL, "cannot open fork #%d", ikids);
+ int i;
+
+ for (i = 1; i < ikids; i++)
+ kill(pid[i], 9);
+
+ tst_brkm(TBROK|TERRNO, cleanup,
+ "cannot open fork #%d", ikids);
} else {
#ifdef UCLINUX
if (self_exec(argv[0], "d", ikids) < 0) {
--
1.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [LTP] [PATCH] waitpid/waitpid03: break test if fork failed
2016-04-12 15:52 ` Cyril Hrubis
2016-04-13 3:29 ` Han Pingtian
@ 2016-04-13 6:58 ` Han Pingtian
2016-04-13 12:55 ` Cyril Hrubis
1 sibling, 1 reply; 8+ messages in thread
From: Han Pingtian @ 2016-04-13 6:58 UTC (permalink / raw)
To: ltp
On Tue, Apr 12, 2016 at 05:52:41PM +0200, Cyril Hrubis wrote:
> Hi!
> > - tst_resm(TFAIL, "cannot open fork #%d", ikids);
> > + tst_brkm(TBROK|TERRNO, cleanup,
> > + "cannot open fork #%d", ikids);
>
> I guess that we should kill any of the allready sleeping children at this point.
>
> If we move the pid[] array to be global we can create a kill_children()
> function to send a signal to all pids in pid[] that are > 0 and call it
> if fork fails with SIGKILL as well as from the main loop with the
> SIGTERM as well.
>
I think this one is better, please have a look. Thanks.
From aff8c1decee88bae37a8460ddce8d10a7a8f3d1a Mon Sep 17 00:00:00 2001
From: Han Pingtian <hanpt@linux.vnet.ibm.com>
Date: Tue, 12 Apr 2016 11:12:28 +0800
Subject: [PATCH] waitpid/waitpid03: break test if fork failed
If continue after the fork failure, a lot of processes may be killed by
the kill() on line 125.
Signed-off-by: Han Pingtian <hanpt@linux.vnet.ibm.com>
---
testcases/kernel/syscalls/waitpid/waitpid03.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/testcases/kernel/syscalls/waitpid/waitpid03.c b/testcases/kernel/syscalls/waitpid/waitpid03.c
index 2599a92..7e9d45c 100644
--- a/testcases/kernel/syscalls/waitpid/waitpid03.c
+++ b/testcases/kernel/syscalls/waitpid/waitpid03.c
@@ -106,7 +106,16 @@ int main(int argc, char **argv)
if (DEBUG)
tst_resm(TINFO, "child # %d", ikids);
} else if (pid[ikids] == -1) {
- tst_resm(TFAIL, "cannot open fork #%d", ikids);
+ int i;
+
+ tst_resm(TBROK|TERRNO, "cannot open fork #%d",
+ ikids);
+
+ for (i = 1; i < ikids; i++)
+ kill(pid[i], 9);
+
+ cleanup();
+ tst_exit();
} else {
#ifdef UCLINUX
if (self_exec(argv[0], "d", ikids) < 0) {
--
1.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [LTP] [PATCH] waitpid/waitpid03: break test if fork failed
2016-04-13 3:29 ` Han Pingtian
@ 2016-04-13 12:51 ` Cyril Hrubis
0 siblings, 0 replies; 8+ messages in thread
From: Cyril Hrubis @ 2016-04-13 12:51 UTC (permalink / raw)
To: ltp
Hi!
> - tst_resm(TFAIL, "cannot open fork #%d", ikids);
> + int i;
> +
> + for (i = 1; i < ikids; i++)
> + kill(pid[i], 9);
> +
> + tst_brkm(TBROK|TERRNO, cleanup,
> + "cannot open fork #%d", ikids);
The problem is that the errno may get clobbered by the call to the
kill().
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 8+ messages in thread
* [LTP] [PATCH] waitpid/waitpid03: break test if fork failed
2016-04-13 6:58 ` Han Pingtian
@ 2016-04-13 12:55 ` Cyril Hrubis
2016-04-14 3:09 ` Han Pingtian
0 siblings, 1 reply; 8+ messages in thread
From: Cyril Hrubis @ 2016-04-13 12:55 UTC (permalink / raw)
To: ltp
Hi!
> Signed-off-by: Han Pingtian <hanpt@linux.vnet.ibm.com>
> ---
> testcases/kernel/syscalls/waitpid/waitpid03.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/testcases/kernel/syscalls/waitpid/waitpid03.c b/testcases/kernel/syscalls/waitpid/waitpid03.c
> index 2599a92..7e9d45c 100644
> --- a/testcases/kernel/syscalls/waitpid/waitpid03.c
> +++ b/testcases/kernel/syscalls/waitpid/waitpid03.c
> @@ -106,7 +106,16 @@ int main(int argc, char **argv)
> if (DEBUG)
> tst_resm(TINFO, "child # %d", ikids);
> } else if (pid[ikids] == -1) {
> - tst_resm(TFAIL, "cannot open fork #%d", ikids);
> + int i;
> +
> + tst_resm(TBROK|TERRNO, "cannot open fork #%d",
> + ikids);
> +
> + for (i = 1; i < ikids; i++)
> + kill(pid[i], 9);
> +
> + cleanup();
> + tst_exit();
This one is ugly. Why don't we kill the children in the test cleanup()
here as well. This should be easy, just store the number of allready
forked kids in a global variable and reset it to zero right after they
were killed in the main loop.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 8+ messages in thread
* [LTP] [PATCH] waitpid/waitpid03: break test if fork failed
2016-04-13 12:55 ` Cyril Hrubis
@ 2016-04-14 3:09 ` Han Pingtian
2016-04-19 11:34 ` Cyril Hrubis
0 siblings, 1 reply; 8+ messages in thread
From: Han Pingtian @ 2016-04-14 3:09 UTC (permalink / raw)
To: ltp
On Wed, Apr 13, 2016 at 02:55:35PM +0200, Cyril Hrubis wrote:
> Hi!
> > Signed-off-by: Han Pingtian <hanpt@linux.vnet.ibm.com>
> > ---
> > testcases/kernel/syscalls/waitpid/waitpid03.c | 11 ++++++++++-
> > 1 file changed, 10 insertions(+), 1 deletion(-)
> >
> > diff --git a/testcases/kernel/syscalls/waitpid/waitpid03.c b/testcases/kernel/syscalls/waitpid/waitpid03.c
> > index 2599a92..7e9d45c 100644
> > --- a/testcases/kernel/syscalls/waitpid/waitpid03.c
> > +++ b/testcases/kernel/syscalls/waitpid/waitpid03.c
> > @@ -106,7 +106,16 @@ int main(int argc, char **argv)
> > if (DEBUG)
> > tst_resm(TINFO, "child # %d", ikids);
> > } else if (pid[ikids] == -1) {
> > - tst_resm(TFAIL, "cannot open fork #%d", ikids);
> > + int i;
> > +
> > + tst_resm(TBROK|TERRNO, "cannot open fork #%d",
> > + ikids);
> > +
> > + for (i = 1; i < ikids; i++)
> > + kill(pid[i], 9);
> > +
> > + cleanup();
> > + tst_exit();
>
> This one is ugly. Why don't we kill the children in the test cleanup()
> here as well. This should be easy, just store the number of allready
> forked kids in a global variable and reset it to zero right after they
> were killed in the main loop.
>
Thanks. Please reveiw this new patch.
From 8b7c289ac51ec2e169bbe0147d4c1c3d1f08aa0b Mon Sep 17 00:00:00 2001
From: Han Pingtian <hanpt@linux.vnet.ibm.com>
Date: Tue, 12 Apr 2016 11:12:28 +0800
Subject: [PATCH] waitpid/waitpid03: break test if fork failed
If continue after the fork failure, a lot of processes may be killed by
the kill() on line 125.
Signed-off-by: Han Pingtian <hanpt@linux.vnet.ibm.com>
---
testcases/kernel/syscalls/waitpid/waitpid03.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/testcases/kernel/syscalls/waitpid/waitpid03.c b/testcases/kernel/syscalls/waitpid/waitpid03.c
index 2599a92..4b3f7a7 100644
--- a/testcases/kernel/syscalls/waitpid/waitpid03.c
+++ b/testcases/kernel/syscalls/waitpid/waitpid03.c
@@ -64,6 +64,8 @@ int TST_TOTAL = 1;
#define MAXUPRC 25
+static int ikids;
+static int pid[MAXUPRC];
static int condition_number;
#ifdef UCLINUX
@@ -75,7 +77,7 @@ int main(int argc, char **argv)
{
int lc;
- int status, pid[25], ret;
+ int status, ret;
tst_parse_opts(argc, argv, NULL, NULL);
#ifdef UCLINUX
@@ -87,7 +89,6 @@ int main(int argc, char **argv)
/* check for looping state if -i option is given */
for (lc = 0; TEST_LOOPING(lc); lc++) {
/* reset tst_count in case we are looping */
- int ikids = 0;
tst_count = 0;
/*
@@ -106,7 +107,9 @@ int main(int argc, char **argv)
if (DEBUG)
tst_resm(TINFO, "child # %d", ikids);
} else if (pid[ikids] == -1) {
- tst_resm(TFAIL, "cannot open fork #%d", ikids);
+ tst_brkm(TBROK|TERRNO, cleanup, "cannot open "
+ "fork #%d", ikids);
+
} else {
#ifdef UCLINUX
if (self_exec(argv[0], "d", ikids) < 0) {
@@ -125,6 +128,7 @@ int main(int argc, char **argv)
kill(pid[ikids], 15);
}
+ ikids = 0;
condition_number = 1;
/* Wait on one specific child */
@@ -185,4 +189,6 @@ static void setup(void)
static void cleanup(void)
{
+ while (ikids-- > 1)
+ kill(pid[ikids], 9);
}
--
1.9.3
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [LTP] [PATCH] waitpid/waitpid03: break test if fork failed
2016-04-14 3:09 ` Han Pingtian
@ 2016-04-19 11:34 ` Cyril Hrubis
0 siblings, 0 replies; 8+ messages in thread
From: Cyril Hrubis @ 2016-04-19 11:34 UTC (permalink / raw)
To: ltp
Hi!
> + while (ikids-- > 1)
> + kill(pid[ikids], 9);
I've changed the number to a signal constat i.e. 9 -> SIGKILL and
pushed, thanks.
--
Cyril Hrubis
chrubis@suse.cz
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-04-19 11:34 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-12 13:22 [LTP] [PATCH] waitpid/waitpid03: break test if fork failed Han Pingtian
2016-04-12 15:52 ` Cyril Hrubis
2016-04-13 3:29 ` Han Pingtian
2016-04-13 12:51 ` Cyril Hrubis
2016-04-13 6:58 ` Han Pingtian
2016-04-13 12:55 ` Cyril Hrubis
2016-04-14 3:09 ` Han Pingtian
2016-04-19 11:34 ` Cyril Hrubis
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.