Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

locking/mutex: Use try_cmpxchg()

For simpler and better code.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Waiman Long <longman@redhat.com>
Reviewed-by: Yanfei Xu <yanfei.xu@windriver.com>
Link: https://lore.kernel.org/r/20210630154114.834438545@infradead.org

+6 -21
+6 -21
kernel/locking/mutex.c
··· 100 100 101 101 owner = atomic_long_read(&lock->owner); 102 102 for (;;) { /* must loop, can race against a flag */ 103 - unsigned long old, flags = __owner_flags(owner); 103 + unsigned long flags = __owner_flags(owner); 104 104 unsigned long task = owner & ~MUTEX_FLAGS; 105 105 106 106 if (task) { ··· 124 124 */ 125 125 flags &= ~MUTEX_FLAG_HANDOFF; 126 126 127 - old = atomic_long_cmpxchg_acquire(&lock->owner, owner, curr | flags); 128 - if (old == owner) 127 + if (atomic_long_try_cmpxchg_acquire(&lock->owner, &owner, curr | flags)) 129 128 return NULL; 130 - 131 - owner = old; 132 129 } 133 130 134 131 return __owner_task(owner); ··· 165 168 { 166 169 unsigned long curr = (unsigned long)current; 167 170 168 - if (atomic_long_cmpxchg_release(&lock->owner, curr, 0UL) == curr) 169 - return true; 170 - 171 - return false; 171 + return atomic_long_try_cmpxchg_release(&lock->owner, &curr, 0UL); 172 172 } 173 173 #endif 174 174 ··· 210 216 unsigned long owner = atomic_long_read(&lock->owner); 211 217 212 218 for (;;) { 213 - unsigned long old, new; 219 + unsigned long new; 214 220 215 221 #ifdef CONFIG_DEBUG_MUTEXES 216 222 DEBUG_LOCKS_WARN_ON(__owner_task(owner) != current); ··· 222 228 if (task) 223 229 new |= MUTEX_FLAG_PICKUP; 224 230 225 - old = atomic_long_cmpxchg_release(&lock->owner, owner, new); 226 - if (old == owner) 231 + if (atomic_long_try_cmpxchg_release(&lock->owner, &owner, new)) 227 232 break; 228 - 229 - owner = old; 230 233 } 231 234 } 232 235 ··· 1220 1229 */ 1221 1230 owner = atomic_long_read(&lock->owner); 1222 1231 for (;;) { 1223 - unsigned long old; 1224 - 1225 1232 #ifdef CONFIG_DEBUG_MUTEXES 1226 1233 DEBUG_LOCKS_WARN_ON(__owner_task(owner) != current); 1227 1234 DEBUG_LOCKS_WARN_ON(owner & MUTEX_FLAG_PICKUP); ··· 1228 1239 if (owner & MUTEX_FLAG_HANDOFF) 1229 1240 break; 1230 1241 1231 - old = atomic_long_cmpxchg_release(&lock->owner, owner, 1232 - __owner_flags(owner)); 1233 - if (old == owner) { 1242 + if (atomic_long_try_cmpxchg_release(&lock->owner, &owner, __owner_flags(owner))) { 1234 1243 if (owner & MUTEX_FLAG_WAITERS) 1235 1244 break; 1236 1245 1237 1246 return; 1238 1247 } 1239 - 1240 - owner = old; 1241 1248 } 1242 1249 1243 1250 spin_lock(&lock->wait_lock);