mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
![Waiman Long](/assets/img/avatar_default.png)
This rwlock uses the arch_spin_lock_t as a waitqueue, and assuming the arch_spin_lock_t is a fair lock (ticket,mcs etc..) the resulting rwlock is a fair lock. It fits in the same 8 bytes as the regular rwlock_t by folding the reader and writer count into a single integer, using the remaining 4 bytes for the arch_spinlock_t. Architectures that can single-copy adress bytes can optimize queue_write_unlock() with a 0 write to the LSB (the write count). Performance as measured by Davidlohr Bueso (rwlock_t -> qrwlock_t): +--------------+-------------+---------------+ | Workload | #users | delta | +--------------+-------------+---------------+ | alltests | > 1400 | -4.83% | | custom | 0-100,> 100 | +1.43%,-1.57% | | high_systime | > 1000 | -2.61 | | shared | all | +0.32 | +--------------+-------------+---------------+ http://www.stgolabs.net/qrwlock-stuff/aim7-results-vs-rwsem_optsin/ Signed-off-by: Waiman Long <Waiman.Long@hp.com> [peterz: near complete rewrite] Signed-off-by: Peter Zijlstra <peterz@infradead.org> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: "Paul E.McKenney" <paulmck@linux.vnet.ibm.com> Cc: linux-arch@vger.kernel.org Cc: linux-kernel@vger.kernel.org Link: http://lkml.kernel.org/n/tip-gac1nnl3wvs2ij87zv2xkdzq@git.kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
21 lines
421 B
C
21 lines
421 B
C
#ifndef __ASM_GENERIC_QRWLOCK_TYPES_H
|
|
#define __ASM_GENERIC_QRWLOCK_TYPES_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/spinlock_types.h>
|
|
|
|
/*
|
|
* The queue read/write lock data structure
|
|
*/
|
|
|
|
typedef struct qrwlock {
|
|
atomic_t cnts;
|
|
arch_spinlock_t lock;
|
|
} arch_rwlock_t;
|
|
|
|
#define __ARCH_RW_LOCK_UNLOCKED { \
|
|
.cnts = ATOMIC_INIT(0), \
|
|
.lock = __ARCH_SPIN_LOCK_UNLOCKED, \
|
|
}
|
|
|
|
#endif /* __ASM_GENERIC_QRWLOCK_TYPES_H */
|