]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
powerpc: Add static_key_feature_checks_initialized flag
authorNicholas Miehlbradt <nicholas@linux.ibm.com>
Mon, 8 Apr 2024 05:23:58 +0000 (05:23 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Mon, 15 Apr 2024 02:53:39 +0000 (12:53 +1000)
JUMP_LABEL_FEATURE_CHECK_DEBUG used static_key_intialized to determine
whether {cpu,mmu}_has_feature() is used before static keys were
initialized. However, {cpu,mmu}_has_feature() should not be used before
setup_feature_keys() is called but static_key_initialized is set well
before this by the call to jump_label_init() in early_init_devtree().
This creates a window in which JUMP_LABEL_FEATURE_CHECK_DEBUG will not
detect misuse and report errors. Add a flag specifically to indicate
when {cpu,mmu}_has_feature() is safe to use.

Signed-off-by: Nicholas Miehlbradt <nicholas@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://msgid.link/20240408052358.5030-1-nicholas@linux.ibm.com
arch/powerpc/include/asm/cpu_has_feature.h
arch/powerpc/include/asm/feature-fixups.h
arch/powerpc/include/asm/mmu.h
arch/powerpc/lib/feature-fixups.c

index 727d4b32193799ecdc3bbd7c6befb679f02e5d9f..0efabccd820cf2552dd84302b72403905f959be6 100644 (file)
@@ -29,7 +29,7 @@ static __always_inline bool cpu_has_feature(unsigned long feature)
 #endif
 
 #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG
-       if (!static_key_initialized) {
+       if (!static_key_feature_checks_initialized) {
                printk("Warning! cpu_has_feature() used prior to jump label init!\n");
                dump_stack();
                return early_cpu_has_feature(feature);
index 77824bd289a38402ac05574dc312f833cc82096e..17d168dd8b49123dbdf630af0c4cfe475349472e 100644 (file)
@@ -291,6 +291,8 @@ extern long __start___rfi_flush_fixup, __stop___rfi_flush_fixup;
 extern long __start___barrier_nospec_fixup, __stop___barrier_nospec_fixup;
 extern long __start__btb_flush_fixup, __stop__btb_flush_fixup;
 
+extern bool static_key_feature_checks_initialized;
+
 void apply_feature_fixups(void);
 void update_mmu_feature_fixups(unsigned long mask);
 void setup_feature_keys(void);
index 3b72c7ed24cfdeec454af137d99d01c7f718f044..24f830cf9bb45f08821aae5bf87eb8476f7a5009 100644 (file)
@@ -251,7 +251,7 @@ static __always_inline bool mmu_has_feature(unsigned long feature)
 #endif
 
 #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG
-       if (!static_key_initialized) {
+       if (!static_key_feature_checks_initialized) {
                printk("Warning! mmu_has_feature() used prior to jump label init!\n");
                dump_stack();
                return early_mmu_has_feature(feature);
index 4f82581ca203433f8f9f712dcb070de8c2cf13d7..b7201ba50b2ea5c0fe719e19d2e3f4084820ac59 100644 (file)
 #include <asm/firmware.h>
 #include <asm/inst.h>
 
+/*
+ * Used to generate warnings if mmu or cpu feature check functions that
+ * use static keys before they are initialized.
+ */
+bool static_key_feature_checks_initialized __read_mostly;
+EXPORT_SYMBOL_GPL(static_key_feature_checks_initialized);
+
 struct fixup_entry {
        unsigned long   mask;
        unsigned long   value;
@@ -679,6 +686,7 @@ void __init setup_feature_keys(void)
        jump_label_init();
        cpu_feature_keys_init();
        mmu_feature_keys_init();
+       static_key_feature_checks_initialized = true;
 }
 
 static int __init check_features(void)