History

locking/rwsem: Introduce rwsem_write_trylock()

One copy of this logic is better than three.

Peter Zijlstra committed 5 years ago

Commit 285c61a1 parent 33791161 file · +16 −22Browse files

Unified · Split

kernel/locking/rwsem.c+16−22
@@ -285,6 +285,18 @@ static inline bool rwsem_read_trylock(struct rw_semaphore *sem) · 284 unmodified lines
285285 return false;
286286 }
287287
288+static inline bool rwsem_write_trylock(struct rw_semaphore *sem)
289+{
290+ long tmp = RWSEM_UNLOCKED_VALUE;
291+
292+ if (atomic_long_try_cmpxchg_acquire(&sem->count, &tmp, RWSEM_WRITER_LOCKED)) {
293+ rwsem_set_owner(sem);
294+ return true;
295+ }
296+
297+ return false;
298+}
299+
288300 /*
289301 * Return just the real task structure pointer of the owner
290302 */
@@ -1395,42 +1407,24 @@ static inline int __down_read_trylock(struct rw_semaphore *sem) · 1104 unmodified lines
13951407 */
13961408 static inline void __down_write(struct rw_semaphore *sem)
13971409 {
1398− long tmp = RWSEM_UNLOCKED_VALUE;
1399−
1400− if (unlikely(!atomic_long_try_cmpxchg_acquire(&sem->count, &tmp,
1401− RWSEM_WRITER_LOCKED)))
1410+ if (unlikely(!rwsem_write_trylock(sem)))
14021411 rwsem_down_write_slowpath(sem, TASK_UNINTERRUPTIBLE);
1403− else
1404− rwsem_set_owner(sem);
14051412 }
14061413
14071414 static inline int __down_write_killable(struct rw_semaphore *sem)
14081415 {
1409− long tmp = RWSEM_UNLOCKED_VALUE;
1410−
1411− if (unlikely(!atomic_long_try_cmpxchg_acquire(&sem->count, &tmp,
1412− RWSEM_WRITER_LOCKED))) {
1416+ if (unlikely(!rwsem_write_trylock(sem))) {
14131417 if (IS_ERR(rwsem_down_write_slowpath(sem, TASK_KILLABLE)))
14141418 return -EINTR;
1415− } else {
1416− rwsem_set_owner(sem);
14171419 }
1420+
14181421 return 0;
14191422 }
14201423
14211424 static inline int __down_write_trylock(struct rw_semaphore *sem)
14221425 {
1423− long tmp;
1424−
14251426 DEBUG_RWSEMS_WARN_ON(sem->magic != sem, sem);
1426−
1427− tmp = RWSEM_UNLOCKED_VALUE;
1428− if (atomic_long_try_cmpxchg_acquire(&sem->count, &tmp,
1429− RWSEM_WRITER_LOCKED)) {
1430− rwsem_set_owner(sem);
1431− return true;
1432− }
1433− return false;
1427+ return rwsem_write_trylock(sem);
14341428 }
14351429
14361430 /*