[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250609194611.690678-1-richard120310@gmail.com>
Date: Tue, 10 Jun 2025 03:46:11 +0800
From: I Hsin Cheng <richard120310@...il.com>
To: sboyd@...nel.org
Cc: jstultz@...gle.com,
tglx@...utronix.de,
linux-kernel@...r.kernel.org,
skhan@...uxfoundation.org,
linux-kernel-mentees@...ts.linux.dev,
jserv@...s.ncku.edu.tw,
I Hsin Cheng <richard120310@...il.com>
Subject: [RFC PATCH] clocksource: Enhancement for clocks_calc_mult_shift()
Previously, counting the value of "sftacc" within
"clocks_calc_mult_shift()" use a while loop to determine the amount of
decrement operation for "sftacc".
It's equivalent to the position of MSB of "tmp", for which we can
derive from (32 - __builtin_clz(tmp)). Use 32 instead of 31 here because
1UL should be treat as an amount of 1, not the index 0, and even though
"tmp" is of type u64, since it's already shifted right by 32, only the
lowest 32 bits will be possible to have non-zero value.
This change is tested against a test script [1].
Result shown that it can save a significant amount of execution overhead
for this function, which is invoked often, the whole system would likely
benefit from it.
-----------------------------
| old version | new version |
-----------------------------
| 11500.6 ns | 44 ns |
-----------------------------
The execution time is reduced around 99.7%
Signed-off-by: I Hsin Cheng <richard120310@...il.com>
---
[1]:
static int __init test_init(void)
{
u32 mult, shift;
u32 from, to, maxsec;
ktime_t start_time, end_time, total_time;
pr_info("Starting clocks_calc_mult_shift simple test\n");
start_time = ktime_get();
// Test with parameters from 1 to 1000
for (from = 1; from <= 1000; from += 100) {
for (to = 1; to <= 1000; to += 100) {
for (maxsec = 1; maxsec <= 10; maxsec++) {
clocks_calc_mult_shift(&mult, &shift, from, to, maxsec);
}
}
}
end_time = ktime_get();
total_time = ktime_to_ns(ktime_sub(end_time, start_time));
pr_info("Test completed\n");
pr_info("Total execution time: %lld ns \n", total_time);
return 0;
}
The test is running in the form of kernel module.
The test machine is running ubuntu 24.04 on x86_64 machine with kernel
version of v6.14.0, CPU type is AMD Ryzen 7 5700X3D 8-Core Processor.
Best regards,
I Hsin Cheng.
---
kernel/time/clocksource.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 2a7802ec480c..b4f8fffae847 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -66,10 +66,7 @@ clocks_calc_mult_shift(u32 *mult, u32 *shift, u32 from, u32 to, u32 maxsec)
* range:
*/
tmp = ((u64)maxsec * from) >> 32;
- while (tmp) {
- tmp >>=1;
- sftacc--;
- }
+ sftacc -= (32 - __builtin_clz(tmp));
/*
* Find the conversion shift/mult pair which has the best
--
2.43.0
Powered by blists - more mailing lists