]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
tick: Prefer a lower rating device only if it's CPU local device
authorSudeep Holla <sudeep.holla@arm.com>
Wed, 9 May 2018 16:02:08 +0000 (17:02 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Sun, 13 May 2018 13:07:41 +0000 (15:07 +0200)
Checking the equality of cpumask for both new and old tick device doesn't
ensure that it's CPU local device. This will cause issue if a low rating
clockevent tick device is registered first followed by the registration
of higher rating clockevent tick device.

In such case, clockevents_released list will never get emptied as both
the devices get selected as preferred one and we will loop forever in
clockevents_notify_released.

Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Link: https://lkml.kernel.org/r/1525881728-4858-1-git-send-email-sudeep.holla@arm.com
kernel/time/tick-common.c

index 49edc1c4f3e645894f839c40489ab81594a02398..78e598334007b627181a9e81b9ffaef5f19f86d1 100644 (file)
@@ -277,7 +277,8 @@ static bool tick_check_preferred(struct clock_event_device *curdev,
         */
        return !curdev ||
                newdev->rating > curdev->rating ||
-              !cpumask_equal(curdev->cpumask, newdev->cpumask);
+              (!cpumask_equal(curdev->cpumask, newdev->cpumask) &&
+               !tick_check_percpu(curdev, newdev, smp_processor_id()));
 }
 
 /*