From: Richard Palethorpe <rpalethorpe@suse.de>
To: Cyril Hrubis <chrubis@suse.cz>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH] sched: add sched sysctl sanity test
Date: Mon, 02 Oct 2023 09:26:05 +0100 [thread overview]
Message-ID: <87cyxx2tna.fsf@suse.de> (raw)
In-Reply-To: <20230901144433.2526-1-chrubis@suse.cz>
Hello,
[This is a resend because I had some network issues; sorry if it comes
through twice]
Cyril Hrubis <chrubis@suse.cz> writes:
> Currently the test fails due to kernel bug, I will send patch to LKML
> later on.
>
> The problem with kernel is that sysctl_sched_rt_period is unsigned int
> but it's processed with proc_dointvec() which means that you are allowed
> to write negative values into the variable even though documentation
> says it shouldn't be possible and the kernel code asserts that rt_period
> is > 0.
>
> Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
> ---
> runtest/sched | 2 +
> testcases/kernel/sched/sysctl/.gitignore | 1 +
> testcases/kernel/sched/sysctl/Makefile | 7 ++
> .../kernel/sched/sysctl/proc_sched_rt01.c | 115 ++++++++++++++++++
> 4 files changed, 125 insertions(+)
> create mode 100644 testcases/kernel/sched/sysctl/.gitignore
> create mode 100644 testcases/kernel/sched/sysctl/Makefile
> create mode 100644 testcases/kernel/sched/sysctl/proc_sched_rt01.c
>
> diff --git a/runtest/sched b/runtest/sched
> index 172fe4174..3457114f4 100644
> --- a/runtest/sched
> +++ b/runtest/sched
> @@ -16,3 +16,5 @@ sched_cli_serv run_sched_cliserv.sh
> sched_stress sched_stress.sh
>
> autogroup01 autogroup01
> +
> +proc_sched_rt01
> diff --git a/testcases/kernel/sched/sysctl/.gitignore b/testcases/kernel/sched/sysctl/.gitignore
> new file mode 100644
> index 000000000..29b859b81
> --- /dev/null
> +++ b/testcases/kernel/sched/sysctl/.gitignore
> @@ -0,0 +1 @@
> +proc_sched_rt01
> diff --git a/testcases/kernel/sched/sysctl/Makefile b/testcases/kernel/sched/sysctl/Makefile
> new file mode 100644
> index 000000000..18896b6f2
> --- /dev/null
> +++ b/testcases/kernel/sched/sysctl/Makefile
> @@ -0,0 +1,7 @@
> +# SPDX-License-Identifier: GPL-2.0-or-later
> +
> +top_srcdir ?= ../../../..
> +
> +include $(top_srcdir)/include/mk/testcases.mk
> +
> +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> diff --git a/testcases/kernel/sched/sysctl/proc_sched_rt01.c b/testcases/kernel/sched/sysctl/proc_sched_rt01.c
> new file mode 100644
> index 000000000..b30256792
> --- /dev/null
> +++ b/testcases/kernel/sched/sysctl/proc_sched_rt01.c
> @@ -0,0 +1,115 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) Cyril Hrubis <chrubis@suse.cz>
> + */
> +
> +/*\
> + * [Description]
> + *
> + * Sanity tests for the /proc/sys/kernel/sched_r* files.
> + *
> + * - The sched_rt_period_us range is 1 to INT_MAX
> + * try invalid values and check for EINVAL
> + *
> + * - The sched_rt_runtime_us range is -1 to INT_MAX
> + * try invalid values and check for EINVAL
> + *
> + * - The sched_rt_runtime_us must be less or equal to sched_rt_period_us
> + *
> + * - Reset sched_rr_timeslice_ms to default value by writing -1 and check that
> + * we get the default value on next read.
> + *
> + * This is a regression test for a commit:
> + *
> + * commit c1fc6484e1fb7cc2481d169bfef129a1b0676abe
> + * Author: Cyril Hrubis <chrubis@suse.cz>
> + * Date: Wed Aug 2 17:19:06 2023 +0200
> + *
> + * sched/rt: sysctl_sched_rr_timeslice show default timeslice after reset
> + */
> +
> +#include <stdio.h>
> +#include "tst_test.h"
> +
> +#define RT_PERIOD_US "/proc/sys/kernel/sched_rt_period_us"
> +#define RT_RUNTIME_US "/proc/sys/kernel/sched_rt_runtime_us"
> +#define RR_TIMESLICE_MS "/proc/sys/kernel/sched_rr_timeslice_ms"
> +
> +static int period_fd;
> +static int runtime_fd;
> +
> +static void rr_timeslice_ms_reset(void)
> +{
> + long timeslice_ms;
> +
> + SAFE_FILE_PRINTF(RR_TIMESLICE_MS, "-1");
> + SAFE_FILE_SCANF(RR_TIMESLICE_MS, "%li", ×lice_ms);
> +
> + TST_EXP_EXPR(timeslice_ms > 0,
> + "timeslice_ms > 0 after reset to default");
> +}
> +
> +static void rt_period_us_einval(void)
> +{
> + TST_EXP_FAIL(write(period_fd, "0", 2), EINVAL,
> + "echo 0 > "RT_PERIOD_US);
> + TST_EXP_FAIL(write(period_fd, "-1", 2), EINVAL,
> + "echo -1 > "RT_PERIOD_US);
> +}
> +
> +static void rt_runtime_us_einval(void)
> +{
> + TST_EXP_FAIL(write(runtime_fd, "-2", 2), EINVAL,
> + "echo -2 > "RT_RUNTIME_US);
> +}
I would happily add my tags to the test except that as a general
principal, I don't want to deal with tests that fail if an unexpected
error number is returned.
Unless something can be done (e.g. with meta-data), so that TST_EXP_FAIL
and similar can be reduced to a TCONF when the wrong errno is returned.
For instance, this would allow running the tests with a seccomp BPF
profile, LSM, CGroup or /proc bind mount that blocks the write.
Or you could just seperate the tests I guess. Then the reset can be
checked while skipping the errno checks.
> +
> +static void rt_runtime_us_le_period_us(void)
> +{
> + int period_us;
> + char buf[32];
> +
> + SAFE_FILE_SCANF(RT_PERIOD_US, "%i", &period_us);
> +
> + sprintf(buf, "%i", period_us+1);
> +
> + TST_EXP_FAIL(write(runtime_fd, buf, strlen(buf)), EINVAL,
> + "echo rt_period_us+1 > "RT_RUNTIME_US);
> +}
> +
> +static void verify_sched_proc(void)
> +{
> + rr_timeslice_ms_reset();
> + rt_period_us_einval();
> + rt_runtime_us_einval();
> + rt_runtime_us_le_period_us();
> +}
> +
> +static void setup(void)
> +{
> + period_fd = open(RT_PERIOD_US, O_RDWR);
> + runtime_fd = open(RT_RUNTIME_US, O_RDWR);
> +}
> +
> +static void cleanup(void)
> +{
> + if (period_fd > 0)
> + SAFE_CLOSE(period_fd);
> +
> + if (runtime_fd > 0)
> + SAFE_CLOSE(runtime_fd);
> +}
> +
> +static struct tst_test test = {
> + .needs_root = 1,
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = verify_sched_proc,
> + .tags = (struct tst_tag []) {
> + {"linux-git", "c1fc6484e1fb"},
> + {}
> + },
> + .needs_kconfigs = (const char *[]) {
> + "CONFIG_SYSCTL",
> + NULL
> + },
> +};
> --
> 2.41.0
--
Thank you,
Richard.
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2023-10-02 10:42 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-01 14:44 [LTP] [PATCH] sched: add sched sysctl sanity test Cyril Hrubis
2023-09-01 15:53 ` Cyril Hrubis
2023-09-01 16:15 ` Petr Vorel
2023-09-01 17:48 ` Petr Vorel
2023-10-02 8:26 ` Richard Palethorpe [this message]
2023-10-02 11:09 ` Cyril Hrubis
2023-10-03 8:18 ` Richard Palethorpe
2023-10-03 8:54 ` Cyril Hrubis
2023-10-04 9:22 ` Richard Palethorpe
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=87cyxx2tna.fsf@suse.de \
--to=rpalethorpe@suse.de \
--cc=chrubis@suse.cz \
--cc=ltp@lists.linux.it \
/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 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.