mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-14 13:19:36 +02:00
sched/cputime: Fix mul_u64_u64_div_u64() precision for cputime
commit77baa5bafc
upstream. 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 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b56dee6c9b
commit
12f98cc6fb
|
@ -595,6 +595,12 @@ void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev,
|
||||||
}
|
}
|
||||||
|
|
||||||
stime = mul_u64_u64_div_u64(stime, rtime, stime + utime);
|
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:
|
update:
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue
Block a user