mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Fenghua Yu <fenghua.yu@intel.com>
To: "Thomas Gleixner" <tglx@linutronix.de>,
	"Ingo Molnar" <mingo@redhat.com>, "H Peter Anvin" <hpa@zytor.com>,
	"Dave Hansen" <dave.hansen@intel.com>,
	"Ashok Raj" <ashok.raj@intel.com>,
	"Peter Zijlstra" <peterz@infradead.org>,
	"Michael Chan" <michael.chan@broadcom.com>,
	"Ravi V Shankar" <ravi.v.shankar@intel.com>,
	"Ricardo Neri" <ricardo.neri@intel.com>
Cc: "linux-kernel" <linux-kernel@vger.kernel.org>,
	"x86" <x86@kernel.org>, Fenghua Yu <fenghua.yu@intel.com>
Subject: [PATCH v3 08/10] x86/setcpuid: Add kernel option setcpuid
Date: Fri,  1 Feb 2019 21:14:49 -0800	[thread overview]
Message-ID: <1549084491-57808-9-git-send-email-fenghua.yu@intel.com> (raw)
In-Reply-To: <1549084491-57808-1-git-send-email-fenghua.yu@intel.com>

On some platforms, a feature (e.g. #AC for split lock) may not be
enumerated by CPUID or non architectural way in IA32_CORE_CAPABILITY.
To enable the feature on the platforms, a new kernel option setcpuid
is added.

The feature is defined in cpufeatures.h. The kernel option setcpuid
takes either feature bit or cpu cap flag corresponding to the feature.
The format of the option:
setcpuid=<feature bit>
setcpuid=<feature capability flag>

Check cpufeatures.h for valid feature bit numbers and check capflags.c
or /proc/cpuinfo for valid feature capability flags.

Enabling multiple features are supported.

Please note kernel may malfunction if some features are enabled by
the option.

This option behaves like existing kernel option clearcpuid.

Signed-off-by: Fenghua Yu <fenghua.yu@intel.com>
---
 Documentation/admin-guide/kernel-parameters.txt | 15 +++++++++
 arch/x86/include/asm/cpufeature.h               |  1 +
 arch/x86/kernel/cpu/cpuid-deps.c                | 42 +++++++++++++++++++------
 arch/x86/kernel/fpu/init.c                      |  4 +++
 4 files changed, 52 insertions(+), 10 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 13bf223c7739..5de364078c69 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -4083,6 +4083,21 @@
 			incurs a small amount of overhead in the scheduler
 			but is useful for debugging and performance tuning.
 
+	setcpuid=BITNUM | FLAG [X86]
+			Enable CPUID feature X for the kernel. See
+			arch/x86/include/asm/cpufeatures.h for the valid bit
+			numbers or /proc/cpuinfo for the valid CPU flags.
+			Multiple options can be used to enable a few features.
+			Note the Linux specific bits are not necessarily
+			stable over kernel options, but the vendor specific
+			ones should be.
+			Also note that user programs calling CPUID directly
+			or using the feature without checking anything
+			may still disable it.
+			Also note the kernel might malfunction if you enable
+			some critical bits.
+			Please refer to clearcpuid for disabling CPUID feature.
+
 	skew_tick=	[KNL] Offset the periodic timer tick per cpu to mitigate
 			xtime_lock contention on larger systems, and/or RCU lock
 			contention on all systems with CONFIG_MAXSMP set.
diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
index 6792088525e3..6b580687f261 100644
--- a/arch/x86/include/asm/cpufeature.h
+++ b/arch/x86/include/asm/cpufeature.h
@@ -131,6 +131,7 @@ extern const char * const x86_bug_flags[NBUGINTS*32];
 #define set_cpu_cap(c, bit)	set_bit(bit, (unsigned long *)((c)->x86_capability))
 
 extern void setup_clear_cpu_cap(unsigned int bit);
+void setup_set_cpu_cap(unsigned int bit);
 extern void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int bit);
 bool find_cpu_cap(char *cap_flag, unsigned int *pfeature);
 
diff --git a/arch/x86/kernel/cpu/cpuid-deps.c b/arch/x86/kernel/cpu/cpuid-deps.c
index 19bfab0858ac..ae534b5d0b4d 100644
--- a/arch/x86/kernel/cpu/cpuid-deps.c
+++ b/arch/x86/kernel/cpu/cpuid-deps.c
@@ -62,25 +62,39 @@ static const struct cpuid_dep cpuid_deps[] = {
 	{}
 };
 
-static inline void clear_feature(struct cpuinfo_x86 *c, unsigned int feature)
+static inline void
+setup_feature(struct cpuinfo_x86 *c, unsigned int feature, bool enable)
 {
 	/*
 	 * Note: This could use the non atomic __*_bit() variants, but the
 	 * rest of the cpufeature code uses atomics as well, so keep it for
 	 * consistency. Cleanup all of it separately.
 	 */
-	if (!c) {
-		clear_cpu_cap(&boot_cpu_data, feature);
-		set_bit(feature, (unsigned long *)cpu_caps_cleared);
+	if (enable) {
+		/* Set the feature */
+		if (!c) {
+			set_cpu_cap(&boot_cpu_data, feature);
+			clear_bit(feature, (unsigned long *)cpu_caps_cleared);
+			setup_force_cpu_cap(feature);
+		} else {
+			set_bit(feature, (unsigned long *)c->x86_capability);
+		}
 	} else {
-		clear_bit(feature, (unsigned long *)c->x86_capability);
+		/* Clear the feature */
+		if (!c) {
+			clear_cpu_cap(&boot_cpu_data, feature);
+			set_bit(feature, (unsigned long *)cpu_caps_cleared);
+		} else {
+			clear_bit(feature, (unsigned long *)c->x86_capability);
+		}
 	}
 }
 
 /* Take the capabilities and the BUG bits into account */
 #define MAX_FEATURE_BITS ((NCAPINTS + NBUGINTS) * sizeof(u32) * 8)
 
-static void do_clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int feature)
+static void
+do_setup_cpu_cap(struct cpuinfo_x86 *c, unsigned int feature, bool enable)
 {
 	DECLARE_BITMAP(disable, MAX_FEATURE_BITS);
 	const struct cpuid_dep *d;
@@ -89,7 +103,7 @@ static void do_clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int feature)
 	if (WARN_ON(feature >= MAX_FEATURE_BITS))
 		return;
 
-	clear_feature(c, feature);
+	setup_feature(c, feature, enable);
 
 	/* Collect all features to disable, handling dependencies */
 	memset(disable, 0, sizeof(disable));
@@ -105,19 +119,27 @@ static void do_clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int feature)
 				continue;
 
 			changed = true;
-			clear_feature(c, d->feature);
+			setup_feature(c, d->feature, enable);
 		}
 	} while (changed);
 }
 
 void clear_cpu_cap(struct cpuinfo_x86 *c, unsigned int feature)
 {
-	do_clear_cpu_cap(c, feature);
+	/* Disable the feature. */
+	do_setup_cpu_cap(c, feature, false);
 }
 
 void setup_clear_cpu_cap(unsigned int feature)
 {
-	do_clear_cpu_cap(NULL, feature);
+	/* Disable the feature. */
+	do_setup_cpu_cap(NULL, feature, false);
+}
+
+void setup_set_cpu_cap(unsigned int feature)
+{
+	/* Enable the feature. */
+	do_setup_cpu_cap(NULL, feature, true);
 }
 
 /**
diff --git a/arch/x86/kernel/fpu/init.c b/arch/x86/kernel/fpu/init.c
index a9a67645a607..cb1e2f8129a5 100644
--- a/arch/x86/kernel/fpu/init.c
+++ b/arch/x86/kernel/fpu/init.c
@@ -251,6 +251,9 @@ static void __init setup_cpuid_option(char *setup_cpuid_option)
 
 	if (!strcmp(setup_cpuid_option, "clearcpuid"))
 		setup_cpu_cap = setup_clear_cpu_cap;
+	else if (!strcmp(setup_cpuid_option, "setcpuid"))
+		setup_cpu_cap = setup_set_cpu_cap;
+	else
 		return;
 
 	/* Find each option in boot_command_line and clear specified cpu cap. */
@@ -293,6 +296,7 @@ static void __init fpu__init_parse_early_param(void)
 		setup_clear_cpu_cap(X86_FEATURE_XSAVES);
 
 	setup_cpuid_option("clearcpuid");
+	setup_cpuid_option("setcpuid");
 }
 
 /*
-- 
2.7.4


  parent reply	other threads:[~2019-02-02  5:21 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-02  5:14 [PATCH v3 00/10] x86/split_lock: Enable #AC exception for split locked accesses Fenghua Yu
2019-02-02  5:14 ` [PATCH v3 01/10] x86/common: Align cpu_caps_cleared and cpu_caps_set to unsigned long Fenghua Yu
2019-02-02  5:14 ` [PATCH v3 02/10] drivers/net/b44: Align pwol_mask to unsigned long for better performance Fenghua Yu
2019-02-02  5:14 ` [PATCH v3 03/10] wlcore: Align reg_ch_conf_pending and tmp_ch_bitmap " Fenghua Yu
2019-02-02  5:14 ` [PATCH v3 04/10] x86/split_lock: Align x86_capability to unsigned long to avoid split locked access Fenghua Yu
2019-02-02  5:14 ` [PATCH v3 05/10] x86/clearcpuid: Support multiple clearcpuid options Fenghua Yu
2019-02-02  5:14 ` [PATCH v3 06/10] x86/clearcpuid: Support feature flag string in kernel option clearcpuid Fenghua Yu
2019-02-02  5:14 ` [PATCH v3 07/10] Change document for " Fenghua Yu
2019-02-02  5:14 ` Fenghua Yu [this message]
2019-02-04 17:49   ` [PATCH v3 08/10] x86/setcpuid: Add kernel option setcpuid Thomas Gleixner
2019-02-04 19:05     ` Dave Hansen
2019-02-04 19:57       ` Borislav Petkov
2019-02-04 20:46         ` Dave Hansen
2019-02-04 21:40           ` Borislav Petkov
2019-02-04 22:14             ` Fenghua Yu
2019-02-05  6:10               ` Borislav Petkov
2019-02-04 23:24             ` Dave Hansen
2019-02-05  6:18               ` Borislav Petkov
2019-02-05 16:46                 ` Dave Hansen
2019-02-05 17:09                   ` Peter Zijlstra
2019-02-05  8:57               ` Peter Zijlstra
2019-02-05 13:15                 ` Peter Zijlstra
2019-02-05  8:48           ` Peter Zijlstra
2019-02-05 15:19             ` Dave Hansen
2019-02-05 15:43               ` Borislav Petkov
2019-02-05 18:26                 ` Fenghua Yu
2019-02-05 17:04               ` Peter Zijlstra
2019-02-10 19:20                 ` Thomas Gleixner
2019-02-11 19:16                   ` Fenghua Yu
2019-02-12 13:37                     ` Peter Zijlstra
2019-02-12 13:51                       ` Thomas Gleixner
2019-02-12 16:48                         ` Peter Zijlstra
2019-02-12 16:50                           ` Dave Hansen
2019-02-12 17:52                           ` Yu, Fenghua
2019-02-04 21:09       ` Fenghua Yu
2019-02-05  8:51         ` Peter Zijlstra
2019-02-05 15:21           ` Dave Hansen
2019-02-05 15:34             ` Peter Zijlstra
2019-02-02  5:14 ` [PATCH v3 09/10] x86/split_lock: Define #AC for split lock feature Fenghua Yu
2019-02-04 18:41   ` Dave Hansen
2019-02-04 18:45     ` Fenghua Yu
2019-02-04 19:00       ` Dave Hansen
2019-02-04 19:03         ` Fenghua Yu
2019-02-02  5:14 ` [PATCH v3 10/10] x86/split_lock: Handle #AC exception for split lock Fenghua Yu
2019-02-04 11:00   ` kbuild test robot
2019-02-04 14:43   ` kbuild test robot
2019-02-11 10:53   ` Ingo Molnar
2019-02-11 18:10     ` Fenghua Yu
2019-02-13  8:14       ` Ingo Molnar
2019-02-13 14:37         ` Yu, Fenghua

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1549084491-57808-9-git-send-email-fenghua.yu@intel.com \
    --to=fenghua.yu@intel.com \
    --cc=ashok.raj@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michael.chan@broadcom.com \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=ravi.v.shankar@intel.com \
    --cc=ricardo.neri@intel.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome