sched/cputime: Fix getrusage(RUSAGE_THREAD) with nohz_full
authorFrederic Weisbecker <frederic@kernel.org>
Tue, 26 Oct 2021 14:10:55 +0000 (16:10 +0200)
committerThomas Gleixner <tglx@linutronix.de>
Thu, 2 Dec 2021 14:08:22 +0000 (15:08 +0100)
commite7f2be115f0746b969c0df14c0d182f65f005ca5
tree84bd68b584c1eb411f4f02161a843ed4c472cde2
parentd58071a8a76d779eedab38033ae4c821c30295a5
sched/cputime: Fix getrusage(RUSAGE_THREAD) with nohz_full

getrusage(RUSAGE_THREAD) with nohz_full may return shorter utime/stime
than the actual time.

task_cputime_adjusted() snapshots utime and stime and then adjust their
sum to match the scheduler maintained cputime.sum_exec_runtime.
Unfortunately in nohz_full, sum_exec_runtime is only updated once per
second in the worst case, causing a discrepancy against utime and stime
that can be updated anytime by the reader using vtime.

To fix this situation, perform an update of cputime.sum_exec_runtime
when the cputime snapshot reports the task as actually running while
the tick is disabled. The related overhead is then contained within the
relevant situations.

Reported-by: Hasegawa Hitomi <hasegawa-hitomi@fujitsu.com>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Hasegawa Hitomi <hasegawa-hitomi@fujitsu.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Masayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Acked-by: Phil Auld <pauld@redhat.com>
Link: https://lore.kernel.org/r/20211026141055.57358-3-frederic@kernel.org
include/linux/sched/cputime.h
kernel/sched/cputime.c