linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Pavel Tatashin <pasha.tatashin@oracle.com>
To: steven.sistare@oracle.com, daniel.m.jordan@oracle.com,
	linux@armlinux.org.uk, schwidefsky@de.ibm.com,
	heiko.carstens@de.ibm.com, john.stultz@linaro.org,
	sboyd@codeaurora.org, x86@kernel.org,
	linux-kernel@vger.kernel.org, mingo@redhat.com,
	tglx@linutronix.de, hpa@zytor.com, douly.fnst@cn.fujitsu.com,
	peterz@infradead.org, prarit@redhat.com, feng.tang@intel.com,
	pmladek@suse.com, gnomes@lxorguk.ukuu.org.uk,
	linux-s390@vger.kernel.org, pasha.tatashin@oracle.com,
	boris.ostrovsky@oracle.com, jgross@suse.com, pbonzini@redhat.com
Subject: [PATCH v14 10/25] x86: initialize static branching early
Date: Tue, 17 Jul 2018 22:21:56 -0400	[thread overview]
Message-ID: <20180718022211.6259-11-pasha.tatashin@oracle.com> (raw)
In-Reply-To: <20180718022211.6259-1-pasha.tatashin@oracle.com>

static branching is useful to hot-patch branches that are used in hot
path, but are infrequently changed.

x86 clock framework is one example that uses static branches to setup
the best clock during boot and never change it again.

Since we plan to enable clock early, we need static branching
functionality early as well.

static branching requires patching nop instructions, thus, we need
arch_init_ideal_nops() to be called prior to jump_label_init()

Here we do all the necessary steps to call arch_init_ideal_nops
after early_cpu_init().

Signed-off-by: Pavel Tatashin <pasha.tatashin@oracle.com>
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Reviewed-by: Borislav Petkov <bp@suse.de>
---
 arch/x86/kernel/cpu/amd.c    | 13 +++++++-----
 arch/x86/kernel/cpu/common.c | 38 +++++++++++++++++++-----------------
 arch/x86/kernel/setup.c      |  4 ++--
 3 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 38915fbfae73..b732438c1a1e 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -232,8 +232,6 @@ static void init_amd_k7(struct cpuinfo_x86 *c)
 		}
 	}
 
-	set_cpu_cap(c, X86_FEATURE_K7);
-
 	/* calling is from identify_secondary_cpu() ? */
 	if (!c->cpu_index)
 		return;
@@ -617,6 +615,14 @@ static void early_init_amd(struct cpuinfo_x86 *c)
 
 	early_init_amd_mc(c);
 
+#ifdef CONFIG_X86_32
+	if (c->x86 == 6)
+		set_cpu_cap(c, X86_FEATURE_K7);
+#endif
+
+	if (c->x86 >= 0xf)
+		set_cpu_cap(c, X86_FEATURE_K8);
+
 	rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);
 
 	/*
@@ -863,9 +869,6 @@ static void init_amd(struct cpuinfo_x86 *c)
 
 	init_amd_cacheinfo(c);
 
-	if (c->x86 >= 0xf)
-		set_cpu_cap(c, X86_FEATURE_K8);
-
 	if (cpu_has(c, X86_FEATURE_XMM2)) {
 		unsigned long long val;
 		int ret;
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index eb4cb3efd20e..71281ac43b15 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -1015,6 +1015,24 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c)
 	setup_force_cpu_bug(X86_BUG_CPU_MELTDOWN);
 }
 
+/*
+ * The NOPL instruction is supposed to exist on all CPUs of family >= 6;
+ * unfortunately, that's not true in practice because of early VIA
+ * chips and (more importantly) broken virtualizers that are not easy
+ * to detect. In the latter case it doesn't even *fail* reliably, so
+ * probing for it doesn't even work. Disable it completely on 32-bit
+ * unless we can find a reliable way to detect all the broken cases.
+ * Enable it explicitly on 64-bit for non-constant inputs of cpu_has().
+ */
+static void detect_nopl(struct cpuinfo_x86 *c)
+{
+#ifdef CONFIG_X86_32
+	clear_cpu_cap(c, X86_FEATURE_NOPL);
+#else
+	set_cpu_cap(c, X86_FEATURE_NOPL);
+#endif
+}
+
 /*
  * Do minimum CPU detection early.
  * Fields really needed: vendor, cpuid_level, family, model, mask,
@@ -1089,6 +1107,8 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
 	 */
 	if (!pgtable_l5_enabled())
 		setup_clear_cpu_cap(X86_FEATURE_LA57);
+
+	detect_nopl(c);
 }
 
 void __init early_cpu_init(void)
@@ -1124,24 +1144,6 @@ void __init early_cpu_init(void)
 	early_identify_cpu(&boot_cpu_data);
 }
 
-/*
- * The NOPL instruction is supposed to exist on all CPUs of family >= 6;
- * unfortunately, that's not true in practice because of early VIA
- * chips and (more importantly) broken virtualizers that are not easy
- * to detect. In the latter case it doesn't even *fail* reliably, so
- * probing for it doesn't even work. Disable it completely on 32-bit
- * unless we can find a reliable way to detect all the broken cases.
- * Enable it explicitly on 64-bit for non-constant inputs of cpu_has().
- */
-static void detect_nopl(struct cpuinfo_x86 *c)
-{
-#ifdef CONFIG_X86_32
-	clear_cpu_cap(c, X86_FEATURE_NOPL);
-#else
-	set_cpu_cap(c, X86_FEATURE_NOPL);
-#endif
-}
-
 static void detect_null_seg_behavior(struct cpuinfo_x86 *c)
 {
 #ifdef CONFIG_X86_64
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index da1dbd99cb6e..7490de925a81 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -866,6 +866,8 @@ void __init setup_arch(char **cmdline_p)
 
 	idt_setup_early_traps();
 	early_cpu_init();
+	arch_init_ideal_nops();
+	jump_label_init();
 	early_ioremap_init();
 
 	setup_olpc_ofw_pgd();
@@ -1268,8 +1270,6 @@ void __init setup_arch(char **cmdline_p)
 
 	mcheck_init();
 
-	arch_init_ideal_nops();
-
 	register_refined_jiffies(CLOCK_TICK_RATE);
 
 #ifdef CONFIG_EFI
-- 
2.18.0


  parent reply	other threads:[~2018-07-18  2:26 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-18  2:21 [PATCH v14 00/25] Early boot time stamps Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 01/25] x86/kvmclock: Remove memblock dependency Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 02/25] x86/kvmclock: Remove page size requirement from wall_clock Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 03/25] x86/kvmclock: Decrapify kvm_register_clock() Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 04/25] x86/kvmclock: Cleanup the code Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 05/25] x86/kvmclock: Mark variables __initdata and __ro_after_init Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 06/25] x86/kvmclock: Move kvmclock vsyscall param and init to kvmclock Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 07/25] x86/kvmclock: Switch kvmclock data to a PER_CPU variable Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 08/25] x86/kvmclock: Avoid TSC recalibration Pavel Tatashin
2018-07-18 11:14   ` Paolo Bonzini
2018-07-18 13:33     ` Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 09/25] x86: text_poke() may access uninitialized struct pages Pavel Tatashin
2018-07-18  2:21 ` Pavel Tatashin [this message]
2018-07-18  2:21 ` [PATCH v14 11/25] x86/CPU: Call detect_nopl() only on the BSP Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 12/25] x86/tsc: redefine notsc to behave as tsc=unstable Pavel Tatashin
2018-07-18  2:21 ` [PATCH v14 13/25] x86/xen/time: initialize pv xen time in init_hypervisor_platform Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 14/25] x86/xen/time: output xen sched_clock time from 0 Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 15/25] s390/time: add read_persistent_wall_and_boot_offset() Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 16/25] time: replace read_boot_clock64() with read_persistent_wall_and_boot_offset() Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 17/25] time: default boot time offset to local_clock() Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 18/25] s390/time: remove read_boot_clock64() Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 19/25] ARM/time: " Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 20/25] x86/tsc: calibrate tsc only once Pavel Tatashin
2018-07-19  5:33   ` Dou Liyang
2018-07-19  6:25     ` Thomas Gleixner
2018-07-19  6:48       ` Dou Liyang
2018-07-19 10:33   ` Peter Zijlstra
2018-07-19 11:01     ` Thomas Gleixner
2018-07-19 15:58       ` Pavel Tatashin
2018-07-19 16:19         ` Thomas Gleixner
2018-07-19 16:49           ` Pavel Tatashin
2018-07-19 18:38             ` Pavel Tatashin
2018-07-19 20:44               ` Thomas Gleixner
2018-07-19 20:46                 ` Pavel Tatashin
2018-07-23  9:28                   ` Alan Cox
2018-07-18  2:22 ` [PATCH v14 21/25] x86/tsc: initialize cyc2ns when tsc freq. is determined Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 22/25] x86/tsc: use tsc early Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 23/25] sched: move sched clock initialization and merge with generic clock Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 24/25] sched: early boot clock Pavel Tatashin
2018-07-19 10:39   ` Peter Zijlstra
2018-07-19 14:16     ` Pavel Tatashin
2018-07-18  2:22 ` [PATCH v14 25/25] sched: use static key for sched_clock_running Pavel Tatashin
2018-07-19 10:48   ` Peter Zijlstra
2018-07-19 14:24     ` Pavel Tatashin

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=20180718022211.6259-11-pasha.tatashin@oracle.com \
    --to=pasha.tatashin@oracle.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=daniel.m.jordan@oracle.com \
    --cc=douly.fnst@cn.fujitsu.com \
    --cc=feng.tang@intel.com \
    --cc=gnomes@lxorguk.ukuu.org.uk \
    --cc=heiko.carstens@de.ibm.com \
    --cc=hpa@zytor.com \
    --cc=jgross@suse.com \
    --cc=john.stultz@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=mingo@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=pmladek@suse.com \
    --cc=prarit@redhat.com \
    --cc=sboyd@codeaurora.org \
    --cc=schwidefsky@de.ibm.com \
    --cc=steven.sistare@oracle.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;
as well as URLs for NNTP newsgroup(s).