Re: [PATCH] x86/aperfmperf: use time_is_before_jiffies(a + b) to replace "jiffies - a > b"

From: Yu Zhe
Date: Wed Jul 27 2022 - 22:56:00 EST


在 2022年07月28日 00:00, Peter Zijlstra 写道:

On Wed, Jul 27, 2022 at 11:14:05AM +0800, Yu Zhe wrote:
time_is_before_jiffies deals with timer wrapping correctly.
Please explain how the current code does not.

1. If the timer wrap changes in the future you won't have to alter your code.

2. unsigned long ut;

ut = ULONG_MAX + 4;

printf("time_after(ut, ULONG_MAX), ut:%d, %d --> %d\n", ut,
time_after(ut, ULONG_MAX), (ULONG_MAX - ut) < 0);


In this case, time_after returns true, it's correct.

Signed-off-by: Yu Zhe <yuzhe@xxxxxxxxxxxx>
---
arch/x86/kernel/cpu/aperfmperf.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/cpu/aperfmperf.c b/arch/x86/kernel/cpu/aperfmperf.c
index 1f60a2b27936..22e0bac3fffe 100644
--- a/arch/x86/kernel/cpu/aperfmperf.c
+++ b/arch/x86/kernel/cpu/aperfmperf.c
@@ -423,7 +423,7 @@ unsigned int arch_freq_get_on_cpu(int cpu)
* Bail on invalid count and when the last update was too long ago,
* which covers idle and NOHZ full CPUs.
*/
- if (!mcnt || (jiffies - last) > MAX_SAMPLE_AGE)
+ if (!mcnt || time_is_before_jiffies(last + MAX_SAMPLE_AGE))
goto fallback;
return div64_u64((cpu_khz * acnt), mcnt);
--
2.11.0