diff options
Diffstat (limited to 'include/linux/jump_label.h')
| -rw-r--r-- | include/linux/jump_label.h | 16 | 
1 files changed, 13 insertions, 3 deletions
| diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index 0536524bb9eb..68904469fba1 100644 --- a/include/linux/jump_label.h +++ b/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; |