* [LTP] [PATCH 1/2] SAFE_MACROS: Add SAFE_SETSID() @ 2017-06-15 9:57 Guangwen Feng 2017-06-15 9:57 ` [LTP] [PATCH 2/2] sched/autogroup01: Add new regression test Guangwen Feng 0 siblings, 1 reply; 5+ messages in thread From: Guangwen Feng @ 2017-06-15 9:57 UTC (permalink / raw) To: ltp Signed-off-by: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> --- include/tst_safe_macros.h | 3 +++ lib/safe_macros.c | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/tst_safe_macros.h b/include/tst_safe_macros.h index a25a4f0..09745c1 100644 --- a/include/tst_safe_macros.h +++ b/include/tst_safe_macros.h @@ -430,4 +430,7 @@ int safe_removexattr(const char *file, const int lineno, const char *path, int safe_fsync(const char *file, const int lineno, int fd); #define SAFE_FSYNC(fd) safe_fsync(__FILE__, __LINE__, (fd)) +int safe_setsid(const char *file, const int lineno); +#define SAFE_SETSID() safe_setsid(__FILE__, __LINE__) + #endif /* SAFE_MACROS_H__ */ diff --git a/lib/safe_macros.c b/lib/safe_macros.c index a6b4ff7..3ef9266 100644 --- a/lib/safe_macros.c +++ b/lib/safe_macros.c @@ -895,3 +895,16 @@ int safe_fsync(const char *file, const int lineno, int fd) return rval; } + +pid_t safe_setsid(const char *file, const int lineno) +{ + pid_t rval; + + rval = setsid(); + if (rval == -1) { + tst_brkm(TBROK | TERRNO, NULL, + "%s:%d: setsid() failed", file, lineno); + } + + return rval; +} -- 1.8.4.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [LTP] [PATCH 2/2] sched/autogroup01: Add new regression test 2017-06-15 9:57 [LTP] [PATCH 1/2] SAFE_MACROS: Add SAFE_SETSID() Guangwen Feng @ 2017-06-15 9:57 ` Guangwen Feng 2017-06-15 14:31 ` Cyril Hrubis 0 siblings, 1 reply; 5+ messages in thread From: Guangwen Feng @ 2017-06-15 9:57 UTC (permalink / raw) To: ltp Fixed by: commit 18f649ef344127ef6de23a5a4272dbe2fdb73dde Author: Oleg Nesterov <oleg@redhat.com> Date: Mon Nov 14 19:46:09 2016 +0100 sched/autogroup: Fix autogroup_move_group() to never skip sched_move_task() Signed-off-by: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> --- runtest/sched | 2 + testcases/kernel/sched/autogroup/.gitignore | 1 + testcases/kernel/sched/autogroup/Makefile | 23 +++++++ testcases/kernel/sched/autogroup/autogroup01.c | 95 ++++++++++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 testcases/kernel/sched/autogroup/.gitignore create mode 100644 testcases/kernel/sched/autogroup/Makefile create mode 100644 testcases/kernel/sched/autogroup/autogroup01.c diff --git a/runtest/sched b/runtest/sched index 89398df..774d11f 100644 --- a/runtest/sched +++ b/runtest/sched @@ -16,3 +16,5 @@ sched_getattr02 sched_getattr02 sched_cli_serv run_sched_cliserv.sh # Run this stress test for 2 minutes sched_stress sched_stress.sh + +autogroup01 autogroup01 diff --git a/testcases/kernel/sched/autogroup/.gitignore b/testcases/kernel/sched/autogroup/.gitignore new file mode 100644 index 0000000..bcc7453 --- /dev/null +++ b/testcases/kernel/sched/autogroup/.gitignore @@ -0,0 +1 @@ +/autogroup01 diff --git a/testcases/kernel/sched/autogroup/Makefile b/testcases/kernel/sched/autogroup/Makefile new file mode 100644 index 0000000..6cc7782 --- /dev/null +++ b/testcases/kernel/sched/autogroup/Makefile @@ -0,0 +1,23 @@ +# +# Copyright (c) 2017 Fujitsu Ltd. +# Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <http://www.gnu.org/licenses/>. +# + +top_srcdir ?= ../../../.. + +include $(top_srcdir)/include/mk/testcases.mk + +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/sched/autogroup/autogroup01.c b/testcases/kernel/sched/autogroup/autogroup01.c new file mode 100644 index 0000000..3b08e42 --- /dev/null +++ b/testcases/kernel/sched/autogroup/autogroup01.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2017 Fujitsu Ltd. + * Ported: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +/* + * This is a regression test about the race in autogroup, this test + * can crash the buggy kernel, and the bug has been fixed in: + * + * commit 18f649ef344127ef6de23a5a4272dbe2fdb73dde + * Author: Oleg Nesterov <oleg@redhat.com> + * Date: Mon Nov 14 19:46:09 2016 +0100 + * + * sched/autogroup: Fix autogroup_move_group() to never skip sched_move_task() + */ + +#include <sys/types.h> +#include <unistd.h> +#include <stdlib.h> +#include "tst_test.h" + +#define LOOPS 1000 +#define PATH_AUTOGROUP "/proc/sys/kernel/sched_autogroup_enabled" + +static int orig_autogroup = -1; + +static void do_test(void) +{ + int i; + + if (!SAFE_FORK()) { + SAFE_FILE_PRINTF(PATH_AUTOGROUP, "%d", 1); + SAFE_SETSID(); + + if (SAFE_FORK()) { + pause(); + exit(0); + } + + SAFE_KILL(getppid(), SIGKILL); + usleep(1000); + + SAFE_FILE_PRINTF(PATH_AUTOGROUP, "%d", 0); + SAFE_SETSID(); + + for (i = 0; i < LOOPS; i++) + usleep(10); + + TST_CHECKPOINT_WAKE(0); + + exit(0); + } + + SAFE_WAIT(NULL); + + TST_CHECKPOINT_WAIT(0); + + tst_res(TPASS, "Bug not reproduced"); +} + +static void setup(void) +{ + if (access(PATH_AUTOGROUP, F_OK)) + tst_brk(TCONF, "autogroup not supported"); + + SAFE_FILE_SCANF(PATH_AUTOGROUP, "%d", &orig_autogroup); +} + +static void cleanup(void) +{ + if (orig_autogroup != -1) + SAFE_FILE_PRINTF(PATH_AUTOGROUP, "%d", orig_autogroup); +} + +static struct tst_test test = { + .forks_child = 1, + .needs_root = 1, + .needs_checkpoints = 1, + .setup = setup, + .cleanup = cleanup, + .test_all = do_test, +}; -- 1.8.4.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [LTP] [PATCH 2/2] sched/autogroup01: Add new regression test 2017-06-15 9:57 ` [LTP] [PATCH 2/2] sched/autogroup01: Add new regression test Guangwen Feng @ 2017-06-15 14:31 ` Cyril Hrubis 2017-06-16 1:43 ` [LTP] [PATCH v2] " Guangwen Feng 0 siblings, 1 reply; 5+ messages in thread From: Cyril Hrubis @ 2017-06-15 14:31 UTC (permalink / raw) To: ltp Hi! > +static void do_test(void) > +{ > + int i; > + > + if (!SAFE_FORK()) { > + SAFE_FILE_PRINTF(PATH_AUTOGROUP, "%d", 1); > + SAFE_SETSID(); > + > + if (SAFE_FORK()) { > + pause(); > + exit(0); Do we really reach this exit(0)? We are sending SIGKILL to this process after all... > + } > + > + SAFE_KILL(getppid(), SIGKILL); > + usleep(1000); > + > + SAFE_FILE_PRINTF(PATH_AUTOGROUP, "%d", 0); > + SAFE_SETSID(); > + > + for (i = 0; i < LOOPS; i++) > + usleep(10); > + > + TST_CHECKPOINT_WAKE(0); > + > + exit(0); > + } > + > + SAFE_WAIT(NULL); > + > + TST_CHECKPOINT_WAIT(0); > + > + tst_res(TPASS, "Bug not reproduced"); > +} Otherwise it looks fine. We may as well include the comments that were present in the original reproducer as that makes the code a bit easier to understand. -- Cyril Hrubis chrubis@suse.cz ^ permalink raw reply [flat|nested] 5+ messages in thread
* [LTP] [PATCH v2] sched/autogroup01: Add new regression test 2017-06-15 14:31 ` Cyril Hrubis @ 2017-06-16 1:43 ` Guangwen Feng 2017-06-19 17:45 ` Cyril Hrubis 0 siblings, 1 reply; 5+ messages in thread From: Guangwen Feng @ 2017-06-16 1:43 UTC (permalink / raw) To: ltp Fixed by: commit 18f649ef344127ef6de23a5a4272dbe2fdb73dde Author: Oleg Nesterov <oleg@redhat.com> Date: Mon Nov 14 19:46:09 2016 +0100 sched/autogroup: Fix autogroup_move_group() to never skip sched_move_task() Signed-off-by: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> --- runtest/sched | 2 + testcases/kernel/sched/autogroup/.gitignore | 1 + testcases/kernel/sched/autogroup/Makefile | 23 +++++++ testcases/kernel/sched/autogroup/autogroup01.c | 95 ++++++++++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 testcases/kernel/sched/autogroup/.gitignore create mode 100644 testcases/kernel/sched/autogroup/Makefile create mode 100644 testcases/kernel/sched/autogroup/autogroup01.c diff --git a/runtest/sched b/runtest/sched index 89398df..774d11f 100644 --- a/runtest/sched +++ b/runtest/sched @@ -16,3 +16,5 @@ sched_getattr02 sched_getattr02 sched_cli_serv run_sched_cliserv.sh # Run this stress test for 2 minutes sched_stress sched_stress.sh + +autogroup01 autogroup01 diff --git a/testcases/kernel/sched/autogroup/.gitignore b/testcases/kernel/sched/autogroup/.gitignore new file mode 100644 index 0000000..bcc7453 --- /dev/null +++ b/testcases/kernel/sched/autogroup/.gitignore @@ -0,0 +1 @@ +/autogroup01 diff --git a/testcases/kernel/sched/autogroup/Makefile b/testcases/kernel/sched/autogroup/Makefile new file mode 100644 index 0000000..6cc7782 --- /dev/null +++ b/testcases/kernel/sched/autogroup/Makefile @@ -0,0 +1,23 @@ +# +# Copyright (c) 2017 Fujitsu Ltd. +# Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see <http://www.gnu.org/licenses/>. +# + +top_srcdir ?= ../../../.. + +include $(top_srcdir)/include/mk/testcases.mk + +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/sched/autogroup/autogroup01.c b/testcases/kernel/sched/autogroup/autogroup01.c new file mode 100644 index 0000000..9c4e911 --- /dev/null +++ b/testcases/kernel/sched/autogroup/autogroup01.c @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2017 Fujitsu Ltd. + * Ported: Guangwen Feng <fenggw-fnst@cn.fujitsu.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +/* + * This is a regression test about the race in autogroup, this test + * can crash the buggy kernel, and the bug has been fixed in: + * + * commit 18f649ef344127ef6de23a5a4272dbe2fdb73dde + * Author: Oleg Nesterov <oleg@redhat.com> + * Date: Mon Nov 14 19:46:09 2016 +0100 + * + * sched/autogroup: Fix autogroup_move_group() to never skip sched_move_task() + */ + +#include <sys/types.h> +#include <unistd.h> +#include <stdlib.h> +#include "tst_test.h" + +#define LOOPS 1000 +#define PATH_AUTOGROUP "/proc/sys/kernel/sched_autogroup_enabled" + +static int orig_autogroup = -1; + +static void do_test(void) +{ + int i; + + if (!SAFE_FORK()) { + SAFE_FILE_PRINTF(PATH_AUTOGROUP, "%d", 1); + SAFE_SETSID(); + + if (SAFE_FORK()) + pause(); + + SAFE_KILL(getppid(), SIGKILL); + usleep(1000); + + // The child has gone, the grandchild runs with kref == 1 + SAFE_FILE_PRINTF(PATH_AUTOGROUP, "%d", 0); + SAFE_SETSID(); + + // runs with the freed ag/tg + for (i = 0; i < LOOPS; i++) + usleep(10); + + TST_CHECKPOINT_WAKE(0); + + exit(0); + } + + SAFE_WAIT(NULL); // destroy the child's ag/tg + + TST_CHECKPOINT_WAIT(0); + + tst_res(TPASS, "Bug not reproduced"); +} + +static void setup(void) +{ + if (access(PATH_AUTOGROUP, F_OK)) + tst_brk(TCONF, "autogroup not supported"); + + SAFE_FILE_SCANF(PATH_AUTOGROUP, "%d", &orig_autogroup); +} + +static void cleanup(void) +{ + if (orig_autogroup != -1) + SAFE_FILE_PRINTF(PATH_AUTOGROUP, "%d", orig_autogroup); +} + +static struct tst_test test = { + .forks_child = 1, + .needs_root = 1, + .needs_checkpoints = 1, + .setup = setup, + .cleanup = cleanup, + .test_all = do_test, +}; -- 1.8.4.2 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [LTP] [PATCH v2] sched/autogroup01: Add new regression test 2017-06-16 1:43 ` [LTP] [PATCH v2] " Guangwen Feng @ 2017-06-19 17:45 ` Cyril Hrubis 0 siblings, 0 replies; 5+ messages in thread From: Cyril Hrubis @ 2017-06-19 17:45 UTC (permalink / raw) To: ltp Hi! Both patches pushed, thanks. -- Cyril Hrubis chrubis@suse.cz ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2017-06-19 17:45 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-06-15 9:57 [LTP] [PATCH 1/2] SAFE_MACROS: Add SAFE_SETSID() Guangwen Feng 2017-06-15 9:57 ` [LTP] [PATCH 2/2] sched/autogroup01: Add new regression test Guangwen Feng 2017-06-15 14:31 ` Cyril Hrubis 2017-06-16 1:43 ` [LTP] [PATCH v2] " Guangwen Feng 2017-06-19 17:45 ` Cyril Hrubis
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox