Skip to content

Commit a0b9b0f

Browse files
Darksonngregkh
authored andcommitted
rust_binder: use lock_vma_under_rcu() in use_page_slow()
There's no reason to lock the whole mm when we are doing operations on the vma if we can help it, so to reduce contention, use the lock_vma_under_rcu() abstraction. Signed-off-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Jann Horn <jannh@google.com> Reviewed-by: Liam R. Howlett <Liam.Howlett@oracle.com> Link: https://patch.msgid.link/20260218-binder-vma-rcu-v1-1-8bd45b2b1183@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 2e303f0 commit a0b9b0f

1 file changed

Lines changed: 19 additions & 18 deletions

File tree

drivers/android/binder/page_range.rs

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -435,24 +435,25 @@ impl ShrinkablePageRange {
435435
//
436436
// Using `mmput_async` avoids this, because then the `mm` cleanup is instead queued to a
437437
// workqueue.
438-
check_vma(
439-
MmWithUser::into_mmput_async(self.mm.mmget_not_zero().ok_or(ESRCH)?)
440-
.mmap_read_lock()
441-
.vma_lookup(vma_addr)
442-
.ok_or(ESRCH)?,
443-
self,
444-
)
445-
.ok_or(ESRCH)?
446-
.vm_insert_page(user_page_addr, &new_page)
447-
.inspect_err(|err| {
448-
pr_warn!(
449-
"Failed to vm_insert_page({}): vma_addr:{} i:{} err:{:?}",
450-
user_page_addr,
451-
vma_addr,
452-
i,
453-
err
454-
)
455-
})?;
438+
let mm = MmWithUser::into_mmput_async(self.mm.mmget_not_zero().ok_or(ESRCH)?);
439+
{
440+
let vma_read;
441+
let mmap_read;
442+
let vma = if let Some(ret) = mm.lock_vma_under_rcu(vma_addr) {
443+
vma_read = ret;
444+
check_vma(&vma_read, self)
445+
} else {
446+
mmap_read = mm.mmap_read_lock();
447+
mmap_read
448+
.vma_lookup(vma_addr)
449+
.and_then(|vma| check_vma(vma, self))
450+
};
451+
452+
match vma {
453+
Some(vma) => vma.vm_insert_page(user_page_addr, &new_page)?,
454+
None => return Err(ESRCH),
455+
}
456+
}
456457

457458
let inner = self.lock.lock();
458459

0 commit comments

Comments
 (0)