summaryrefslogtreecommitdiff
path: root/patches/arm64-cpufeature-don-t-use-mutex-in-bringup-path.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/arm64-cpufeature-don-t-use-mutex-in-bringup-path.patch')
-rw-r--r--patches/arm64-cpufeature-don-t-use-mutex-in-bringup-path.patch169
1 files changed, 0 insertions, 169 deletions
diff --git a/patches/arm64-cpufeature-don-t-use-mutex-in-bringup-path.patch b/patches/arm64-cpufeature-don-t-use-mutex-in-bringup-path.patch
deleted file mode 100644
index ce4f85545922..000000000000
--- a/patches/arm64-cpufeature-don-t-use-mutex-in-bringup-path.patch
+++ /dev/null
@@ -1,169 +0,0 @@
-From: Mark Rutland <mark.rutland@arm.com>
-Date: Tue, 16 May 2017 15:18:05 +0100
-Subject: [PATCH] arm64/cpufeature: don't use mutex in bringup path
-
-Commit b2bb439ad99a1497daa392a527c0e52c69915ce9 upstream
-
-Currently, cpus_set_cap() calls static_branch_enable_cpuslocked(), which
-must take the jump_label mutex.
-
-We call cpus_set_cap() in the secondary bringup path, from the idle
-thread where interrupts are disabled. Taking a mutex in this path "is a
-NONO" regardless of whether it's contended, and something we must avoid.
-We didn't spot this until recently, as ___might_sleep() won't warn for
-this case until all CPUs have been brought up.
-
-This patch avoids taking the mutex in the secondary bringup path. The
-poking of static keys is deferred until enable_cpu_capabilities(), which
-runs in a suitable context on the boot CPU. To account for the static
-keys being set later, cpus_have_const_cap() is updated to use another
-static key to check whether the const cap keys have been initialised,
-falling back to the caps bitmap until this is the case.
-
-This means that users of cpus_have_const_cap() gain should only gain a
-single additional NOP in the fast path once the const caps are
-initialised, but should always see the current cap value.
-
-The hyp code should never dereference the caps array, since the caps are
-initialized before we run the module initcall to initialise hyp. A check
-is added to the hyp init code to document this requirement.
-
-This change will sidestep a number of issues when the upcoming hotplug
-locking rework is merged.
-
-Signed-off-by: Mark Rutland <mark.rutland@arm.com>
-Reviewed-by: Marc Zyniger <marc.zyngier@arm.com>
-Reviewed-by: Suzuki Poulose <suzuki.poulose@arm.com>
-Acked-by: Will Deacon <will.deacon@arm.com>
-Cc: Christoffer Dall <christoffer.dall@linaro.org>
-Cc: Peter Zijlstra <peterz@infradead.org>
-Cc: Sebastian Sewior <bigeasy@linutronix.de>
-Cc: Thomas Gleixner <tglx@linutronix.de>
-Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
-Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
----
- arch/arm64/include/asm/cpufeature.h | 12 ++++++++++--
- arch/arm64/include/asm/kvm_host.h | 8 ++++++--
- arch/arm64/kernel/cpufeature.c | 23 +++++++++++++++++++++--
- 3 files changed, 37 insertions(+), 6 deletions(-)
-
---- a/arch/arm64/include/asm/cpufeature.h
-+++ b/arch/arm64/include/asm/cpufeature.h
-@@ -115,6 +115,7 @@ struct arm64_cpu_capabilities {
-
- extern DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS);
- extern struct static_key_false cpu_hwcap_keys[ARM64_NCAPS];
-+extern struct static_key_false arm64_const_caps_ready;
-
- bool this_cpu_has_cap(unsigned int cap);
-
-@@ -124,7 +125,7 @@ static inline bool cpu_have_feature(unsi
- }
-
- /* System capability check for constant caps */
--static inline bool cpus_have_const_cap(int num)
-+static inline bool __cpus_have_const_cap(int num)
- {
- if (num >= ARM64_NCAPS)
- return false;
-@@ -138,6 +139,14 @@ static inline bool cpus_have_cap(unsigne
- return test_bit(num, cpu_hwcaps);
- }
-
-+static inline bool cpus_have_const_cap(int num)
-+{
-+ if (static_branch_likely(&arm64_const_caps_ready))
-+ return __cpus_have_const_cap(num);
-+ else
-+ return cpus_have_cap(num);
-+}
-+
- static inline void cpus_set_cap(unsigned int num)
- {
- if (num >= ARM64_NCAPS) {
-@@ -145,7 +154,6 @@ static inline void cpus_set_cap(unsigned
- num, ARM64_NCAPS);
- } else {
- __set_bit(num, cpu_hwcaps);
-- static_branch_enable(&cpu_hwcap_keys[num]);
- }
- }
-
---- a/arch/arm64/include/asm/kvm_host.h
-+++ b/arch/arm64/include/asm/kvm_host.h
-@@ -24,6 +24,7 @@
-
- #include <linux/types.h>
- #include <linux/kvm_types.h>
-+#include <asm/cpufeature.h>
- #include <asm/kvm.h>
- #include <asm/kvm_asm.h>
- #include <asm/kvm_mmio.h>
-@@ -356,9 +357,12 @@ static inline void __cpu_init_hyp_mode(p
- unsigned long vector_ptr)
- {
- /*
-- * Call initialization code, and switch to the full blown
-- * HYP code.
-+ * Call initialization code, and switch to the full blown HYP code.
-+ * If the cpucaps haven't been finalized yet, something has gone very
-+ * wrong, and hyp will crash and burn when it uses any
-+ * cpus_have_const_cap() wrapper.
- */
-+ BUG_ON(!static_branch_likely(&arm64_const_caps_ready));
- __kvm_call_hyp((void *)pgd_ptr, hyp_stack_ptr, vector_ptr);
- }
-
---- a/arch/arm64/kernel/cpufeature.c
-+++ b/arch/arm64/kernel/cpufeature.c
-@@ -975,8 +975,16 @@ void update_cpu_capabilities(const struc
- */
- void __init enable_cpu_capabilities(const struct arm64_cpu_capabilities *caps)
- {
-- for (; caps->matches; caps++)
-- if (caps->enable && cpus_have_cap(caps->capability))
-+ for (; caps->matches; caps++) {
-+ unsigned int num = caps->capability;
-+
-+ if (!cpus_have_cap(num))
-+ continue;
-+
-+ /* Ensure cpus_have_const_cap(num) works */
-+ static_branch_enable(&cpu_hwcap_keys[num]);
-+
-+ if (caps->enable) {
- /*
- * Use stop_machine() as it schedules the work allowing
- * us to modify PSTATE, instead of on_each_cpu() which
-@@ -984,6 +992,8 @@ void __init enable_cpu_capabilities(cons
- * we return.
- */
- stop_machine(caps->enable, NULL, cpu_online_mask);
-+ }
-+ }
- }
-
- /*
-@@ -1086,6 +1096,14 @@ static void __init setup_feature_capabil
- enable_cpu_capabilities(arm64_features);
- }
-
-+DEFINE_STATIC_KEY_FALSE(arm64_const_caps_ready);
-+EXPORT_SYMBOL(arm64_const_caps_ready);
-+
-+static void __init mark_const_caps_ready(void)
-+{
-+ static_branch_enable(&arm64_const_caps_ready);
-+}
-+
- /*
- * Check if the current CPU has a given feature capability.
- * Should be called from non-preemptible context.
-@@ -1112,6 +1130,7 @@ void __init setup_cpu_features(void)
- /* Set the CPU feature capabilies */
- setup_feature_capabilities();
- enable_errata_workarounds();
-+ mark_const_caps_ready();
- setup_elf_hwcaps(arm64_elf_hwcaps);
-
- if (system_supports_32bit_el0())