Message ID | 325a43a851acca8bb242011a1d62063c8154653c.1593152309.git.viresh.kumar@linaro.org |
---|---|
State | Accepted |
Headers | show |
Series | Syscalls: Add support for time64 variants | expand |
Hi! I've did some further cleanup and pushed, thanks. Btw, we may as well add a check that the value is consistent with /proc/sys/kernel/sched_rr_timeslice_ms. I've mostly removed useless comments, etc. but also added a sanity check for the time quantum timespec. See: diff --git a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c index 9bad698aa..31d7b5d56 100644 --- a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c +++ b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c @@ -1,53 +1,10 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. - * - * TEST IDENTIFIER : sched_rr_get_interval01 - * - * EXECUTED BY : root / superuser - * - * TEST TITLE : Basic test for sched_rr_get_interval(2) - * - * TEST CASE TOTAL : 1 - * * AUTHOR : Saji Kumar.V.R <saji.kumar@wipro.com> * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * - * DESCRIPTION - * This is a Phase I test for the sched_rr_get_interval(2) system call. - * It is intended to provide a limited exposure of the system call. - * - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Change scheduling policy to SCHED_RR - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if it is 0, - * Test passed. - * Otherwise - * Test failed - * - * Cleanup: - * Print errno log and/or timing stats if options given - * - * USAGE: <for command-line> - * sched_rr_get_interval01 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -h : Show help screen - * -f : Turn off functional testing - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -p : Pause for SIGUSR1 before starting - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * + * Gets round-robin time quantum by calling sched_rr_get_interval() and + * checks that the value is sane. */ #include <sched.h> @@ -74,17 +31,12 @@ static struct test_variants { static void setup(void) { struct test_variants *tv = &variants[tst_variant]; - /* - * Initialize scheduling parameter structure to use with - * sched_setscheduler() - */ struct sched_param p = { 1 }; tst_res(TINFO, "Testing variant: %s", tv->desc); tp.type = tv->type; - /* Change scheduling policy to SCHED_RR */ if ((sched_setscheduler(0, SCHED_RR, &p)) == -1) tst_res(TFAIL | TTERRNO, "sched_setscheduler() failed"); } @@ -93,11 +45,6 @@ static void run(void) { struct test_variants *tv = &variants[tst_variant]; - /* - * Call sched_rr_get_interval(2) with pid=0 so that it will - * write into the timespec structure pointed to by tp, the - * round robin time quantum for the current process. - */ TEST(tv->func(0, tst_ts_get(&tp))); if (!TST_RET) { @@ -106,6 +53,15 @@ static void run(void) tst_res(TFAIL | TTERRNO, "Test Failed, sched_rr_get_interval() returned %ld", TST_RET); } + + if (!tst_ts_valid(&tp)) { + tst_res(TPASS, "Time quantum %llis %llins", + tst_ts_get_sec(tp), tst_ts_get_nsec(tp)); + } else { + tst_res(TFAIL, "Invalid time quantum %llis %llins", + tst_ts_get_sec(tp), tst_ts_get_nsec(tp)); + } + } static struct tst_test test = { diff --git a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval02.c b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval02.c index 8da42e974..5b38e5bff 100644 --- a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval02.c +++ b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval02.c @@ -1,60 +1,17 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. - * - * TEST IDENTIFIER : sched_rr_get_interval02 - * - * EXECUTED BY : root / superuser - * - * TEST TITLE : Functionality test - * - * TEST CASE TOTAL : 1 - * * AUTHOR : Saji Kumar.V.R <saji.kumar@wipro.com> * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * - * DESCRIPTION - * Verify that for a process with scheduling policy SCHED_FIFO, - * sched_rr_get_interval() writes zero into timespec structure - * for tv_sec & tv_nsec. - * - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. - * Change scheduling policy to SCHED_FIFO - * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check (return code == 0) & (got 0 for tv_sec & tv_nsec ) - * Test passed. - * Otherwise - * Test failed - * - * Cleanup: - * Print errno log and/or timing stats if options given - * - * USAGE: <for command-line> - * sched_rr_get_interval02 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -h : Show help screen - * -f : Turn off functional testing - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -p : Pause for SIGUSR1 before starting - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * + * Verify that for a process with scheduling policy SCHED_FIFO, + * sched_rr_get_interval() writes zero into timespec structure + * for tv_sec & tv_nsec. */ #include <sched.h> #include "tst_timer.h" -struct tst_ts tp; +static struct tst_ts tp; static struct test_variants { int (*func)(pid_t pid, void *ts); @@ -75,17 +32,12 @@ static struct test_variants { static void setup(void) { struct test_variants *tv = &variants[tst_variant]; - /* - * Initialize scheduling parameter structure to use with - * sched_setscheduler() - */ struct sched_param p = { 1 }; tst_res(TINFO, "Testing variant: %s", tv->desc); tp.type = tv->type; - /* Change scheduling policy to SCHED_FIFO */ if ((sched_setscheduler(0, SCHED_FIFO, &p)) == -1) tst_res(TFAIL | TTERRNO, "sched_setscheduler() failed"); } @@ -97,17 +49,13 @@ static void run(void) tst_ts_set_sec(&tp, 99); tst_ts_set_nsec(&tp, 99); - /* - * Call sched_rr_get_interval(2) with pid=0 so that it will - * write into the timespec structure pointed to by tp the - * round robin time quantum for the current process. - */ TEST(tv->func(0, tst_ts_get(&tp))); if (!TST_RET && tst_ts_valid(&tp) == -1) { tst_res(TPASS, "sched_rr_get_interval() passed"); } else { - tst_res(TFAIL | TTERRNO, "Test Failed, sched_rr_get_interval() returned %ld, tp.tv_sec = %lld, tp.tv_nsec = %lld", + tst_res(TFAIL | TTERRNO, + "sched_rr_get_interval() returned %ld, tp.tv_sec = %lld, tp.tv_nsec = %lld", TST_RET, tst_ts_get_sec(tp), tst_ts_get_nsec(tp)); } } diff --git a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval03.c b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval03.c index 0ccf47d2a..d7bbe2686 100644 --- a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval03.c +++ b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval03.c @@ -1,59 +1,15 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. - * - * TEST IDENTIFIER : sched_rr_get_interval03 - * - * EXECUTED BY : root / superuser - * - * TEST TITLE : Tests for error conditions - * - * TEST CASE TOTAL : 3 - * * AUTHOR : Saji Kumar.V.R <saji.kumar@wipro.com> * - * SIGNALS - * Uses SIGUSR1 to pause before test if option set. - * (See the parse_opts(3) man page). - * - * DESCRIPTION - * Verify that - * 1) sched_rr_get_interval() fails with errno set to EINVAL for an - * invalid pid - * 2) sched_rr_get_interval() fails with errno set to ESRCH if the - * process with specified pid does not exists - * 2) sched_rr_get_interval() fails with errno set to EFAULT if the - * address specified as &tp is invalid - * - * Setup: - * Setup signal handling. - * Set expected errors for logging. - * Pause for SIGUSR1 if option specified. - * Change scheduling policy to SCHED_RR - * - * Test: - * Loop if the proper options are given. - * Execute system call - * if call fails with expected errno, - * Test passed. - * Otherwise - * Test failed - * - * Cleanup: - * Print errno log and/or timing stats if options given - * - * USAGE: <for command-line> - * sched_rr_get_interval03 [-c n] [-e] [-i n] [-I x] [-P x] [-t] [-h] [-f] [-p] - * where, -c n : Run n copies concurrently. - * -e : Turn on errno logging. - * -h : Show help screen - * -f : Turn off functional testing - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -p : Pause for SIGUSR1 before starting - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * + * Verify that + * 1) sched_rr_get_interval() fails with errno set to EINVAL for an + * invalid pid + * 2) sched_rr_get_interval() fails with errno set to ESRCH if the + * process with specified pid does not exists + * 3) sched_rr_get_interval() fails with errno set to EFAULT if the + * address specified as &tp is invalid */ #include <sched.h> @@ -63,7 +19,7 @@ static pid_t unused_pid; static pid_t inval_pid = -1; static pid_t zero_pid; -struct tst_ts tp; +static struct tst_ts tp; static void *bad_addr; struct test_cases_t { @@ -73,10 +29,7 @@ struct test_cases_t { } test_cases[] = { { &inval_pid, &tp, EINVAL}, { &unused_pid, &tp, ESRCH}, -#ifndef UCLINUX - /* Skip since uClinux does not implement memory protection */ { &zero_pid, NULL, EFAULT} -#endif }; static struct test_variants { @@ -98,10 +51,6 @@ static struct test_variants { static void setup(void) { struct test_variants *tv = &variants[tst_variant]; - /* - * Initialize scheduling parameter structure to use with - * sched_setscheduler() - */ struct sched_param p = { 1 }; tst_res(TINFO, "Testing variant: %s", tv->desc); @@ -109,7 +58,6 @@ static void setup(void) bad_addr = tst_get_bad_addr(NULL); tp.type = tv->type; - /* Change scheduling policy to SCHED_RR */ if ((sched_setscheduler(0, SCHED_RR, &p)) == -1) tst_res(TFAIL | TTERRNO, "sched_setscheduler() failed"); @@ -127,9 +75,6 @@ static void run(unsigned int i) else ts = tst_ts_get(tc->tp); - /* - * Call sched_rr_get_interval(2) - */ TEST(tv->func(*tc->pid, ts)); if (TST_RET != -1) {
On 02-07-20, 15:06, Cyril Hrubis wrote: > Btw, we may as well add a check that the value is consistent with > /proc/sys/kernel/sched_rr_timeslice_ms. diff --git a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c index 31d7b5d56a52..0641b6651502 100644 --- a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c +++ b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c @@ -44,6 +44,7 @@ static void setup(void) static void run(void) { struct test_variants *tv = &variants[tst_variant]; + unsigned long long timeslice_ms; TEST(tv->func(0, tst_ts_get(&tp))); @@ -54,6 +55,8 @@ static void run(void) TST_RET); } + SAFE_FILE_SCANF("/proc/sys/kernel/sched_rr_timeslice_ms", "%llu", ×lice_ms); + if (!tst_ts_valid(&tp)) { tst_res(TPASS, "Time quantum %llis %llins", tst_ts_get_sec(tp), tst_ts_get_nsec(tp)); @@ -62,6 +65,7 @@ static void run(void) tst_ts_get_sec(tp), tst_ts_get_nsec(tp)); } + tst_res(TINFO, "%llu: %llu", timeslice_ms, tst_ts_to_ms(tp)); } static struct tst_test test = { and it is coming as: sched_rr_get_interval01.c:68: INFO: 25: 100 They aren't consistent here. Perhaps because first one is system wide while other one is per process ?
Hi Viresh > On 02-07-20, 15:06, Cyril Hrubis wrote: >> Btw, we may as well add a check that the value is consistent with >> /proc/sys/kernel/sched_rr_timeslice_ms. I guess cyril may want to add a check using TST_ASSERT_INT api like this TST_ASSERT_INT("/proc/sys/kernel/sched_rr_timeslice_ms", tst_ts_to_ms(tp)); > diff --git a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c > index 31d7b5d56a52..0641b6651502 100644 > --- a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c > +++ b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c > @@ -44,6 +44,7 @@ static void setup(void) > static void run(void) > { > struct test_variants *tv = &variants[tst_variant]; > + unsigned long long timeslice_ms; > > TEST(tv->func(0, tst_ts_get(&tp))); > > @@ -54,6 +55,8 @@ static void run(void) > TST_RET); > } > > + SAFE_FILE_SCANF("/proc/sys/kernel/sched_rr_timeslice_ms", "%llu", ×lice_ms); > + > if (!tst_ts_valid(&tp)) { > tst_res(TPASS, "Time quantum %llis %llins", > tst_ts_get_sec(tp), tst_ts_get_nsec(tp)); > @@ -62,6 +65,7 @@ static void run(void) > tst_ts_get_sec(tp), tst_ts_get_nsec(tp)); > } > > + tst_res(TINFO, "%llu: %llu", timeslice_ms, tst_ts_to_ms(tp)); > } > > static struct tst_test test = { > > > > and it is coming as: > > sched_rr_get_interval01.c:68: INFO: 25: 100 > > They aren't consistent here. Perhaps because first one is system wide > while other one is per process ? It is strange. On my machine, the two values are all 100. AFAIK, it has a bug (set in milliseconds but the result is shown in jiffies.) on old kernel whenCONFIG_HZ is not 1000. what kernel version do you test? [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=975e155ed8732cb81f55c021c441ae662dd040b5 >
On 03-07-20, 13:52, Yang Xu wrote: > Hi Viresh > > > On 02-07-20, 15:06, Cyril Hrubis wrote: > > > Btw, we may as well add a check that the value is consistent with > > > /proc/sys/kernel/sched_rr_timeslice_ms. > > I guess cyril may want to add a check using TST_ASSERT_INT api like this > > TST_ASSERT_INT("/proc/sys/kernel/sched_rr_timeslice_ms", tst_ts_to_ms(tp)); > > It is strange. > On my machine, the two values are all 100. AFAIK, it has a bug (set in milliseconds but the result is shown in jiffies.) on old kernel whenCONFIG_HZ is not 1000. what kernel version do you test? I am running an old kernel (4.4) and with 250 CONFIG_HZ. > [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=975e155ed8732cb81f55c021c441ae662dd040b5 I sent it to get included in stable kernels now. https://lore.kernel.org/lkml/ffdfb849a11b9cd66e0aded2161869e36aec7fc0.1593757471.git.viresh.kumar@linaro.org/
diff --git a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c index 6ebf873de798..9bad698aa6ec 100644 --- a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c +++ b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval01.c @@ -1,20 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - */ -/********************************************************** * * TEST IDENTIFIER : sched_rr_get_interval01 * @@ -62,81 +48,69 @@ * -P x : Pause for x seconds between iterations. * -t : Turn on syscall timing. * - ****************************************************************/ + */ -#include <errno.h> #include <sched.h> -#include "test.h" - -static void setup(); -static void cleanup(); - -char *TCID = "sched_rr_get_interval01"; -int TST_TOTAL = 1; - -struct timespec tp; - -int main(int ac, char **av) -{ - - int lc; - - tst_parse_opts(ac, av, NULL, NULL); +#include "tst_timer.h" - setup(); +struct tst_ts tp; - for (lc = 0; TEST_LOOPING(lc); lc++) { +static struct test_variants { + int (*func)(pid_t pid, void *ts); + enum tst_ts_type type; + char *desc; +} variants[] = { + { .func = libc_sched_rr_get_interval, .type = TST_LIBC_TIMESPEC, .desc = "vDSO or syscall with libc spec"}, - tst_count = 0; +#if (__NR_sched_rr_get_interval != __LTP__NR_INVALID_SYSCALL) + { .func = sys_sched_rr_get_interval, .type = TST_KERN_OLD_TIMESPEC, .desc = "syscall with old kernel spec"}, +#endif - /* - * Call sched_rr_get_interval(2) with pid=0 so that it will - * write into the timespec structure pointed to by tp, the - * round robin time quantum for the current process. - */ - TEST(sched_rr_get_interval(0, &tp)); +#if (__NR_sched_rr_get_interval_time64 != __LTP__NR_INVALID_SYSCALL) + { .func = sys_sched_rr_get_interval64, .type = TST_KERN_TIMESPEC, .desc = "syscall time64 with kernel spec"}, +#endif +}; - if (TEST_RETURN == 0) { - tst_resm(TPASS, "sched_rr_get_interval() returned %ld", - TEST_RETURN); - } else { - tst_resm(TFAIL | TTERRNO, - "Test Failed, sched_rr_get_interval()" - "returned %ld", TEST_RETURN); - } - } - - /* cleanup and exit */ - cleanup(); - tst_exit(); - -} - -/* setup() - performs all ONE TIME setup for this test */ -void setup(void) +static void setup(void) { - tst_require_root(); + struct test_variants *tv = &variants[tst_variant]; /* * Initialize scheduling parameter structure to use with * sched_setscheduler() */ struct sched_param p = { 1 }; - tst_sig(NOFORK, DEF_HANDLER, cleanup); + tst_res(TINFO, "Testing variant: %s", tv->desc); - TEST_PAUSE; + tp.type = tv->type; /* Change scheduling policy to SCHED_RR */ - if ((sched_setscheduler(0, SCHED_RR, &p)) == -1) { - tst_brkm(TBROK|TERRNO, cleanup, "sched_setscheduler() failed"); - } + if ((sched_setscheduler(0, SCHED_RR, &p)) == -1) + tst_res(TFAIL | TTERRNO, "sched_setscheduler() failed"); } -/* - *cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - */ -void cleanup(void) +static void run(void) { + struct test_variants *tv = &variants[tst_variant]; + + /* + * Call sched_rr_get_interval(2) with pid=0 so that it will + * write into the timespec structure pointed to by tp, the + * round robin time quantum for the current process. + */ + TEST(tv->func(0, tst_ts_get(&tp))); + if (!TST_RET) { + tst_res(TPASS, "sched_rr_get_interval() passed"); + } else { + tst_res(TFAIL | TTERRNO, "Test Failed, sched_rr_get_interval() returned %ld", + TST_RET); + } } + +static struct tst_test test = { + .test_all = run, + .test_variants = ARRAY_SIZE(variants), + .setup = setup, + .needs_root = 1, +}; diff --git a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval02.c b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval02.c index 367d9e3ff486..8da42e97404b 100644 --- a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval02.c +++ b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval02.c @@ -1,20 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - */ -/********************************************************** * * TEST IDENTIFIER : sched_rr_get_interval02 * @@ -63,84 +49,72 @@ * -P x : Pause for x seconds between iterations. * -t : Turn on syscall timing. * - ****************************************************************/ + */ -#include <errno.h> #include <sched.h> -#include "test.h" - -static void setup(); -static void cleanup(); +#include "tst_timer.h" -char *TCID = "sched_rr_get_interval02"; -int TST_TOTAL = 1; +struct tst_ts tp; -struct timespec tp; +static struct test_variants { + int (*func)(pid_t pid, void *ts); + enum tst_ts_type type; + char *desc; +} variants[] = { + { .func = libc_sched_rr_get_interval, .type = TST_LIBC_TIMESPEC, .desc = "vDSO or syscall with libc spec"}, -int main(int ac, char **av) -{ - - int lc; - - tst_parse_opts(ac, av, NULL, NULL); - - setup(); +#if (__NR_sched_rr_get_interval != __LTP__NR_INVALID_SYSCALL) + { .func = sys_sched_rr_get_interval, .type = TST_KERN_OLD_TIMESPEC, .desc = "syscall with old kernel spec"}, +#endif - for (lc = 0; TEST_LOOPING(lc); lc++) { +#if (__NR_sched_rr_get_interval_time64 != __LTP__NR_INVALID_SYSCALL) + { .func = sys_sched_rr_get_interval64, .type = TST_KERN_TIMESPEC, .desc = "syscall time64 with kernel spec"}, +#endif +}; - tst_count = 0; - - tp.tv_sec = 99; - tp.tv_nsec = 99; - /* - * Call sched_rr_get_interval(2) with pid=0 sothat it will - * write into the timespec structure pointed to by tp the - * round robin time quantum for the current process. - */ - TEST(sched_rr_get_interval(0, &tp)); - - if ((TEST_RETURN == 0) && (tp.tv_sec == 0) && (tp.tv_nsec == 0)) { - tst_resm(TPASS, "Test passed"); - } else { - tst_resm(TFAIL, "Test Failed, sched_rr_get_interval()" - "returned %ld, errno = %d : %s, tp.tv_sec = %d," - " tp.tv_nsec = %ld", TEST_RETURN, TEST_ERRNO, - strerror(TEST_ERRNO), (int)tp.tv_sec, - tp.tv_nsec); - } - } - - /* cleanup and exit */ - cleanup(); - tst_exit(); - -} - -/* setup() - performs all ONE TIME setup for this test */ -void setup(void) +static void setup(void) { - tst_require_root(); + struct test_variants *tv = &variants[tst_variant]; /* * Initialize scheduling parameter structure to use with * sched_setscheduler() */ struct sched_param p = { 1 }; - tst_sig(NOFORK, DEF_HANDLER, cleanup); + tst_res(TINFO, "Testing variant: %s", tv->desc); - TEST_PAUSE; + tp.type = tv->type; /* Change scheduling policy to SCHED_FIFO */ - if ((sched_setscheduler(0, SCHED_FIFO, &p)) == -1) { - tst_brkm(TBROK|TERRNO, cleanup, "sched_setscheduler() failed"); - } + if ((sched_setscheduler(0, SCHED_FIFO, &p)) == -1) + tst_res(TFAIL | TTERRNO, "sched_setscheduler() failed"); } -/* - *cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - */ -void cleanup(void) +static void run(void) { + struct test_variants *tv = &variants[tst_variant]; + tst_ts_set_sec(&tp, 99); + tst_ts_set_nsec(&tp, 99); + + /* + * Call sched_rr_get_interval(2) with pid=0 so that it will + * write into the timespec structure pointed to by tp the + * round robin time quantum for the current process. + */ + TEST(tv->func(0, tst_ts_get(&tp))); + + if (!TST_RET && tst_ts_valid(&tp) == -1) { + tst_res(TPASS, "sched_rr_get_interval() passed"); + } else { + tst_res(TFAIL | TTERRNO, "Test Failed, sched_rr_get_interval() returned %ld, tp.tv_sec = %lld, tp.tv_nsec = %lld", + TST_RET, tst_ts_get_sec(tp), tst_ts_get_nsec(tp)); + } } + +static struct tst_test test = { + .test_all = run, + .test_variants = ARRAY_SIZE(variants), + .setup = setup, + .needs_root = 1, +}; diff --git a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval03.c b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval03.c index 40b636b4dc65..0ccf47d2a561 100644 --- a/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval03.c +++ b/testcases/kernel/syscalls/sched_rr_get_interval/sched_rr_get_interval03.c @@ -1,20 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - */ -/********************************************************** * * TEST IDENTIFIER : sched_rr_get_interval03 * @@ -68,104 +54,100 @@ * -P x : Pause for x seconds between iterations. * -t : Turn on syscall timing. * - ****************************************************************/ + */ -#include <errno.h> #include <sched.h> -#include "test.h" - -static void setup(); -static void cleanup(); - -char *TCID = "sched_rr_get_interval03"; -struct timespec tp; +#include "tst_timer.h" static pid_t unused_pid; static pid_t inval_pid = -1; static pid_t zero_pid; +struct tst_ts tp; +static void *bad_addr; + struct test_cases_t { pid_t *pid; - struct timespec *tp; + struct tst_ts *tp; int exp_errno; } test_cases[] = { - { - &inval_pid, &tp, EINVAL}, { - &unused_pid, &tp, ESRCH}, + { &inval_pid, &tp, EINVAL}, + { &unused_pid, &tp, ESRCH}, #ifndef UCLINUX - /* Skip since uClinux does not implement memory protection */ - { - &zero_pid, (struct timespec *)-1, EFAULT} + /* Skip since uClinux does not implement memory protection */ + { &zero_pid, NULL, EFAULT} #endif }; -int TST_TOTAL = sizeof(test_cases) / sizeof(test_cases[0]); +static struct test_variants { + int (*func)(pid_t pid, void *ts); + enum tst_ts_type type; + char *desc; +} variants[] = { + { .func = libc_sched_rr_get_interval, .type = TST_LIBC_TIMESPEC, .desc = "vDSO or syscall with libc spec"}, -int main(int ac, char **av) -{ - - int lc, i; - - tst_parse_opts(ac, av, NULL, NULL); - - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) { - - tst_count = 0; - - for (i = 0; i < TST_TOTAL; ++i) { - /* - * Call sched_rr_get_interval(2) - */ - TEST(sched_rr_get_interval(*(test_cases[i].pid), - test_cases[i].tp)); - - if ((TEST_RETURN == -1) && - (TEST_ERRNO == test_cases[i].exp_errno)) { - tst_resm(TPASS, "Test Passed"); - } else { - tst_resm(TFAIL | TTERRNO, "Test Failed," - " sched_rr_get_interval() returned %ld", - TEST_RETURN); - } - } - } - - /* cleanup and exit */ - cleanup(); - - tst_exit(); +#if (__NR_sched_rr_get_interval != __LTP__NR_INVALID_SYSCALL) + { .func = sys_sched_rr_get_interval, .type = TST_KERN_OLD_TIMESPEC, .desc = "syscall with old kernel spec"}, +#endif -} +#if (__NR_sched_rr_get_interval_time64 != __LTP__NR_INVALID_SYSCALL) + { .func = sys_sched_rr_get_interval64, .type = TST_KERN_TIMESPEC, .desc = "syscall time64 with kernel spec"}, +#endif +}; -/* setup() - performs all ONE TIME setup for this test */ -void setup(void) +static void setup(void) { - tst_require_root(); + struct test_variants *tv = &variants[tst_variant]; /* * Initialize scheduling parameter structure to use with * sched_setscheduler() */ struct sched_param p = { 1 }; - tst_sig(NOFORK, DEF_HANDLER, cleanup); + tst_res(TINFO, "Testing variant: %s", tv->desc); - TEST_PAUSE; + bad_addr = tst_get_bad_addr(NULL); + tp.type = tv->type; /* Change scheduling policy to SCHED_RR */ - if ((sched_setscheduler(0, SCHED_RR, &p)) == -1) { - tst_brkm(TBROK|TERRNO, cleanup, "sched_setscheduler() failed"); - } + if ((sched_setscheduler(0, SCHED_RR, &p)) == -1) + tst_res(TFAIL | TTERRNO, "sched_setscheduler() failed"); - unused_pid = tst_get_unused_pid(cleanup); + unused_pid = tst_get_unused_pid(); } -/* - *cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - */ -void cleanup(void) +static void run(unsigned int i) { + struct test_variants *tv = &variants[tst_variant]; + struct test_cases_t *tc = &test_cases[i]; + struct timerspec *ts; + if (tc->exp_errno == EFAULT) + ts = bad_addr; + else + ts = tst_ts_get(tc->tp); + + /* + * Call sched_rr_get_interval(2) + */ + TEST(tv->func(*tc->pid, ts)); + + if (TST_RET != -1) { + tst_res(TFAIL, "sched_rr_get_interval() passed unexcpectedly"); + return; + } + + if (tc->exp_errno == TST_ERR) + tst_res(TPASS | TTERRNO, "sched_rr_get_interval() failed as excpected"); + else + tst_res(TFAIL | TTERRNO, "sched_rr_get_interval() failed unexcpectedly: %s", + tst_strerrno(tc->exp_errno)); } + +static struct tst_test test = { + .test = run, + .tcnt = ARRAY_SIZE(test_cases), + .test_variants = ARRAY_SIZE(variants), + .setup = setup, + .needs_root = 1, +};
This adds support for time64 tests to the existing sched_rr_get_interval() syscall tests. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- .../sched_rr_get_interval01.c | 116 ++++++-------- .../sched_rr_get_interval02.c | 122 ++++++--------- .../sched_rr_get_interval03.c | 146 ++++++++---------- 3 files changed, 157 insertions(+), 227 deletions(-)