Re: [PATCH v4 3/5] mm: Add RCU-based VMA lookup helper that waits for writers
From: Matthew Wilcox <willy@infradead.org>
Date: 2026-08-08 09:02:09
Also in:
linux-mm, lkml
On Thu, Aug 06, 2026 at 01:05:46PM -0700, Suren Baghdasaryan wrote:
From: Dave Hansen <dave.hansen@linux.intel.com>
== Background ==
There are basically two parallel ways to look up a VMA: the
traditional way, which is protected by mmap_read_lock, and the RCU-based
per-VMA lock way which is based on RCU and refcounts.
== Problem ==
The mmap_lock one is more straightforward to use but it has a big
disadvantage in that it can not be mixed with page faults since those
can take mmap_lock for read, which can deadlock when mixed with nested
page faults and parallel writers.
For example:
mmap_read_lock(mm);
// Another thread does mmap_write_lock().
// New mmap_lock readers are blocked.
vma = vma_lookup(mm, address);
// This deadlocks on mmap_read_lock() if it faults:
copy_from_user(address);
mmap_read_unlock(mm);
The per-VMA lock can be mixed with faults, but they can fail and need to
be able to fall back to the traditional way.
== Solution ==
Add vma_start_read_unlocked() - a variant of the RCU-based lookup that
waits for writers. This is basically the same as the existing RCU-based
lookup, but on a failure to lock it temporarily takes mmap_lock for read
and waits for writers to finish before locking the VMA, dropping the
mmap_lock and returning the locked VMA. This has some advantages:
1. Callers do not need to have a fallback path for when they
collide with writers.
2. It can be used in contexts where page faults can happen because
it can take the mmap_lock for read but never *holds* it.
3. Its fast path does not require taking mmap_lock for read.
Basically, when applied correctly, this approach results in faster
*and* simpler code.Maybe just write a new commit message, because while this is a useful primitive to have, (as evidenced by patch 5) it doesn't do what this commit message claims.