summaryrefslogtreecommitdiff
path: root/rust
diff options
context:
space:
mode:
authorDave Hansen <dave.hansen@linux.intel.com>2026-08-31 13:30:55 -0700
committerAndrew Morton <akpm@linux-foundation.org>2026-10-06 17:39:11 -0700
commita3bbbd68bf2a4baf972efb734d97c1b241c3881a (patch)
treea15051d0061cd5b0f73c9fbeee42182a47f1da81 /rust
parentd96082aa35043cd1856e2213e683db778482a7d8 (diff)
binder: remove mmap_lock fallback
Previously, the per-VMA locking could fail in the face of writers which necessitate a fallback to mmap_lock. The new vma_start_read_unlocked() will wait for writers instead of failing. Use the new helper. Wait for writers. Remove the fallback to mmap_lock. Link: https://lore.kernel.org/20260831203056.838265-5-surenb@google.com Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Signed-off-by: Suren Baghdasaryan <surenb@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Acked-by: Lorenzo Stoakes (ARM) <ljs@kernel.org> Cc: Liam R. Howlett <liam@infradead.org> Cc: Vlastimil Babka <vbabka@kernel.org> Cc: Shakeel Butt <shakeel.butt@linux.dev> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Todd Kjos <tkjos@android.com> Cc: Christian Brauner <christian@brauner.io> Cc: Carlos Llamas <cmllamas@google.com> Cc: David S. Miller <davem@davemloft.net> Cc: David Ahern <dsahern@kernel.org> Cc: Arve Hjønnevåg <arve@android.com> Cc: David Hildenbrand (Arm) <david@kernel.org>
Diffstat (limited to 'rust')
-rw-r--r--rust/kernel/mm.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/rust/kernel/mm.rs b/rust/kernel/mm.rs
index f4fa54616085..58bc1793fdaf 100644
--- a/rust/kernel/mm.rs
+++ b/rust/kernel/mm.rs
@@ -186,6 +186,34 @@ impl MmWithUser {
})
}
+ /// Find the VMA covering 'address' and read-lock it.
+ ///
+ /// The fast path does not take mmap_lock. Waits for writers to finish if the
+ /// VMA is being modified by taking mmap_lock.
+ /// Use when mmap_lock is not held, otherwise use vma_start_read_locked().
+ /// Nothing prevents VMAs being unmapped/mapped before or after the VMA is
+ /// looked up, if a stronger guarantee is required, take an mmap_lock.
+ ///
+ /// Return: If a VMA exists which spans @address, return that VMA, read-locked.
+ /// If no VMA is mapped there or, very unlikely, a reference count overflow
+ /// occurred, return NULL.
+ #[inline]
+ pub fn vma_start_read_unlocked(&self, vma_addr: usize) -> Option<VmaReadGuard<'_>> {
+ // SAFETY: We may invoke `vma_start_read_unlocked` because we know this `mm` has non-zero
+ // `mm_users`.
+ let vma = unsafe { bindings::vma_start_read_unlocked(self.as_raw(), vma_addr) };
+ if vma.is_null() {
+ return None;
+ }
+ // INVARIANT: We just acquired the VMA read lock.
+ Some(VmaReadGuard {
+ // SAFETY: If `vma_start_read_unlocked` returns a non-null ptr, then it points at a
+ // valid vma. The vma is stable for as long as the vma read lock is held.
+ vma: unsafe { VmaRef::from_raw(vma) },
+ _nts: NotThreadSafe,
+ })
+ }
+
/// Lock the mmap read lock.
#[inline]
pub fn mmap_read_lock(&self) -> MmapReadGuard<'_> {