This comment makes my head hurt. In fact, the whole anon_vma thing hurts
my head.
Can we have some better high-level documentation on what happens for all
the cases.
- split (mprotect, or munmap in the middle):
anon_vma_clone: the two vma's will have the same anon_vma, and the
anon_vma chains will be equivalent.
- merge (mprotect that creates a mergeable state):
anon_vma_merge: we're supposed to have a anon_vma_chain that is
a superset of the two chains of the merged entries.
- fork:
anon_vma_fork: each new vma will have a _new_ anon_vma as it's
primary one, and will link to the old primary trough the
anon_vma_chain. It's doing this with a anon_vma_clone() followed
by adding an entra entry to the new anon_vma, and setting
vma->anon_vma to the new one.
- create/mmap:
anon_vma_prepare: find a mergeable anon_vma and use that as a
singleton, because the other entries on the anon_vma chain won't
matter, since they cannot be associated with any pages associated
with the newly created vma..
Correct?
Quite frankly, just looking at that, I can't see how we get to your rules.
At least not trivially. Especially with multiple merges, I don't see
how "singleton" is such a special case.
Linus
--