syscalls/prctl03.c: New test for prctl() with PR_{SET, GET}_CHILD_SUBREAPER
PATCH 1/1 syscalls/prctl03.c: New test for prctl() with PR_{SET, GET}_CHILD_SUBREAPER
Test PR_SET_CHILD_SUBREAPER and PR_GET_CHILD_SUBREAPER flags of prctl(2).
--- runtest/ltplite | 1 + runtest/stress.part3 | 1 + runtest/syscalls | 1 + testcases/kernel/syscalls/prctl/.gitignore | 1 + testcases/kernel/syscalls/prctl/prctl03.c | 101 +++++++++++++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 testcases/kernel/syscalls/prctl/prctl03.c
runtest/ltplite +1 -0
@@ -574,6 +574,7 @@ poll01 poll01 prctl01 prctl01 prctl02 prctl02 +prctl03 prctl03 pread01 pread01 pread02 pread02
runtest/stress.part3 +1 -0
@@ -483,6 +483,7 @@ poll01 poll01 prctl01 prctl01 prctl02 prctl02 +prctl03 prctl03 pread01 pread01 pread02 pread02
runtest/syscalls +1 -0
@@ -808,6 +808,7 @@ ppoll01 ppoll01 prctl01 prctl01 prctl02 prctl02 +prctl03 prctl03 pread01 pread01 pread01_64 pread01_64
testcases/kernel/syscalls/prctl/.gitignore +1 -0
@@ -1,2 +1,3 @@ /prctl01 /prctl02 +/prctl03
testcases/kernel/syscalls/prctl/prctl03.c new file +101 -0
101 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH 1/1 syscalls/prctl03.c: New test for prctl() with PR_{SET, GET}_CHILD_SUBREAPER
Hi!
Quoted 18 lines
+ * Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
+ * Author: Xiao Yang <[email protected]>
+ *
+ * TestPR_SET_CHILD_SUBREAPERandPR_GET_CHILD_SUBREAPERof prctl(2).
+ * 1) IfPR_SET_CHILD_SUBREAPERmarks a process as a child subreaper, it+ * fulfills the role of init(1) for its descendant processes. The + * subreaper process can receive a SIGCHLD signal and wait(2) on its + * descendant orphan process to discover corresponding termination status.+ * 2) The setting of
PR_SET_CHILD_SUBREAPERis not inherited by children
+ * created by fork(2).
+ * 3)PR_GET_CHILD_SUBREAPERcan get the setting ofPR_SET_CHILD_SUBREAPER.
+ *
+ * These flags was added by kenrel commitebec18a6d3aa:
+ * "prctl: add PR_{SET,GET}_CHILD_SUBREAPER to allow simple process supervision"
+ */testcases/kernel/syscalls/prctl/prctl03.c new file +3
-0+ +#include <errno.h> +#include <stdlib.h>
testcases/kernel/syscalls/prctl/prctl03.c line 30
Quoted 10 lines
testcases/kernel/syscalls/prctl/prctl03.c new file +10
-0+#include <sys/types.h> +#include <sys/wait.h> +#include <sys/prctl.h> + +#include "tst_test.h" + +#ifndef PR_SET_CHILD_SUBREAPER +# define PR_SET_CHILD_SUBREAPER 36 +# define PR_GET_CHILD_SUBREAPER 37 +#endif
This should go to lapi/prctl.h.
Quoted 35 lines
testcases/kernel/syscalls/prctl/prctl03.c new file +35
-0+static void check_get_subreaper (int exp_val) +{ +int get_val; + +TEST (prctl (PR_GET_CHILD_SUBREAPER , &get_val)); +if (TEST_RETURN ==-1 ) { +tst_res (TFAIL |TTERRNO ,"prctl(PR_GET_CHILD_SUBREAPER) failed" ); +return ; + } + +if (get_val == exp_val) { +tst_res (TPASS ,"prctl(PR_GET_CHILD_SUBREAPER) got expected %d" , + get_val); + }else { +tst_res (TFAIL ,"prctl(PR_GET_CHILD_SUBREAPER) got %d, expected %d" , + get_val, exp_val); + } +} + +static void verify_prctl (void ) +{ +int status, ret; +pid_t pid; + +TEST (prctl (PR_SET_CHILD_SUBREAPER ,1 )); +if (TEST_RETURN ==-1 ) { +if (TEST_ERRNO ==EINVAL ) { +tst_res (TCONF , +"prctl() doesn't support PR_SET_CHILD_SUBREAPER" ); + }else { +tst_res (TFAIL |TTERRNO , +"prctl(PR_SET_CHILD_SUBREAPER) failed" ); + } +return ; + }
testcases/kernel/syscalls/prctl/prctl03.c line 76
Quoted 10 lines
testcases/kernel/syscalls/prctl/prctl03.c new file +10
-0+ +tst_res (TPASS ,"prctl(PR_SET_CHILD_SUBREAPER) succeeded" ); + + pid =SAFE_FORK (); +if (!pid) { +pid_t cpid; + + cpid =SAFE_FORK (); +if (!cpid) { +TST_CHECKPOINT_WAIT (0 );
We may as check the parent pid here, since we already waited the parent it should have been reparented at this point.
testcases/kernel/syscalls/prctl/prctl03.c line 81
Quoted 5 lines
testcases/kernel/syscalls/prctl/prctl03.c new file +5
-0+exit (0 ); + } + +check_get_subreaper (0 ); +exit (1 );
Why exit(1) when we don't use the value? I would expect exit(0) but that is very minor.
Quoted 9 lines
testcases/kernel/syscalls/prctl/prctl03.c new file +9
-0+ } + +SAFE_WAITPID (pid,NULL ,0 ); +TST_CHECKPOINT_WAKE (0 ); + ret =wait (&status); +if (ret >0 && !WEXITSTATUS (status)) { +tst_res (TPASS ,"wait() got orphan process, pid %d status %d" , + ret, status); + }else {
testcases/kernel/syscalls/prctl/prctl03.c line 101
Quoted 10 lines
testcases/kernel/syscalls/prctl/prctl03.c new file +10
-0+tst_res (TFAIL |TERRNO ,"wait() failed to get orphan process" ); + } +check_get_subreaper (1 ); +} + +static struct tst_test test = { + .forks_child =1 , + .needs_checkpoints =1 , + .test_all = verify_prctl, +};
We may also set up a sigchild handler and check that we got sigchild once the reparented process exitted.
Otherwise it looks fine.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v2 1/1 syscalls/prctl03.c: New test for prctl() with PR_{SET, GET}_CHILD_SUBREAPER
--- include/lapi/prctl.h | 17 ++++ runtest/ltplite | 1 + runtest/stress.part3 | 1 + runtest/syscalls | 1 + testcases/kernel/syscalls/prctl/.gitignore | 1 + testcases/kernel/syscalls/prctl/prctl03.c | 130 +++++++++++++++++++++++++++++ 6 files changed, 151 insertions(+) create mode 100644 include/lapi/prctl.h create mode 100644 testcases/kernel/syscalls/prctl/prctl03.c
include/lapi/prctl.h new file +17 -0
@@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* +* Copyright (c) 2018 FUJITSU LIMITED. All rights reserved. +* Author: Xiao Yang <[email protected]> +*/ + +#ifndef LAPI_PRCTL_H__ +# define LAPI_PRCTL_H__ + +#include <sys/prctl.h> + +#ifndef PR_SET_CHILD_SUBREAPER +# define PR_SET_CHILD_SUBREAPER 36 +# define PR_GET_CHILD_SUBREAPER 37 +#endif + +#endif /* LAPI_PRCTL_H__ */
runtest/ltplite +1 -0
@@ -574,6 +574,7 @@ poll01 poll01 prctl01 prctl01 prctl02 prctl02 +prctl03 prctl03 pread01 pread01 pread02 pread02
runtest/stress.part3 +1 -0
@@ -483,6 +483,7 @@ poll01 poll01 prctl01 prctl01 prctl02 prctl02 +prctl03 prctl03 pread01 pread01 pread02 pread02
runtest/syscalls +1 -0
@@ -808,6 +808,7 @@ ppoll01 ppoll01 prctl01 prctl01 prctl02 prctl02 +prctl03 prctl03 pread01 pread01 pread01_64 pread01_64
testcases/kernel/syscalls/prctl/.gitignore +1 -0
@@ -1,2 +1,3 @@ /prctl01 /prctl02 +/prctl03
testcases/kernel/syscalls/prctl/prctl03.c new file +130 -0
130 lines not on this page · raw message
Signature · 1 line
1.8.3.1
PATCH v2 1/1 syscalls/prctl03.c: New test for prctl() with PR_{SET, GET}_CHILD_SUBREAPER
Hi!
Pushed with minor changes, thanks.
TST_RETURN -> TST_RETTST_ERRNO -> TST_ERR
And the grandchild does only exit(0) since we do not use the exit value.
Signature · 2 lines
Cyril Hrubis [email protected]