mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
jump_label: Use atomic_try_cmpxchg() in static_key_slow_inc_cpuslocked()
[ Upstream commit d0c006402e ]
Use atomic_try_cmpxchg() instead of atomic_cmpxchg (*ptr, old, new) ==
old in static_key_slow_inc_cpuslocked(). x86 CMPXCHG instruction
returns success in ZF flag, so this change saves a compare after
cmpxchg (and related move instruction in front of cmpxchg).
Also, atomic_try_cmpxchg() implicitly assigns old *ptr value to "old" when
cmpxchg fails, enabling further code simplifications.
No functional change intended.
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20221019140850.3395-1-ubizjak@gmail.com
Stable-dep-of: 83ab38ef0a0b ("jump_label: Fix concurrency issues in static_key_slow_dec()")
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
5fd6580714
commit
ebcb324a70
@@ -115,8 +115,6 @@ EXPORT_SYMBOL_GPL(static_key_count);
|
|||||||
|
|
||||||
void static_key_slow_inc_cpuslocked(struct static_key *key)
|
void static_key_slow_inc_cpuslocked(struct static_key *key)
|
||||||
{
|
{
|
||||||
int v, v1;
|
|
||||||
|
|
||||||
STATIC_KEY_CHECK_USE(key);
|
STATIC_KEY_CHECK_USE(key);
|
||||||
lockdep_assert_cpus_held();
|
lockdep_assert_cpus_held();
|
||||||
|
|
||||||
@@ -132,11 +130,9 @@ void static_key_slow_inc_cpuslocked(struct static_key *key)
|
|||||||
* so it counts as "enabled" in jump_label_update(). Note that
|
* so it counts as "enabled" in jump_label_update(). Note that
|
||||||
* atomic_inc_unless_negative() checks >= 0, so roll our own.
|
* atomic_inc_unless_negative() checks >= 0, so roll our own.
|
||||||
*/
|
*/
|
||||||
for (v = atomic_read(&key->enabled); v > 0; v = v1) {
|
for (int v = atomic_read(&key->enabled); v > 0; )
|
||||||
v1 = atomic_cmpxchg(&key->enabled, v, v + 1);
|
if (likely(atomic_try_cmpxchg(&key->enabled, &v, v + 1)))
|
||||||
if (likely(v1 == v))
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
jump_label_lock();
|
jump_label_lock();
|
||||||
if (atomic_read(&key->enabled) == 0) {
|
if (atomic_read(&key->enabled) == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user