Commit a0b9b0f1 authored by Alice Ryhl's avatar Alice Ryhl Committed by Greg Kroah-Hartman
Browse files

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: default avatarAlice Ryhl <aliceryhl@google.com>
Reviewed-by: default avatarJann Horn <jannh@google.com>
Reviewed-by: default avatarLiam R. Howlett <Liam.Howlett@oracle.com>
Link: https://patch.msgid.link/20260218-binder-vma-rcu-v1-1-8bd45b2b1183@google.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 2e303f0f
Loading
Loading
Loading
Loading
+19 −18
Original line number Diff line number Diff line
@@ -435,24 +435,25 @@ unsafe fn use_page_slow(&self, i: usize) -> Result<()> {
        //
        // Using `mmput_async` avoids this, because then the `mm` cleanup is instead queued to a
        // workqueue.
        check_vma(
            MmWithUser::into_mmput_async(self.mm.mmget_not_zero().ok_or(ESRCH)?)
                .mmap_read_lock()
        let mm = MmWithUser::into_mmput_async(self.mm.mmget_not_zero().ok_or(ESRCH)?);
        {
            let vma_read;
            let mmap_read;
            let vma = if let Some(ret) = mm.lock_vma_under_rcu(vma_addr) {
                vma_read = ret;
                check_vma(&vma_read, self)
            } else {
                mmap_read = mm.mmap_read_lock();
                mmap_read
                    .vma_lookup(vma_addr)
                .ok_or(ESRCH)?,
            self,
        )
        .ok_or(ESRCH)?
        .vm_insert_page(user_page_addr, &new_page)
        .inspect_err(|err| {
            pr_warn!(
                "Failed to vm_insert_page({}): vma_addr:{} i:{} err:{:?}",
                user_page_addr,
                vma_addr,
                i,
                err
            )
        })?;
                    .and_then(|vma| check_vma(vma, self))
            };

            match vma {
                Some(vma) => vma.vm_insert_page(user_page_addr, &new_page)?,
                None => return Err(ESRCH),
            }
        }

        let inner = self.lock.lock();