[PATCH] fix share rt runtime with offline rq

From: chenying
Date: Fri Dec 20 2019 - 21:20:58 EST


In my environment,cpu0-11 are online, cpu12-15 are offline, CPU2 is isolated,
sched_rt_runtime_us is 950000,and then bind a rt process with dead loop to CPU2.
We can see that CPU usage on CPU2 reaches 100%,but only one cpu is isolated,
so it can be inferred that CPU2 shares the rt runtime of offline cpu.

/ # cat /sys/devices/system/cpu/online
0-11
/ # cat /sys/devices/system/cpu/offline
12-15
/ # cat /sys/devices/system/cpu/isolated
2
/ # cat /proc/sys/kernel/sched_rt_runtime_us
950000
/ # chrt -p 357
pid 357's current scheduling policy: SCHED_FIFO
pid 357's current scheduling priority: 1

top - 15:52:12 up 4 min, 0 users, load average: 0.92, 0.41, 0.16
Tasks: 201 total, 2 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu4 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu5 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu6 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu7 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu8 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu9 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu10 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
357 root -2 0 4044 172 136 R 100.0 0.0 2:32.99 deadloop
366 root 20 0 22060 2404 2128 R 0.7 0.0 0:00.06 top
1 root 20 0 2624 20 0 S 0.0 0.0 0:05.93 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0

Signed-off-by: chenying <chen.ying153@xxxxxxxxxx>
---
kernel/sched/rt.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
index a532558..d20dc86 100644
--- a/kernel/sched/rt.c
+++ b/kernel/sched/rt.c
@@ -648,8 +648,12 @@ static void do_balance_runtime(struct rt_rq *rt_rq)
rt_period = ktime_to_ns(rt_b->rt_period);
for_each_cpu(i, rd->span) {
struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i);
+ struct rq *rq = rq_of_rt_rq(iter);
s64 diff;

+ if (!rq->online)
+ continue;
+
if (iter == rt_rq)
continue;

--
2.15.2