mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:18:58 +00:00
sched/cputime: Fix mul_u64_u64_div_u64() precision for cputime
In extreme test scenarios:
the 14th field utime in /proc/xx/stat is greater than sum_exec_runtime,
utime = 18446744073709518790 ns, rtime = 135989749728000 ns
In cputime_adjust() process, stime is greater than rtime due to
mul_u64_u64_div_u64() precision problem.
before call mul_u64_u64_div_u64(),
stime = 175136586720000, rtime = 135989749728000, utime = 1416780000.
after call mul_u64_u64_div_u64(),
stime = 135989949653530
unsigned reversion occurs because rtime is less than stime.
utime = rtime - stime = 135989749728000 - 135989949653530
= -199925530
= (u64)18446744073709518790
Trigger condition:
1). User task run in kernel mode most of time
2). ARM64 architecture
3). TICK_CPU_ACCOUNTING=y
CONFIG_VIRT_CPU_ACCOUNTING_NATIVE is not set
Fix mul_u64_u64_div_u64() conversion precision by reset stime to rtime
Fixes: 3dc167ba57
("sched/cputime: Improve cputime_adjust()")
Signed-off-by: Zheng Zucheng <zhengzucheng@huawei.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: <stable@vger.kernel.org>
Link: https://lkml.kernel.org/r/20240726023235.217771-1-zhengzucheng@huawei.com
This commit is contained in:
parent
8400291e28
commit
77baa5bafc
@ -582,6 +582,12 @@ void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev,
|
||||
}
|
||||
|
||||
stime = mul_u64_u64_div_u64(stime, rtime, stime + utime);
|
||||
/*
|
||||
* Because mul_u64_u64_div_u64() can approximate on some
|
||||
* achitectures; enforce the constraint that: a*b/(b+c) <= a.
|
||||
*/
|
||||
if (unlikely(stime > rtime))
|
||||
stime = rtime;
|
||||
|
||||
update:
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user