diff options
-rw-r--r-- | kernel/jump_label.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/kernel/jump_label.c b/kernel/jump_label.c index 833eecae825e..f2ea678c269f 100644 --- a/kernel/jump_label.c +++ b/kernel/jump_label.c @@ -108,7 +108,11 @@ void static_key_slow_inc(struct static_key *key) if (atomic_read(&key->enabled) == 0) { atomic_set(&key->enabled, -1); jump_label_update(key); - atomic_set(&key->enabled, 1); + /* + * Ensure that if the above cmpxchg loop observes our positive + * value, it must also observe all the text changes. + */ + atomic_set_release(&key->enabled, 1); } else { atomic_inc(&key->enabled); } @@ -130,7 +134,10 @@ void static_key_enable(struct static_key *key) if (atomic_read(&key->enabled) == 0) { atomic_set(&key->enabled, -1); jump_label_update(key); - atomic_set(&key->enabled, 1); + /* + * See static_key_slow_inc(). + */ + atomic_set_release(&key->enabled, 1); } jump_label_unlock(); cpus_read_unlock(); |