I disagree with the diagnosis..
expand_stack() has _never_ messed with the vma layout, and never should.
As such, from a vma list integrity standpoint it is fine.
Do we mess with the contents? Yes. But I'd much rather see a much more
minimal approach to the problem, on the order of:
- make sure we only accept GROWSDOWN for anonymous areas (which don't
care about the offset)
- make the vm_start update atomic (possibly by just getting the pagetable
spinlock).
> I considered implementing a read->write semaphore upgrade primitive but
> it cannot be reliable
There is no such thing. Never has been. It's a fundamentally impossible
operation. We may, at some point, decide to have a "read_for_write()" and
then "upgrade()" operations on the semaphore, but those inherently imply
some level of single-threading (ie only one read-for-writer accepted at
one time, with many pure readers), which makes it useless for this
particular case anyway.
However, having a finer-granularity spinlock _inside_ the semaphore (see
above suggestion) is a perfectly valid approach.
Linus
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/