Commit 7464c076 authored by Jiaxun Yang's avatar Jiaxun Yang Committed by Thomas Bogendoerfer

MIPS: csrc-r4k: Don't register as sched_clock if unfit

When we have more than one CPU in system, counter synchronisation
overhead can lead to a scenario that sched_clock goes backward when
being read from different CPUs.

This is accommodated by CONFIG_HAVE_UNSTABLE_SCHED_CLOCK, but it's
unavailable on 32bit kernel.

We don't want to risk sched_clock correctness, so if we have multiple
CPU in system and CONFIG_HAVE_UNSTABLE_SCHED_CLOCK is not set, we just
don't use counter as sched_clock source.
Signed-off-by: default avatarJiaxun Yang <jiaxun.yang@flygoat.com>
Signed-off-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
parent 426fa8e4
......@@ -68,6 +68,18 @@ static bool rdhwr_count_usable(void)
return false;
}
static inline __init bool count_can_be_sched_clock(void)
{
if (IS_ENABLED(CONFIG_CPU_FREQ))
return false;
if (num_possible_cpus() > 1 &&
!IS_ENABLED(CONFIG_HAVE_UNSTABLE_SCHED_CLOCK))
return false;
return true;
}
#ifdef CONFIG_CPU_FREQ
static bool __read_mostly r4k_clock_unstable;
......@@ -125,9 +137,8 @@ int __init init_r4k_clocksource(void)
clocksource_register_hz(&clocksource_mips, mips_hpt_frequency);
#ifndef CONFIG_CPU_FREQ
sched_clock_register(r4k_read_sched_clock, 32, mips_hpt_frequency);
#endif
if (count_can_be_sched_clock())
sched_clock_register(r4k_read_sched_clock, 32, mips_hpt_frequency);
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment