Unverified Commit 425c0a7b authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!210 x86/tsc: use topology_max_packages() in tsc watchdog check

Merge Pull Request from: @juntianlinux 
 
[Description]​
Temporary fix for #I5U037

Occasionally TSC clocksource is wrongly judged as unstable watchdog like 'jiffies', HPET on some platforms like Skylake 4S. 

For normal cases, we can use nr_online_nodes <= 4 as a quick workaround for this issue. However, there are many cases that 'nr_online_nodes' could have issue. Intel is still working on a formal fix, the patch in this PR is a more general fix but still have open under discussion.

Generally, there are some corner cases, but we can use this for a temporary fix to this issue. In next step, we need to update this fix after upstream merging the final solution.

 
 
Link:https://gitee.com/openeuler/kernel/pulls/210

 
Reviewed-by: default avatarJiao Fenfang <jiaofenfang@uniontech.com>
Reviewed-by: default avatarChen Wei <chenwei@xfusion.com>
Reviewed-by: default avatarXibo.Wang <wangxb12@chinatelecom.cn>
Signed-off-by: default avatarXie XiuQi <xiexiuqi@huawei.com>
parents eda593e5 2558e3b3
Loading
Loading
Loading
Loading
+16 −26
Original line number Diff line number Diff line
@@ -1129,8 +1129,7 @@ static struct clocksource clocksource_tsc_early = {
	.rating			= 299,
	.read			= read_tsc,
	.mask			= CLOCKSOURCE_MASK(64),
	.flags			= CLOCK_SOURCE_IS_CONTINUOUS |
				  CLOCK_SOURCE_MUST_VERIFY,
	.flags			= CLOCK_SOURCE_IS_CONTINUOUS,
	.vdso_clock_mode	= VDSO_CLOCKMODE_TSC,
	.enable			= tsc_cs_enable,
	.resume			= tsc_resume,
@@ -1178,12 +1177,6 @@ void mark_tsc_unstable(char *reason)

EXPORT_SYMBOL_GPL(mark_tsc_unstable);

static void __init tsc_disable_clocksource_watchdog(void)
{
	clocksource_tsc_early.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
	clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
}

static void __init check_system_tsc_reliable(void)
{
#if defined(CONFIG_MGEODEGX1) || defined(CONFIG_MGEODE_LX) || defined(CONFIG_X86_GENERIC)
@@ -1200,23 +1193,6 @@ static void __init check_system_tsc_reliable(void)
#endif
	if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE))
		tsc_clocksource_reliable = 1;

	/*
	 * Disable the clocksource watchdog when the system has:
	 *  - TSC running at constant frequency
	 *  - TSC which does not stop in C-States
	 *  - the TSC_ADJUST register which allows to detect even minimal
	 *    modifications
	 *  - not more than two sockets. As the number of sockets cannot be
	 *    evaluated at the early boot stage where this has to be
	 *    invoked, check the number of online memory nodes as a
	 *    fallback solution which is an reasonable estimate.
	 */
	if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC) &&
	    boot_cpu_has(X86_FEATURE_NONSTOP_TSC) &&
	    boot_cpu_has(X86_FEATURE_TSC_ADJUST) &&
	    nr_online_nodes <= 2)
		tsc_disable_clocksource_watchdog();
}

/*
@@ -1411,6 +1387,20 @@ static int __init init_tsc_clocksource(void)
	if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC_S3))
		clocksource_tsc.flags |= CLOCK_SOURCE_SUSPEND_NONSTOP;

	/*
	 * Disable the clocksource watchdog when the system has:
	 *  - TSC running at constant frequency
	 *  - TSC which does not stop in C-States
	 *  - the TSC_ADJUST register which allows to detect even minimal
	 *    modifications
	 *  - not more than four sockets.
	 */
	if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC) &&
	    boot_cpu_has(X86_FEATURE_NONSTOP_TSC) &&
	    boot_cpu_has(X86_FEATURE_TSC_ADJUST) &&
	    topology_max_packages() <= 4)
		clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;

	/*
	 * When TSC frequency is known (retrieved via MSR or CPUID), we skip
	 * the refined calibration and directly register it as a clocksource.
@@ -1545,7 +1535,7 @@ void __init tsc_init(void)
	}

	if (tsc_clocksource_reliable || no_tsc_watchdog)
		tsc_disable_clocksource_watchdog();
		clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;

	clocksource_register_khz(&clocksource_tsc_early, tsc_khz);
	detect_art();