On some ARM systems there are two sets of per-cpu timers: the TWD timers and the global timers. The TWD timers are rated at 350 and the global timers are rated at 300 but the TWD timers suffer from FEAT_C3_STOP while the arm global timers don't. The tick device selection logic doesn't consider the FEAT_C3_STOP flag so we'll always end up with the TWD as the tick device although we don't want that.
Extend the preference logic to take the FEAT_C3_STOP flag into account and always prefer tick devices that don't suffer from FEAT_C3_STOP even if their rating is lower than tick devices that do suffer from FEAT_C3_STOP. This will remove the need to do any broadcasting on such ARM systems. Signed-off-by: Stephen Boyd <sb...@codeaurora.org> --- kernel/time/tick-common.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 64522ec..3ae437d 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c @@ -244,12 +244,22 @@ static bool tick_check_preferred(struct clock_event_device *curdev, return false; } + if (!curdev) + return true; + + /* Always prefer a tick device that doesn't suffer from FEAT_C3STOP */ + if (!(newdev->features & CLOCK_EVT_FEAT_C3STOP) && + (curdev->features & CLOCK_EVT_FEAT_C3STOP)) + return true; + if ((newdev->features & CLOCK_EVT_FEAT_C3STOP) && + !(curdev->features & CLOCK_EVT_FEAT_C3STOP)) + return false; + /* * Use the higher rated one, but prefer a CPU local device with a lower * rating than a non-CPU local device */ - return !curdev || - newdev->rating > curdev->rating || + return newdev->rating > curdev->rating || !cpumask_equal(curdev->cpumask, newdev->cpumask); } -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/