diff options
author | Richard Braun <rbraun@sceen.net> | 2017-05-29 18:35:51 +0200 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2017-05-29 18:35:51 +0200 |
commit | fb9d72a5a9ddc571248025204af63f0987813d50 (patch) | |
tree | beeab1edc01bc922ecc84a8c1a1c333e5a42577d | |
parent | 1c6a75ce939d2e7ffd12a3edac7618eb63447e09 (diff) |
kern/spinlock: replace xxx_once macros with atomic accessors
-rw-r--r-- | kern/spinlock.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/kern/spinlock.c b/kern/spinlock.c index 34b78ba4..3ec36b36 100644 --- a/kern/spinlock.c +++ b/kern/spinlock.c @@ -193,9 +193,9 @@ spinlock_store_first_qid(struct spinlock *lock, unsigned int newqid) newqid <<= SPINLOCK_QID_MAX_BITS; do { - oldval = read_once(lock->value); + oldval = atomic_load(&lock->value, ATOMIC_RELAXED); newval = newqid | (oldval & SPINLOCK_QID_MASK); - prev = atomic_cas_acquire(&lock->value, oldval, newval); + prev = atomic_cas_release(&lock->value, oldval, newval); } while (prev != oldval); } @@ -204,7 +204,7 @@ spinlock_load_first_qid(const struct spinlock *lock) { unsigned int value; - value = read_once(lock->value); + value = atomic_load(&lock->value, ATOMIC_ACQUIRE); return (value >> SPINLOCK_QID_MAX_BITS) & SPINLOCK_QID_MASK; } @@ -216,10 +216,10 @@ spinlock_swap_last_qid(struct spinlock *lock, unsigned int newqid) assert(newqid < SPINLOCK_QID_MAX); do { - oldval = read_once(lock->value); + oldval = atomic_load(&lock->value, ATOMIC_RELAXED); newval = (oldval & (SPINLOCK_QID_MASK << SPINLOCK_QID_MAX_BITS)) | newqid; - prev = atomic_cas_acquire(&lock->value, oldval, newval); + prev = atomic_cas_acq_rel(&lock->value, oldval, newval); } while (prev != oldval); return prev & SPINLOCK_QID_MASK; @@ -230,7 +230,8 @@ spinlock_try_downgrade(struct spinlock *lock, unsigned int oldqid) { unsigned int prev; - prev = atomic_cas_acquire(&lock->value, oldqid, SPINLOCK_QID_LOCKED); + prev = atomic_cas(&lock->value, oldqid, + SPINLOCK_QID_LOCKED, ATOMIC_RELAXED); assert((prev >> SPINLOCK_QID_MAX_BITS) == 0); assert(prev != SPINLOCK_QID_NULL); @@ -263,7 +264,7 @@ spinlock_lock_slow(struct spinlock *lock) spinlock_store_first_qid(lock, qid); } else { prev_qnode = spinlock_get_remote_qnode(prev_qid); - write_once(prev_qnode->next_qid, qid); + atomic_store(&prev_qnode->next_qid, qid, ATOMIC_RELAXED); } for (;;) { @@ -286,7 +287,7 @@ spinlock_lock_slow(struct spinlock *lock) } for (;;) { - next_qid = read_once(qnode->next_qid); + next_qid = atomic_load(&qnode->next_qid, ATOMIC_RELAXED); if (next_qid != SPINLOCK_QID_NULL) { break; |