Skip to content

Commit

Permalink
mm/mmap: use the maple tree in find_vma() instead of the rbtree.
Browse files Browse the repository at this point in the history
Using the maple tree interface mt_find() will handle the RCU locking and
will start searching at the address up to the limit, ULONG_MAX in this
case.

Add kernel documentation to this API.

Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Alexandre Frade <kernel@xanmod.org>
  • Loading branch information
howlett authored and xanmod committed Oct 3, 2022
1 parent f399b7d commit 76903aa
Showing 1 changed file with 10 additions and 18 deletions.
28 changes: 10 additions & 18 deletions mm/mmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2446,34 +2446,26 @@ get_unmapped_area(struct file *file, unsigned long addr, unsigned long len,

EXPORT_SYMBOL(get_unmapped_area);

/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
/**
* find_vma() - Find the VMA for a given address, or the next VMA.
* @mm: The mm_struct to check
* @addr: The address
*
* Returns: The VMA associated with addr, or the next VMA.
* May return %NULL in the case of no VMA at addr or above.
*/
struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)
{
struct rb_node *rb_node;
struct vm_area_struct *vma;
unsigned long index = addr;

mmap_assert_locked(mm);
/* Check the cache first. */
vma = vmacache_find(mm, addr);
if (likely(vma))
return vma;

rb_node = mm->mm_rb.rb_node;

while (rb_node) {
struct vm_area_struct *tmp;

tmp = rb_entry(rb_node, struct vm_area_struct, vm_rb);

if (tmp->vm_end > addr) {
vma = tmp;
if (tmp->vm_start <= addr)
break;
rb_node = rb_node->rb_left;
} else
rb_node = rb_node->rb_right;
}

vma = mt_find(&mm->mm_mt, &index, ULONG_MAX);
if (vma)
vmacache_update(addr, vma);
return vma;
Expand Down

0 comments on commit 76903aa

Please sign in to comment.