Re: [PATCH v4 3/5] mm: Add RCU-based VMA lookup helper that waits for writers
"Vlastimil Babka (SUSE)" <[email protected]>
| Newsgroups | gmane.linux.network,gmane.linux.kernel,gmane.linux.kernel.mm |
|---|---|
| Message-ID | <[email protected]> |
On 8/6/26 22:05, Suren Baghdasaryan wrote: > From: Dave Hansen <[email protected]> > > == 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. > > While at it, fix the comments for vma_start_read_locked(), > vma_start_read_locked_nested(), and uffd_lock_vma(). > > Suggested-by: Lorenzo Stoakes (ARM) <[email protected]> > Signed-off-by: Dave Hansen <[email protected]> > Signed-off-by: Suren Baghdasaryan <[email protected]> > Cc: Suren Baghdasaryan <[email protected]> > Cc: Andrew Morton <[email protected]> > Cc: "Liam R. Howlett" <[email protected]> > Cc: Lorenzo Stoakes <[email protected]> > Cc: Vlastimil Babka <[email protected]> > Cc: Shakeel Butt <[email protected]> > Cc: [email protected] > Cc: Greg Kroah-Hartman <[email protected]> > Cc: Arve Hjønnevåg <[email protected]> > Cc: Todd Kjos <[email protected]> > Cc: Christian Brauner <[email protected]> > Cc: Carlos Llamas <[email protected]> > Cc: Alice Ryhl <[email protected]> > Cc: "David S. Miller" <[email protected]> > Cc: David Ahern <[email protected]> > Cc: [email protected] Acked-by: Vlastimil Babka (SUSE) <[email protected]>