linux/kernel
Liangyan 5e2d2cc258 sched/fair: Don't assign runtime for throttled cfs_rq
do_sched_cfs_period_timer() will refill cfs_b runtime and call
distribute_cfs_runtime to unthrottle cfs_rq, sometimes cfs_b->runtime
will allocate all quota to one cfs_rq incorrectly, then other cfs_rqs
attached to this cfs_b can't get runtime and will be throttled.

We find that one throttled cfs_rq has non-negative
cfs_rq->runtime_remaining and cause an unexpetced cast from s64 to u64
in snippet:

  distribute_cfs_runtime() {
    runtime = -cfs_rq->runtime_remaining + 1;
  }

The runtime here will change to a large number and consume all
cfs_b->runtime in this cfs_b period.

According to Ben Segall, the throttled cfs_rq can have
account_cfs_rq_runtime called on it because it is throttled before
idle_balance, and the idle_balance calls update_rq_clock to add time
that is accounted to the task.

This commit prevents cfs_rq to be assgined new runtime if it has been
throttled until that distribute_cfs_runtime is called.

Signed-off-by: Liangyan <liangyan.peng@linux.alibaba.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Valentin Schneider <valentin.schneider@arm.com>
Reviewed-by: Ben Segall <bsegall@google.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: shanpeic@linux.alibaba.com
Cc: stable@vger.kernel.org
Cc: xlpang@linux.alibaba.com
Fixes: d3d9dc3302 ("sched: Throttle entities exceeding their allowed bandwidth")
Link: https://lkml.kernel.org/r/20190826121633.6538-1-liangyan.peng@linux.alibaba.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2019-09-03 08:55:07 +02:00
..
bpf bpf: handle 32-bit zext during constant blinding 2019-08-26 23:05:01 +02:00
cgroup Merge branch 'work.mount0' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs 2019-07-19 10:42:02 -07:00
configs
debug
dma dma-direct: fix zone selection after an unaddressable CMA allocation 2019-08-21 07:14:10 +09:00
events perf/core: Fix creating kernel counters for PMUs that override event->cpu 2019-07-25 15:41:31 +02:00
gcov
irq genirq: Properly pair kobject_del() with kobject_add() 2019-08-19 21:41:19 +02:00
livepatch
locking locking/mutex: Test for initialized mutex 2019-07-25 15:39:27 +02:00
power
printk
rcu
sched sched/fair: Don't assign runtime for throttled cfs_rq 2019-09-03 08:55:07 +02:00
time timekeeping/vsyscall: Prevent math overflow in BOOTTIME update 2019-08-23 02:12:11 +02:00
trace tracing: Correct kdoc formats 2019-08-31 06:51:56 -04:00
.gitignore
acct.c
async.c
audit.c
audit.h
audit_fsnotify.c
audit_tree.c
audit_watch.c
auditfilter.c
auditsc.c
backtracetest.c
bounds.c
capability.c
compat.c
configs.c kernel/configs: Replace GPL boilerplate code with SPDX identifier 2019-07-30 18:34:15 +02:00
context_tracking.c
cpu.c
cpu_pm.c
crash_core.c
crash_dump.c
cred.c Merge branch 'access-creds' 2019-07-25 08:36:29 -07:00
delayacct.c
dma.c
elfcore.c
exec_domain.c
exit.c exit: make setting exit_state consistent 2019-07-30 19:57:14 +02:00
extable.c
fail_function.c
fork.c sched/fair: Don't free p->numa_faults with concurrent readers 2019-07-25 15:37:04 +02:00
freezer.c
futex.c
gen_kheaders.sh
groups.c
hung_task.c
iomem.c
irq_work.c
jump_label.c
kallsyms.c kallsyms: Don't let kallsyms_lookup_size_offset() fail on retrieving the first symbol 2019-08-27 16:19:56 +01:00
kcmp.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt sched/rt, Kconfig: Unbreak def/oldconfig with CONFIG_PREEMPT=y 2019-07-22 18:05:11 +02:00
kcov.c
kexec.c
kexec_core.c
kexec_file.c
kexec_internal.h
kheaders.c
kmod.c
kprobes.c kprobes: Fix potential deadlock in kprobe_optimizer() 2019-08-19 12:22:19 +02:00
ksysfs.c
kthread.c
latencytop.c
Makefile memremap: move from kernel/ to mm/ 2019-08-03 07:02:01 -07:00
module-internal.h
module.c modules: page-align module section allocations only for arches supporting strict module rwx 2019-08-21 10:43:56 +02:00
module_signing.c
notifier.c
nsproxy.c
padata.c padata: use smp_mb in padata_reorder to avoid orphaned padata jobs 2019-07-18 13:39:54 +08:00
panic.c
params.c
pid.c kernel/pid.c: convert struct pid count to refcount_t 2019-07-16 19:23:24 -07:00
pid_namespace.c proc/sysctl: add shared variables for range check 2019-07-18 17:08:07 -07:00
profile.c
ptrace.c ptrace: add PTRACE_GET_SYSCALL_INFO request 2019-07-16 19:23:24 -07:00
range.c
reboot.c
relay.c
resource.c resource: avoid unnecessary lookups in find_next_iomem_res() 2019-07-18 17:08:06 -07:00
rseq.c
seccomp.c
signal.c signal: Allow cifs and drbd to receive their terminating signals 2019-08-19 06:34:13 -05:00
smp.c smp: Warn on function calls from softirq context 2019-07-20 11:27:16 +02:00
smpboot.c
smpboot.h
softirq.c
stackleak.c
stacktrace.c stacktrace: Force USER_DS for stack_trace_save_user() 2019-07-18 16:47:24 +02:00
stop_machine.c
sys.c
sys_ni.c
sysctl.c proc/sysctl: add shared variables for range check 2019-07-18 17:08:07 -07:00
sysctl_binary.c
task_work.c
taskstats.c
test_kprobes.c
torture.c
tracepoint.c The main changes in this release include: 2019-07-18 11:51:00 -07:00
tsacct.c
ucount.c proc/sysctl: add shared variables for range check 2019-07-18 17:08:07 -07:00
uid16.c
uid16.h
umh.c
up.c
user-return-notifier.c
user.c
user_namespace.c
utsname.c
utsname_sysctl.c
watchdog.c
watchdog_hld.c
workqueue.c
workqueue_internal.h