diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-06-25 16:14:44 +0300 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-06-25 16:14:44 +0300 |
commit | e3b22bc3d705b4a265247a9e2a1dea9ecf01a0cd (patch) | |
tree | 834f54242f3296b5874110bbe20bde4b04f6e0fc /include | |
parent | 2de23071f5f7eb80a6cccf45438b271da81246af (diff) | |
parent | 4c5ea0a9cd02d6aa8adc86e100b2a4cff8d614ff (diff) | |
download | linux-e3b22bc3d705b4a265247a9e2a1dea9ecf01a0cd.tar.xz |
Merge branch 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull locking fix from Thomas Gleixner:
"A single fix to address a race in the static key logic"
* 'locking-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
locking/static_key: Fix concurrent static_key_slow_inc()
Diffstat (limited to 'include')
-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; |