diff options
Diffstat (limited to 'kernel/include/linux/jump_label.h')
-rw-r--r-- | kernel/include/linux/jump_label.h | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/kernel/include/linux/jump_label.h b/kernel/include/linux/jump_label.h index 0536524bb..68904469f 100644 --- a/kernel/include/linux/jump_label.h +++ b/kernel/include/linux/jump_label.h @@ -117,13 +117,18 @@ struct module; #include <linux/atomic.h> +#ifdef HAVE_JUMP_LABEL + static inline int static_key_count(struct static_key *key) { - return atomic_read(&key->enabled); + /* + * -1 means the first static_key_slow_inc() is in progress. + * static_key_enabled() must return true, so return 1 here. + */ + int n = atomic_read(&key->enabled); + return n >= 0 ? n : 1; } -#ifdef HAVE_JUMP_LABEL - #define JUMP_TYPE_FALSE 0UL #define JUMP_TYPE_TRUE 1UL #define JUMP_TYPE_MASK 1UL @@ -162,6 +167,11 @@ extern void jump_label_apply_nops(struct module *mod); #else /* !HAVE_JUMP_LABEL */ +static inline int static_key_count(struct static_key *key) +{ + return atomic_read(&key->enabled); +} + static __always_inline void jump_label_init(void) { static_key_initialized = true; |