diff options
Diffstat (limited to 'drivers/tty/tty_ldsem.c')
| -rw-r--r-- | drivers/tty/tty_ldsem.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/tty/tty_ldsem.c b/drivers/tty/tty_ldsem.c index 22fad8ad5ac2..d8a55e87877f 100644 --- a/drivers/tty/tty_ldsem.c +++ b/drivers/tty/tty_ldsem.c | |||
| @@ -86,11 +86,21 @@ static inline long ldsem_atomic_update(long delta, struct ld_semaphore *sem) | |||
| 86 | return atomic_long_add_return(delta, (atomic_long_t *)&sem->count); | 86 | return atomic_long_add_return(delta, (atomic_long_t *)&sem->count); |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | /* | ||
| 90 | * ldsem_cmpxchg() updates @*old with the last-known sem->count value. | ||
| 91 | * Returns 1 if count was successfully changed; @*old will have @new value. | ||
| 92 | * Returns 0 if count was not changed; @*old will have most recent sem->count | ||
| 93 | */ | ||
| 89 | static inline int ldsem_cmpxchg(long *old, long new, struct ld_semaphore *sem) | 94 | static inline int ldsem_cmpxchg(long *old, long new, struct ld_semaphore *sem) |
| 90 | { | 95 | { |
| 91 | long tmp = *old; | 96 | long tmp = atomic_long_cmpxchg(&sem->count, *old, new); |
| 92 | *old = atomic_long_cmpxchg(&sem->count, *old, new); | 97 | if (tmp == *old) { |
| 93 | return *old == tmp; | 98 | *old = new; |
| 99 | return 1; | ||
| 100 | } else { | ||
| 101 | *old = tmp; | ||
| 102 | return 0; | ||
| 103 | } | ||
| 94 | } | 104 | } |
| 95 | 105 | ||
| 96 | /* | 106 | /* |
