diff mbox series

[12/16] time: optimize tick_check_percpu()

Message ID 20220718192844.1805158-13-yury.norov@gmail.com (mailing list archive)
State Not Applicable
Delegated to: Netdev Maintainers
Headers show
Series Introduce DEBUG_BITMAP config option and bitmap_check_params() | expand

Checks

Context Check Description
netdev/tree_selection success Not a local patch

Commit Message

Yury Norov July 18, 2022, 7:28 p.m. UTC
tick_check_percpu() calls cpumask_equal() even if
curdev->cpumask == cpumask_of(cpu). Fix it.

Caught with CONFIG_DEBUG_BITMAP:
[    0.077622] Call trace:
[    0.077637]  __bitmap_check_params+0x144/0x250
[    0.077675]  tick_check_replacement+0xac/0x320
[    0.077716]  tick_check_new_device+0x50/0x110
[    0.077747]  clockevents_register_device+0x74/0x1c0
[    0.077779]  dummy_timer_starting_cpu+0x6c/0x80
[    0.077817]  cpuhp_invoke_callback+0x104/0x20c
[    0.077856]  cpuhp_invoke_callback_range+0x70/0xf0
[    0.077890]  notify_cpu_starting+0xac/0xcc
[    0.077921]  secondary_start_kernel+0xe4/0x154
[    0.077951]  __secondary_switched+0xa0/0xa4
[    0.077992] ---[ end trace 0000000000000000 ]---
[    0.078021] b1:	ffffbfec4703b890
[    0.078031] b2:	ffffbfec4703b890
[    0.078043] b3:	0
[    0.078052] nbits:	256
[    0.078065] start:	0
[    0.078075] off:	0
[    0.078086] Bitmap: parameters check failed
[    0.078095] include/linux/bitmap.h [419]: bitmap_equal

Signed-off-by: Yury Norov <yury.norov@gmail.com>
---
 kernel/time/tick-common.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
index fdd5ae1a074b..7205f76f8d10 100644
--- a/kernel/time/tick-common.c
+++ b/kernel/time/tick-common.c
@@ -290,13 +290,15 @@  static bool tick_check_percpu(struct clock_event_device *curdev,
 {
 	if (!cpumask_test_cpu(cpu, newdev->cpumask))
 		return false;
-	if (cpumask_equal(newdev->cpumask, cpumask_of(cpu)))
+	if (newdev->cpumask == cpumask_of(cpu) ||
+			cpumask_equal(newdev->cpumask, cpumask_of(cpu)))
 		return true;
 	/* Check if irq affinity can be set */
 	if (newdev->irq >= 0 && !irq_can_set_affinity(newdev->irq))
 		return false;
 	/* Prefer an existing cpu local device */
-	if (curdev && cpumask_equal(curdev->cpumask, cpumask_of(cpu)))
+	if (curdev && (curdev->cpumask == cpumask_of(cpu) ||
+			cpumask_equal(curdev->cpumask, cpumask_of(cpu))))
 		return false;
 	return true;
 }