mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

Currently, the binder driver always uses the mmap lock to make changes to its vma. Because the mmap lock is global to the process, this can involve significant contention. However, the kernel has a feature called per-vma locks, which can significantly reduce contention. For example, you can take a vma lock in parallel with an mmap write lock. This is important because contention on the mmap lock has been a long-term recurring challenge for the Binder driver. This patch introduces support for using `lock_vma_under_rcu` from Rust. The Rust Binder driver will be able to use this to reduce contention on the mmap lock. Link: https://lkml.kernel.org/r/20250408-vma-v16-4-d8b446e885d9@google.com Signed-off-by: Alice Ryhl <aliceryhl@google.com> Acked-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Acked-by: Liam R. Howlett <Liam.Howlett@Oracle.com> Reviewed-by: Jann Horn <jannh@google.com> Reviewed-by: Andreas Hindborg <a.hindborg@kernel.org> Reviewed-by: Gary Guo <gary@garyguo.net> Cc: Alex Gaynor <alex.gaynor@gmail.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Balbir Singh <balbirs@nvidia.com> Cc: Benno Lossin <benno.lossin@proton.me> Cc: Björn Roy Baron <bjorn3_gh@protonmail.com> Cc: Boqun Feng <boqun.feng@gmail.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Miguel Ojeda <ojeda@kernel.org> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Trevor Gross <tmgross@umich.edu> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
50 lines
838 B
C
50 lines
838 B
C
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
#include <linux/mm.h>
|
|
#include <linux/sched/mm.h>
|
|
|
|
void rust_helper_mmgrab(struct mm_struct *mm)
|
|
{
|
|
mmgrab(mm);
|
|
}
|
|
|
|
void rust_helper_mmdrop(struct mm_struct *mm)
|
|
{
|
|
mmdrop(mm);
|
|
}
|
|
|
|
void rust_helper_mmget(struct mm_struct *mm)
|
|
{
|
|
mmget(mm);
|
|
}
|
|
|
|
bool rust_helper_mmget_not_zero(struct mm_struct *mm)
|
|
{
|
|
return mmget_not_zero(mm);
|
|
}
|
|
|
|
void rust_helper_mmap_read_lock(struct mm_struct *mm)
|
|
{
|
|
mmap_read_lock(mm);
|
|
}
|
|
|
|
bool rust_helper_mmap_read_trylock(struct mm_struct *mm)
|
|
{
|
|
return mmap_read_trylock(mm);
|
|
}
|
|
|
|
void rust_helper_mmap_read_unlock(struct mm_struct *mm)
|
|
{
|
|
mmap_read_unlock(mm);
|
|
}
|
|
|
|
struct vm_area_struct *rust_helper_vma_lookup(struct mm_struct *mm,
|
|
unsigned long addr)
|
|
{
|
|
return vma_lookup(mm, addr);
|
|
}
|
|
|
|
void rust_helper_vma_end_read(struct vm_area_struct *vma)
|
|
{
|
|
vma_end_read(vma);
|
|
}
|