From: Greg Kroah-Hartman Date: Fri, 23 Feb 2024 13:11:43 +0000 (+0100) Subject: 6.1-stable patches X-Git-Tag: v4.19.308~109 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=beb0f826a77f969f5497780ac7484e82f88b5129;p=thirdparty%2Fkernel%2Fstable-queue.git 6.1-stable patches added patches: sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch --- diff --git a/queue-6.1/sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch b/queue-6.1/sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch new file mode 100644 index 00000000000..78feaeadd80 --- /dev/null +++ b/queue-6.1/sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch @@ -0,0 +1,89 @@ +From 079be8fc630943d9fc70a97807feb73d169ee3fc Mon Sep 17 00:00:00 2001 +From: Cyril Hrubis +Date: Mon, 2 Oct 2023 13:55:51 +0200 +Subject: sched/rt: Disallow writing invalid values to sched_rt_period_us + +From: Cyril Hrubis + +commit 079be8fc630943d9fc70a97807feb73d169ee3fc upstream. + +The validation of the value written to sched_rt_period_us was broken +because: + + - the sysclt_sched_rt_period is declared as unsigned int + - parsed by proc_do_intvec() + - the range is asserted after the value parsed by proc_do_intvec() + +Because of this negative values written to the file were written into a +unsigned integer that were later on interpreted as large positive +integers which did passed the check: + + if (sysclt_sched_rt_period <= 0) + return EINVAL; + +This commit fixes the parsing by setting explicit range for both +perid_us and runtime_us into the sched_rt_sysctls table and processes +the values with proc_dointvec_minmax() instead. + +Alternatively if we wanted to use full range of unsigned int for the +period value we would have to split the proc_handler and use +proc_douintvec() for it however even the +Documentation/scheduller/sched-rt-group.rst describes the range as 1 to +INT_MAX. + +As far as I can tell the only problem this causes is that the sysctl +file allows writing negative values which when read back may confuse +userspace. + +There is also a LTP test being submitted for these sysctl files at: + + http://patchwork.ozlabs.org/project/ltp/patch/20230901144433.2526-1-chrubis@suse.cz/ + +Signed-off-by: Cyril Hrubis +Signed-off-by: Ingo Molnar +Link: https://lore.kernel.org/r/20231002115553.3007-2-chrubis@suse.cz +Cc: Mahmoud Adam +Signed-off-by: Greg Kroah-Hartman +--- + kernel/sched/rt.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +--- a/kernel/sched/rt.c ++++ b/kernel/sched/rt.c +@@ -37,6 +37,8 @@ static struct ctl_table sched_rt_sysctls + .maxlen = sizeof(unsigned int), + .mode = 0644, + .proc_handler = sched_rt_handler, ++ .extra1 = SYSCTL_ONE, ++ .extra2 = SYSCTL_INT_MAX, + }, + { + .procname = "sched_rt_runtime_us", +@@ -44,6 +46,8 @@ static struct ctl_table sched_rt_sysctls + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = sched_rt_handler, ++ .extra1 = SYSCTL_NEG_ONE, ++ .extra2 = SYSCTL_INT_MAX, + }, + { + .procname = "sched_rr_timeslice_ms", +@@ -2970,9 +2974,6 @@ static int sched_rt_global_constraints(v + #ifdef CONFIG_SYSCTL + static int sched_rt_global_validate(void) + { +- if (sysctl_sched_rt_period <= 0) +- return -EINVAL; +- + if ((sysctl_sched_rt_runtime != RUNTIME_INF) && + ((sysctl_sched_rt_runtime > sysctl_sched_rt_period) || + ((u64)sysctl_sched_rt_runtime * +@@ -3003,7 +3004,7 @@ static int sched_rt_handler(struct ctl_t + old_period = sysctl_sched_rt_period; + old_runtime = sysctl_sched_rt_runtime; + +- ret = proc_dointvec(table, write, buffer, lenp, ppos); ++ ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); + + if (!ret && write) { + ret = sched_rt_global_validate(); diff --git a/queue-6.1/sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch b/queue-6.1/sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch new file mode 100644 index 00000000000..8cffd88e9b1 --- /dev/null +++ b/queue-6.1/sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch @@ -0,0 +1,44 @@ +From c1fc6484e1fb7cc2481d169bfef129a1b0676abe Mon Sep 17 00:00:00 2001 +From: Cyril Hrubis +Date: Wed, 2 Aug 2023 17:19:06 +0200 +Subject: sched/rt: sysctl_sched_rr_timeslice show default timeslice after reset + +From: Cyril Hrubis + +commit c1fc6484e1fb7cc2481d169bfef129a1b0676abe upstream. + +The sched_rr_timeslice can be reset to default by writing value that is +<= 0. However after reading from this file we always got the last value +written, which is not useful at all. + +$ echo -1 > /proc/sys/kernel/sched_rr_timeslice_ms +$ cat /proc/sys/kernel/sched_rr_timeslice_ms +-1 + +Fix this by setting the variable that holds the sysctl file value to the +jiffies_to_msecs(RR_TIMESLICE) in case that <= 0 value was written. + +Signed-off-by: Cyril Hrubis +Signed-off-by: Peter Zijlstra (Intel) +Reviewed-by: Petr Vorel +Acked-by: Mel Gorman +Tested-by: Petr Vorel +Cc: Mahmoud Adam +Link: https://lore.kernel.org/r/20230802151906.25258-3-chrubis@suse.cz +Signed-off-by: Greg Kroah-Hartman +--- + kernel/sched/rt.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/kernel/sched/rt.c ++++ b/kernel/sched/rt.c +@@ -3048,6 +3048,9 @@ static int sched_rr_handler(struct ctl_t + sched_rr_timeslice = + sysctl_sched_rr_timeslice <= 0 ? RR_TIMESLICE : + msecs_to_jiffies(sysctl_sched_rr_timeslice); ++ ++ if (sysctl_sched_rr_timeslice <= 0) ++ sysctl_sched_rr_timeslice = jiffies_to_msecs(RR_TIMESLICE); + } + mutex_unlock(&mutex); + diff --git a/queue-6.1/series b/queue-6.1/series index d97558d11df..cc7b7cc47eb 100644 --- a/queue-6.1/series +++ b/queue-6.1/series @@ -1,3 +1,5 @@ net-sched-retire-cbq-qdisc.patch net-sched-retire-atm-qdisc.patch net-sched-retire-dsmark-qdisc.patch +sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch +sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch