]> git.baikalelectronics.ru Git - kernel.git/commit
s390/rwlock: introduce rwlock wait queueing
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 24 Mar 2017 16:32:23 +0000 (17:32 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Thu, 28 Sep 2017 05:29:44 +0000 (07:29 +0200)
commitbaabfe18e41e68dd39a9ebd4907198f68a152a7d
treeab510aeb7e5aedc07d1cd0e60c5d430c74e02bd8
parente51ad78c71557c8c9739352fd7169bfa4c3d0270
s390/rwlock: introduce rwlock wait queueing

Like the common queued rwlock code the s390 implementation uses the
queued spinlock code on a spinlock_t embedded in the rwlock_t to achieve
the queueing. The encoding of the rwlock_t differs though, the counter
field in the rwlock_t is split into two parts. The upper two bytes hold
the write bit and the write wait counter, the lower two bytes hold the
read counter.

The arch_read_lock operation works exactly like the common qrwlock but
the enqueue operation for a writer follows a diffent logic. After the
failed inline try to get the rwlock in write, the writer first increases
the write wait counter, acquires the wait spin_lock for the queueing,
and then loops until there are no readers and the write bit is zero.
Without the write wait counter a CPU that just released the rwlock
could immediately reacquire the lock in the inline code, bypassing all
outstanding read and write waiters. For s390 this would cause massive
imbalances in favour of writers in case of a contended rwlock.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/atomic_ops.h
arch/s390/include/asm/spinlock.h
arch/s390/include/asm/spinlock_types.h
arch/s390/lib/spinlock.c