mm/mmap: Add inline vma_next() for readability of mmap code
Subsystems (2)
PATCH 1/2 mm/mmap: Add inline vma_next() for readability of mmap code
There are three places that the next vma is required which uses the same block of code. Replace the block with a function and add comments on what happens in the case where NULL is encountered.
Signed-off-by Liam R. Howlett <[email protected]>
--- mm/mmap.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-)
mm/mmap.c +20 -6
@@ -560,6 +560,23 @@ static int find_vma_links(struct mm_struct *mm, unsigned long addr,return 0 ; } +/* +* vma_next() - Get the next VMA. +* @mm: The mm_struct. +* @vma: The current vma. +* +* If @vma is NULL, return the first vma in the mm. +* +* Returns: The next VMA after @vma. +*/ +static inline struct vm_area_struct *vma_next (struct mm_struct *mm, +struct vm_area_struct *vma) +{ +if (!vma) +return mm->mmap; + +return vma->vm_next; +}static unsigned long count_vma_pages_range (struct mm_struct *mm,unsigned long addr,unsigned long end) {
@@ -1131,10 +1148,7 @@ struct vm_area_struct *vma_merge(struct mm_struct *mm,if (vm_flags &VM_SPECIAL )return NULL ; -if (prev) - next = prev->vm_next; -else - next = mm->mmap; + next =vma_next (mm, prev); area = next;if (area && area->vm_end == end)/* cases 6, 7, 8 */ next = next->vm_next;
@@ -2625,7 +2639,7 @@ static void unmap_region(struct mm_struct *mm, struct vm_area_struct *vma, struct vm_area_struct *prev, unsigned long start, unsigned long end) { - struct vm_area_struct *next = prev ? prev->vm_next : mm->mmap; + struct vm_area_struct *next = vma_next(mm, prev);struct mmu_gather tlb;lru_add_drain ();
@@ -2824,7 +2838,7 @@ int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len,if (error)return error; } - vma = prev ? prev->vm_next : mm->mmap; + vma =vma_next (mm, prev);if (unlikely (uf)) {/*
Signature · 1 line
2.28.0
PATCH 2/2 mm/mmap: Add inline munmap_vma_range() for code readability
There are two locations that have a block of code for munmapping a vma range. Change those two locations to use a function and add meaningful comments about what happens to the arguments, which was unclear in the previous code.
Signed-off-by Liam R. Howlett <[email protected]>
--- mm/mmap.c | 48 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 15 deletions(-)
mm/mmap.c +33 -15
@@ -577,6 +577,33 @@ static inline struct vm_area_struct *vma_next(struct mm_struct *mm,return vma->vm_next; } + +/* +* munmap_vma_range() - munmap VMAs that overlap a range. +* @mm: The mm struct +* @start: The start of the range. +* @len: The length of the range. +* @pprev: pointer to the pointer that will be set to previous vm_area_struct +* @rb_link: the rb_node +* @rb_parent: the parent rb_node +* +* Find all the vm_area_struct that overlap from @start to +* @end and munmap them. Set @pprev to the previous vm_area_struct. +* +* Returns: -ENOMEM on munmap failure or 0 on success. +*/ +static inline int +munmap_vma_range (struct mm_struct *mm,unsigned long start,unsigned long len, +struct vm_area_struct **pprev,struct rb_node ***link, +struct rb_node **parent,struct list_head *uf) +{ + +while (find_vma_links (mm, start, start + len, pprev, link, parent)) +if (do_munmap (mm, start, len, uf)) +return -ENOMEM ; + +return 0 ; +}static unsigned long count_vma_pages_range (struct mm_struct *mm,unsigned long addr,unsigned long end) {
@@ -1724,13 +1751,9 @@ unsigned long mmap_region(struct file *file, unsigned long addr,return -ENOMEM ; } -/* Clear old maps */ -while (find_vma_links (mm, addr, addr + len, &prev, &rb_link, - &rb_parent)) { -if (do_munmap (mm, addr, len, uf)) -return -ENOMEM ; - } - +/* Clear old maps, set up prev, rb_link, rb_parent, and uf */ +if (munmap_vma_range (mm, addr, len, &prev, &rb_link, &rb_parent, uf)) +return -ENOMEM ;/* * Private writable mapping: check memory availability */
@@ -3056,14 +3079,9 @@ static int do_brk_flags(unsigned long addr, unsigned long len, unsigned long flaif (error)return error; -/* -* Clear old maps. this also does some error checking for us -*/ -while (find_vma_links (mm, addr, addr + len, &prev, &rb_link, - &rb_parent)) { -if (do_munmap (mm, addr, len, uf)) -return -ENOMEM ; - } +/* Clear old maps, set up prev, rb_link, rb_parent, and uf */ +if (munmap_vma_range (mm, addr, len, &prev, &rb_link, &rb_parent, uf)) +return -ENOMEM ;/* Check against address space limits *after* clearing old maps... */ if (!may_expand_vm (mm, flags, len >>PAGE_SHIFT ))
Signature · 1 line
2.28.0