| From 57244dbb06dde9c4ed2d77d65971384cabf5e86a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 23 Mar 2025 14:36:24 -0300 |
| Subject: clocksource: Fix the CPUs' choice in the watchdog per CPU |
| verification |
| |
| From: Guilherme G. Piccoli <gpiccoli@igalia.com> |
| |
| [ Upstream commit 08d7becc1a6b8c936e25d827becabfe3bff72a36 ] |
| |
| Right now, if the clocksource watchdog detects a clocksource skew, it might |
| perform a per CPU check, for example in the TSC case on x86. In other |
| words: supposing TSC is detected as unstable by the clocksource watchdog |
| running at CPU1, as part of marking TSC unstable the kernel will also run a |
| check of TSC readings on some CPUs to be sure it is synced between them |
| all. |
| |
| But that check happens only on some CPUs, not all of them; this choice is |
| based on the parameter "verify_n_cpus" and in some random cpumask |
| calculation. So, the watchdog runs such per CPU checks on up to |
| "verify_n_cpus" random CPUs among all online CPUs, with the risk of |
| repeating CPUs (that aren't double checked) in the cpumask random |
| calculation. |
| |
| But if "verify_n_cpus" > num_online_cpus(), it should skip the random |
| calculation and just go ahead and check the clocksource sync between |
| all online CPUs, without the risk of skipping some CPUs due to |
| duplicity in the random cpumask calculation. |
| |
| Tests in a 4 CPU laptop with TSC skew detected led to some cases of the per |
| CPU verification skipping some CPU even with verify_n_cpus=8, due to the |
| duplicity on random cpumask generation. Skipping the randomization when the |
| number of online CPUs is smaller than verify_n_cpus, solves that. |
| |
| Suggested-by: Thadeu Lima de Souza Cascardo <cascardo@igalia.com> |
| Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Reviewed-by: Paul E. McKenney <paulmck@kernel.org> |
| Link: https://lore.kernel.org/all/20250323173857.372390-1-gpiccoli@igalia.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/time/clocksource.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c |
| index b22508c5d2d96..bd49fec0f624b 100644 |
| --- a/kernel/time/clocksource.c |
| +++ b/kernel/time/clocksource.c |
| @@ -273,7 +273,7 @@ static void clocksource_verify_choose_cpus(void) |
| { |
| int cpu, i, n = verify_n_cpus; |
| |
| - if (n < 0) { |
| + if (n < 0 || n >= num_online_cpus()) { |
| /* Check all of the CPUs. */ |
| cpumask_copy(&cpus_chosen, cpu_online_mask); |
| cpumask_clear_cpu(smp_processor_id(), &cpus_chosen); |
| -- |
| 2.39.5 |
| |