From: Olaf Weber <olaf@sgi.com>
To: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@elte.hu>, Christoph Lameter <clameter@sgi.com>,
linux-kernel@vger.kernel.org
Subject: Re: Spinlocks waiting with interrupts disabled / preempt disabled.
Date: Fri, 09 May 2008 22:01:56 +0200 [thread overview]
Message-ID: <bzyk5i3w8jv.fsf@fransum.emea.sgi.com> (raw)
In-Reply-To: <1210355814.13978.255.camel@twins> (Peter Zijlstra's message of "Fri, 09 May 2008 19:56:54 +0200")
Peter Zijlstra writes:
> On Fri, 2008-05-09 at 18:35 +0200, Olaf Weber wrote:
>> An alternative approach would to view this as a bug of the rwlock_t
>> code in particular, and fix it by keeping new readers from a acquiring
>> an rwlock_t if a writer is also trying to lock it. For x86 at least,
>> I can sketch an implementation that is based on the new ticket-based
>> spinlocks:
>> - use the ticket-based lock for writers
>> - add a reader count for readers (16 bits out of 32 are free)
>> - readers get in if the write lock is idle
>> - if the write lock wasn't idle, readers loop until it is
>> - on obtaining the ticket-based lock, the writer waits for active
>> readers to leave (eg reader count to go to zero)
>> Contention by writers now keeps readers out, which may be a problem.
>>
>> Advantages of such an approach:
>> - Writers are "fair" amongst themselves.
>> - Readers cannot hold off writers.
>>
>> Disadvantages:
>> - Contention among writers can hold off readers indefinitely.
>> This scheme only works if the write lock is not "permanently"
>> contended, otherwise it goes from frying pan to fire.
>> - Requires changes to the asm-coded locking primitives, which means
>> it is likely to be done for x86 and ia64 only, unless the platform
>> maintainers step in.
>>
>> Given the above, is this worth pursuing for inclusion in mainline?
> Keep in mind that rwlock_t must support recusive read locks. Much code
> depends on this.
Ouch. Given the possibility of something like this:
thread A thread B
read_lock
write_lock -- attempt, will spin
read_lock -- recursive
we'd have to deal with not having the write be a barrier to the
recursive read_lock, yet a barrier to a new read_lock. That's not
possible without keeping track of read_lock owners, which would
greatly complicate the locks.
IMHO recursive locking is moderately evil at the best of time, but if
it's there, its there. (And if it's necessary, it has to be allowed.)
>> A third solution would be to look at this problem on a case-by-case
>> basis. In the case under discussion, there may be other kernel bugs
>> that aggravate the problem (it is an old kernel after all) and maybe
>> this just means the address_space.tree_lock ought to be replaced with
>> something else (though I wouldn't claim to know what).
> That has been done by Nick Piggin, the lockless pagecache work removes
> the read side of the tree_lock.
Now that is good news.
--
Olaf Weber SGI Phone: +31(0)30-6696752
Veldzigt 2b Fax: +31(0)30-6696799
Technical Lead 3454 PW de Meern Vnet: 955-7151
Storage Software The Netherlands Email: olaf@sgi.com
prev parent reply other threads:[~2008-05-09 20:02 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-06 19:26 Spinlocks waiting with interrupts disabled / preempt disabled Christoph Lameter
2008-05-07 7:30 ` Ingo Molnar
2008-05-07 17:04 ` Christoph Lameter
2008-05-07 17:24 ` Christoph Lameter
2008-05-07 18:49 ` Spinlocks: Factor our GENERIC_LOCKBREAK in order to avoid spin with irqs disable Christoph Lameter
2008-05-09 10:26 ` Ingo Molnar
2008-05-09 16:28 ` Christoph Lameter
2008-06-23 17:19 ` Petr Tesarik
2008-06-23 17:54 ` Peter Zijlstra
2008-06-23 18:20 ` Christoph Lameter
2008-06-23 20:39 ` Peter Zijlstra
2008-06-23 20:45 ` Christoph Lameter
2008-06-23 20:58 ` Peter Zijlstra
2008-06-26 2:51 ` Jeremy Fitzhardinge
2008-06-26 6:51 ` Peter Zijlstra
2008-06-26 15:49 ` Jeremy Fitzhardinge
2008-06-26 9:17 ` Petr Tesarik
2008-06-26 17:02 ` Christoph Lameter
2008-06-26 17:48 ` Peter Zijlstra
2008-07-07 11:50 ` Nick Piggin
2008-07-07 11:52 ` Nick Piggin
2008-07-07 15:56 ` Jeremy Fitzhardinge
2008-07-08 2:08 ` Nick Piggin
2008-07-07 15:53 ` Jeremy Fitzhardinge
2008-07-07 19:46 ` Rik van Riel
2008-07-07 20:14 ` Jeremy Fitzhardinge
2008-07-08 2:07 ` Nick Piggin
2008-07-08 5:57 ` Jeremy Fitzhardinge
2008-07-08 8:41 ` Nick Piggin
2008-07-08 15:58 ` Jeremy Fitzhardinge
2008-05-09 16:35 ` Spinlocks waiting with interrupts disabled / preempt disabled Olaf Weber
2008-05-09 17:56 ` Peter Zijlstra
2008-05-09 18:00 ` Christoph Lameter
2008-05-09 18:06 ` Peter Zijlstra
2008-05-09 20:01 ` Olaf Weber [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=bzyk5i3w8jv.fsf@fransum.emea.sgi.com \
--to=olaf@sgi.com \
--cc=a.p.zijlstra@chello.nl \
--cc=clameter@sgi.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox