Commit-ID: fc932a0477d0f16934847eacba1c8b7ccf71e650 Gitweb: http://git.kernel.org/tip/fc932a0477d0f16934847eacba1c8b7ccf71e650 Author: Thomas Gleixner <tglx@xxxxxxxxxxxxx> AuthorDate: Sun, 23 Apr 2017 11:12:31 +0200 Committer: Thomas Gleixner <tglx@xxxxxxxxxxxxx> CommitDate: Sun, 23 Apr 2017 13:24:33 +0200 jump_label: Provide static_key_[disable|/slow_dec]_cpuslocked() Provide static_key_[disable|slow_dec]_cpuslocked() variant that don't take cpu_hotplug_lock(). Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> Cc: Sebastian Siewior <bigeasy@xxxxxxxxxxxxx> Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> Cc: jbaron@xxxxxxxxxx --- include/linux/jump_label.h | 12 ++++++++++-- kernel/jump_label.c | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h index 7d07f0b..6e3ebf2 100644 --- a/include/linux/jump_label.h +++ b/include/linux/jump_label.h @@ -160,10 +160,12 @@ extern int jump_label_text_reserved(void *start, void *end); extern void static_key_slow_inc(struct static_key *key); extern void static_key_slow_inc_cpuslocked(struct static_key *key); extern void static_key_slow_dec(struct static_key *key); +extern void static_key_slow_dec_cpuslocked(struct static_key *key); extern void jump_label_apply_nops(struct module *mod); extern int static_key_count(struct static_key *key); extern void static_key_enable(struct static_key *key); extern void static_key_disable(struct static_key *key); +extern void static_key_disable_cpuslocked(struct static_key *key); /* * We should be using ATOMIC_INIT() for initializing .enabled, but @@ -255,6 +257,11 @@ static inline void static_key_disable(struct static_key *key) static_key_slow_dec(key); } +static inline void static_key_disable_cpuslocked(struct static_key *key) +{ + static_key_disable_cpuslocked(key); +} + #define STATIC_KEY_INIT_TRUE { .enabled = ATOMIC_INIT(1) } #define STATIC_KEY_INIT_FALSE { .enabled = ATOMIC_INIT(0) } @@ -416,8 +423,9 @@ extern bool ____wrong_branch_error(void); * Normal usage; boolean enable/disable. */ -#define static_branch_enable(x) static_key_enable(&(x)->key) -#define static_branch_disable(x) static_key_disable(&(x)->key) +#define static_branch_enable(x) static_key_enable(&(x)->key) +#define static_branch_disable(x) static_key_disable(&(x)->key) +#define static_branch_disable_cpuslocked(x) static_key_disable_cpuslocked(&(x)->key) #endif /* __ASSEMBLY__ */ diff --git a/kernel/jump_label.c b/kernel/jump_label.c index 9455d2b..d71124e 100644 --- a/kernel/jump_label.c +++ b/kernel/jump_label.c @@ -101,6 +101,16 @@ void static_key_disable(struct static_key *key) } EXPORT_SYMBOL_GPL(static_key_disable); +void static_key_disable_cpuslocked(struct static_key *key) +{ + int count = static_key_count(key); + + WARN_ON_ONCE(count < 0 || count > 1); + + if (count) + static_key_slow_dec_cpuslocked(key); +} + void __static_key_slow_inc(struct static_key *key) { int v, v1; @@ -159,7 +169,6 @@ EXPORT_SYMBOL_GPL(static_key_slow_inc_cpuslocked); static void __static_key_slow_dec(struct static_key *key, unsigned long rate_limit, struct delayed_work *work) { - lockdep_assert_hotplug_held(); /* * The negative count check is valid even when a negative * key->enabled is in use by static_key_slow_inc(); a @@ -173,6 +182,7 @@ static void __static_key_slow_dec(struct static_key *key, return; } + lockdep_assert_hotplug_held(); if (rate_limit) { atomic_inc(&key->enabled); schedule_delayed_work(work, rate_limit); @@ -200,6 +210,12 @@ void static_key_slow_dec(struct static_key *key) } EXPORT_SYMBOL_GPL(static_key_slow_dec); +void static_key_slow_dec_cpuslocked(struct static_key *key) +{ + STATIC_KEY_CHECK_USE(); + __static_key_slow_dec(key, 0, NULL); +} + void static_key_slow_dec_deferred(struct static_key_deferred *key) { STATIC_KEY_CHECK_USE(); -- To unsubscribe from this list: send the line "unsubscribe linux-tip-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |