void _raw_write_lock_wait(arch_rwlock_t *rw) { int count = spin_retry; while (1) { if (count-- <= 0) { smp_yield(); count = spin_retry; } if (!arch_write_can_lock(rw)) continue; if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0) return; } }
void _raw_write_lock_wait(arch_rwlock_t *rw) { unsigned int old; int count = spin_retry; while (1) { if (count-- <= 0) { smp_yield(); count = spin_retry; } old = ACCESS_ONCE(rw->lock); if (old) continue; if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000)) return; } }
void _raw_read_lock_wait(arch_rwlock_t *rw) { unsigned int old; int count = spin_retry; while (1) { if (count-- <= 0) { smp_yield(); count = spin_retry; } old = ACCESS_ONCE(rw->lock); if ((int) old < 0) continue; if (_raw_compare_and_swap(&rw->lock, old, old + 1)) return; } }
void _raw_write_lock_wait_flags(arch_rwlock_t *rw, unsigned long flags) { int count = spin_retry; local_irq_restore(flags); while (1) { if (count-- <= 0) { smp_yield(); count = spin_retry; } if (!arch_write_can_lock(rw)) continue; local_irq_disable(); if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000) == 0) return; } }
void _raw_read_lock_wait(arch_rwlock_t *rw) { unsigned int old; int count = spin_retry; while (1) { if (count-- <= 0) { smp_yield(); count = spin_retry; } if (!arch_read_can_lock(rw)) continue; old = rw->lock & 0x7fffffffU; if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old) return; } }
void _raw_read_lock_wait_flags(arch_rwlock_t *rw, unsigned long flags) { unsigned int old; int count = spin_retry; local_irq_restore(flags); while (1) { if (count-- <= 0) { smp_yield(); count = spin_retry; } if (!arch_read_can_lock(rw)) continue; old = rw->lock & 0x7fffffffU; local_irq_disable(); if (_raw_compare_and_swap(&rw->lock, old, old + 1) == old) return; } }
void _raw_write_lock_wait_flags(arch_rwlock_t *rw, unsigned long flags) { unsigned int old; int count = spin_retry; local_irq_restore(flags); while (1) { if (count-- <= 0) { smp_yield(); count = spin_retry; } old = ACCESS_ONCE(rw->lock); if (old) continue; local_irq_disable(); if (_raw_compare_and_swap(&rw->lock, 0, 0x80000000)) return; local_irq_restore(flags); } }