powerpc: Add static_key_feature_checks_initialized flag
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
This commit is contained in:
parent
676abf7c39
commit
676b2f99b0
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -25,6 +25,13 @@
|
||||
#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)
|
||||
|
Loading…
Reference in New Issue
Block a user