mirror-linux/kernel/sched
kuyo chang fc975cfb36 sched/deadline: Fix dl_server runtime calculation formula
In our testing with 6.12 based kernel on a big.LITTLE system, we were
seeing instances of RT tasks being blocked from running on the LITTLE
cpus for multiple seconds of time, apparently by the dl_server. This
far exceeds the default configured 50ms per second runtime.

This is due to the fair dl_server runtime calculation being scaled
for frequency & capacity of the cpu.

Consider the following case under a Big.LITTLE architecture:
Assume the runtime is: 50,000,000 ns, and Frequency/capacity
scale-invariance defined as below:
Frequency scale-invariance: 100
Capacity scale-invariance: 50
First by Frequency scale-invariance,
the runtime is scaled to 50,000,000 * 100 >> 10 = 4,882,812
Then by capacity scale-invariance,
it is further scaled to 4,882,812 * 50 >> 10 = 238,418.
So it will scaled to 238,418 ns.

This smaller "accounted runtime" value is what ends up being
subtracted against the fair-server's runtime for the current period.
Thus after 50ms of real time, we've only accounted ~238us against the
fair servers runtime. This 209:1 ratio in this example means that on
the smaller cpu the fair server is allowed to continue running,
blocking RT tasks, for over 10 seconds before it exhausts its supposed
50ms of runtime.  And on other hardware configurations it can be even
worse.

For the fair deadline_server, to prevent realtime tasks from being
unexpectedly delayed, we really do want to use fixed time, and not
scaled time for smaller capacity/frequency cpus. So remove the scaling
from the fair server's accounting to fix this.

Fixes: a110a81c52 ("sched/deadline: Deferrable dl server")
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Suggested-by: John Stultz <jstultz@google.com>
Signed-off-by: kuyo chang <kuyo.chang@mediatek.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Juri Lelli <juri.lelli@redhat.com>
Acked-by: John Stultz <jstultz@google.com>
Tested-by: John Stultz <jstultz@google.com>
Link: https://lore.kernel.org/r/20250702021440.2594736-1-kuyo.chang@mediatek.com
2025-07-04 10:35:56 +02:00
..
Makefile tracing: Disable branch profiling in noinstr code 2025-03-22 09:49:26 +01:00
autogroup.c sched_ext: Fixes for v6.14-rc2 2025-02-14 11:14:24 -08:00
autogroup.h
build_policy.c sched_ext: Move built-in idle CPU selection policy to a separate file 2025-01-27 12:43:43 -10:00
build_utility.c sched/debug: Make CONFIG_SCHED_DEBUG functionality unconditional 2025-03-19 22:20:53 +01:00
clock.c
completion.c
core.c sched/core: Fix migrate_swap() vs. hotplug 2025-07-01 15:02:03 +02:00
core_sched.c sched/debug: Change SCHED_WARN_ON() to WARN_ON_ONCE() 2025-03-19 22:20:53 +01:00
cpuacct.c
cpudeadline.c
cpudeadline.h
cpufreq.c
cpufreq_schedutil.c cpufreq/sched: schedutil: Add helper for governor checks 2025-05-07 21:17:56 +02:00
cpupri.c
cpupri.h
cputime.c sched/clock: Don't define sched_clock_irqtime as static key 2025-03-10 14:22:58 +01:00
deadline.c sched/deadline: Fix dl_server runtime calculation formula 2025-07-04 10:35:56 +02:00
debug.c - The 2 patch series "zram: support algorithm-specific parameters" from 2025-06-02 16:00:26 -07:00
ext.c sched_ext, sched/core: Don't call scx_group_set_weight() prematurely from sched_create_group() 2025-06-17 08:19:55 -10:00
ext.h sched_ext, sched/core: Don't call scx_group_set_weight() prematurely from sched_create_group() 2025-06-17 08:19:55 -10:00
ext_idle.c sched_ext: idle: Skip cross-node search with !CONFIG_NUMA 2025-06-03 08:22:27 -10:00
ext_idle.h sched_ext: idle: Explicitly pass allowed cpumask to scx_select_cpu_dfl() 2025-04-07 07:13:52 -10:00
fair.c - The 2 patch series "zram: support algorithm-specific parameters" from 2025-06-02 16:00:26 -07:00
features.h sched/fair: Untangle NEXT_BUDDY and pick_next_task() 2024-12-09 11:48:13 +01:00
idle.c sched_ext: idle: Refresh idle masks during idle-to-idle transitions 2025-01-10 12:40:42 -10:00
isolation.c sched/isolation: Make use of more than one housekeeping cpu 2025-04-08 20:55:55 +02:00
loadavg.c
membarrier.c
pelt.c sched/fair: Use the new cfs_rq.h_nr_runnable 2024-12-09 11:48:11 +01:00
pelt.h
psi.c treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
rt.c sched/rt: Fix race in push_rt_task 2025-04-08 20:55:55 +02:00
sched-pelt.h
sched.h sched_ext: Changes for v6.16 2025-05-27 21:12:50 -07:00
smp.h
stats.c docs: Update Schedstat version to 17 2024-12-20 15:31:18 +01:00
stats.h sched/debug: Change SCHED_WARN_ON() to WARN_ON_ONCE() 2025-03-19 22:20:53 +01:00
stop_task.c
swait.c
syscalls.c sched: Bypass bandwitdh checks with runtime disabled RT_GROUP_SCHED 2025-04-08 20:55:54 +02:00
topology.c Power management updates for 6.16-rc1 2025-05-27 16:48:47 -07:00
wait.c
wait_bit.c sched/wait: Remove unused bit_wait_io_timeout 2024-10-07 09:28:41 +02:00