ACK/cmnt: [SRU][Artful][v2][PATCH 1/1] UBUNTU: SAUCE: (no-up) s390: fix rwlock implementation
Joseph Salisbury
joseph.salisbury at canonical.com
Wed May 23 15:41:44 UTC 2018
On 05/23/2018 11:25 AM, Stefan Bader wrote:
> On 11.05.2018 15:31, Joseph Salisbury wrote:
>> From: Heiko Carstens <heiko.carstens at de.ibm.com>
>>
>> BugLink: http://bugs.launchpad.net/bugs/1761674
>>
>> Description: kernel: fix rwlock implementation
>> Symptom: Kernel hangs, due to deadlock on an rwlock.
>> Problem: With upstream commit 94232a4332de ("s390/rwlock: improve writer
>> fairness") rwlock writer fairness was supposed to be
>> implemented. If a writer tries to take an rwlock it sets
>> unconditionally the writer bit within the lock word and waits
>> until all readers have released the lock. This however can lead
>> to a deadlock since rwlocks can be taken recursively by readers.
>> If e.g. CPU 0 holds the lock as a reader, and CPU 1 wants to
>> write-lock the lock, then CPU 1 sets the writer bit and
>> afterwards busy waits for CPU 0 to release the lock. If now CPU 0
>> tries to read-lock the lock again (recursively) it will also busy
>> wait until CPU 1 removes the writer bit, which will never happen,
>> since it waits for the first reader on CPU 0 to release the lock.
>> Solution: Revert the rwlock writer fairness semantics again.
>>
>> Signed-off-by: Heiko Carstens <heiko.carstens at de.ibm.com>
>> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
> Acked-by: Stefan Bader <stefan.bader at canonical.com>
>
>> ---
> Just to note that this sending v2 (or any other increment) as replies is causing
> very hard to follow threads (at least in thunderbird). It would be much simpler
> to nack the old submission and start a new thread...
>
> -Stefan
I did NAK the v1 here:
https://lists.ubuntu.com/archives/kernel-team/2018-May/092308.html
What's strange though, is the v1 and v2 threads were combined, which you
can see here:
https://lists.ubuntu.com/archives/kernel-team/2018-May/thread.html
It seems adding '[v2]' to the subject is not enough for a new thread to
be started. I'm using 'git send-email' to send my SRU requests, so
maybe it's something I'm doing wrong. I'll investigate, so I don't do
it again. Thanks for pointing this out.
>
>> arch/s390/lib/spinlock.c | 46 +++++++++-------------------------------------
>> 1 file changed, 9 insertions(+), 37 deletions(-)
>>
>> diff --git a/arch/s390/lib/spinlock.c b/arch/s390/lib/spinlock.c
>> index ffb15bd..b3d5e7a 100644
>> --- a/arch/s390/lib/spinlock.c
>> +++ b/arch/s390/lib/spinlock.c
>> @@ -174,40 +174,18 @@ int _raw_read_trylock_retry(arch_rwlock_t *rw)
>> EXPORT_SYMBOL(_raw_read_trylock_retry);
>>
>> #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
>> -
>> void _raw_write_lock_wait(arch_rwlock_t *rw, int prev)
>> -{
>> - int count = spin_retry;
>> - int owner, old;
>> -
>> - owner = 0;
>> - while (1) {
>> - if (count-- <= 0) {
>> - if (owner && arch_vcpu_is_preempted(~owner))
>> - smp_yield_cpu(~owner);
>> - count = spin_retry;
>> - }
>> - old = ACCESS_ONCE(rw->lock);
>> - owner = ACCESS_ONCE(rw->owner);
>> - smp_mb();
>> - if (old >= 0) {
>> - prev = __RAW_LOCK(&rw->lock, 0x80000000, __RAW_OP_OR);
>> - old = prev;
>> - }
>> - if ((old & 0x7fffffff) == 0 && prev >= 0)
>> - break;
>> - }
>> -}
>> -EXPORT_SYMBOL(_raw_write_lock_wait);
>> -
>> -#else /* CONFIG_HAVE_MARCH_Z196_FEATURES */
>> -
>> +#else
>> void _raw_write_lock_wait(arch_rwlock_t *rw)
>> +#endif
>> {
>> int count = spin_retry;
>> - int owner, old, prev;
>> + int owner, old;
>>
>> - prev = 0x80000000;
>> +#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
>> + if ((int) prev > 0)
>> + __RAW_UNLOCK(&rw->lock, 0x7fffffff, __RAW_OP_AND);
>> +#endif
>> owner = 0;
>> while (1) {
>> if (count-- <= 0) {
>> @@ -217,19 +195,13 @@ void _raw_write_lock_wait(arch_rwlock_t *rw)
>> }
>> old = ACCESS_ONCE(rw->lock);
>> owner = ACCESS_ONCE(rw->owner);
>> - if (old >= 0 &&
>> - __atomic_cmpxchg_bool(&rw->lock, old, old | 0x80000000))
>> - prev = old;
>> - else
>> - smp_mb();
>> - if ((old & 0x7fffffff) == 0 && prev >= 0)
>> + if (old == 0 && __atomic_cmpxchg_bool(&rw->lock, old, old | 0x80000000))
>> break;
>> + smp_mb();
>> }
>> }
>> EXPORT_SYMBOL(_raw_write_lock_wait);
>>
>> -#endif /* CONFIG_HAVE_MARCH_Z196_FEATURES */
>> -
>> int _raw_write_trylock_retry(arch_rwlock_t *rw)
>> {
>> int count = spin_retry;
>>
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ubuntu.com/archives/kernel-team/attachments/20180523/a81da01d/attachment.sig>
More information about the kernel-team
mailing list