Commit 04e43ec9 authored by Borislav Petkov's avatar Borislav Petkov Committed by Borislav Petkov (AMD)
Browse files

x86/split_lock: Restructure the unwieldy switch-case in sld_state_show()



Split the handling in two parts:

1. handle the sld_state option first

2. handle X86_FEATURE flag-based printing afterwards

This splits the function nicely into two, separate logical things which
are easier to parse and understand.

Also, zap the printing in the disabled case.

Signed-off-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: default avatarXiaoyao Li <xiaoyao.li@intel.com>
Link: https://patch.msgid.link/20260226145033.GAaaBduQ0rWXydOkAm@fat_crate.local
parent ceea7868
Loading
Loading
Loading
Loading
+25 −24
Original line number Diff line number Diff line
@@ -391,34 +391,35 @@ static void __init split_lock_setup(struct cpuinfo_x86 *c)

static void sld_state_show(void)
{
	if (!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT) &&
	    !boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT))
	const char *action = "warning";

	if ((!boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT) &&
	     !boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT)) ||
	    (sld_state == sld_off))
		return;

	switch (sld_state) {
	case sld_off:
		pr_info("disabled\n");
		break;
	case sld_warn:
	if (sld_state == sld_ratelimit) {
		if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
			pr_info("#DB: setting system wide bus lock rate limit to %u/sec\n", bld_ratelimit.burst);
		return;
	} else if (sld_state == sld_fatal) {
		action = "sending SIGBUS";
	}

	if (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT)) {
			pr_info("#AC: crashing the kernel on kernel split_locks and warning on user-space split_locks\n");
			if (cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
					      "x86/splitlock", NULL, splitlock_cpu_offline) < 0)
		pr_info("#AC: crashing the kernel on kernel split_locks and %s on user-space split_locks\n", action);

		/*
		 * This is handling the case where a CPU goes offline at the
		 * moment where split lock detection is disabled in the warn
		 * setting, see split_lock_warn(). It doesn't have any effect
		 * in the fatal case.
		 */
		if (cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/splitlock", NULL, splitlock_cpu_offline) < 0)
			pr_warn("No splitlock CPU offline handler\n");

	} else if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT)) {
			pr_info("#DB: warning on user-space bus_locks\n");
		}
		break;
	case sld_fatal:
		if (boot_cpu_has(X86_FEATURE_SPLIT_LOCK_DETECT))
			pr_info("#AC: crashing the kernel on kernel split_locks and sending SIGBUS on user-space split_locks\n");
		else if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
			pr_info("#DB: sending SIGBUS on user-space bus_locks\n");
		break;
	case sld_ratelimit:
		if (boot_cpu_has(X86_FEATURE_BUS_LOCK_DETECT))
			pr_info("#DB: setting system wide bus lock rate limit to %u/sec\n", bld_ratelimit.burst);
		break;
		pr_info("#DB: %s on user-space bus_locks\n", action);
	}
}