Skip to content

Commit

Permalink
nommu: fix split_vma() map_count error
Browse files Browse the repository at this point in the history
commit fd9edbd upstream.

During the maple tree conversion of nommu, an error in counting the VMAs
was introduced by counting the existing VMA again.  The counting used to
be decremented by one and incremented by two, but now it only increments
by two.  Fix the counting error by moving the increment outside the
setup_vma_to_mm() function to the callers.

Link: https://lkml.kernel.org/r/20230109205809.956325-1-Liam.Howlett@oracle.com
Fixes: 8220543 ("nommu: remove uses of VMA linked list")
Signed-off-by: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Yu Zhao <yuzhao@google.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
howlett authored and gregkh committed Jan 24, 2023
1 parent 6447569 commit e733121
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion mm/nommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,6 @@ void vma_mas_remove(struct vm_area_struct *vma, struct ma_state *mas)

static void setup_vma_to_mm(struct vm_area_struct *vma, struct mm_struct *mm)
{
mm->map_count++;
vma->vm_mm = mm;

/* add the VMA to the mapping */
Expand Down Expand Up @@ -587,6 +586,7 @@ static void mas_add_vma_to_mm(struct ma_state *mas, struct mm_struct *mm,
BUG_ON(!vma->vm_region);

setup_vma_to_mm(vma, mm);
mm->map_count++;

/* add the VMA to the tree */
vma_mas_store(vma, mas);
Expand Down Expand Up @@ -1347,6 +1347,7 @@ int split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
if (vma->vm_file)
return -ENOMEM;

mm = vma->vm_mm;
if (mm->map_count >= sysctl_max_map_count)
return -ENOMEM;

Expand Down Expand Up @@ -1398,6 +1399,7 @@ int split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
mas_set_range(&mas, vma->vm_start, vma->vm_end - 1);
mas_store(&mas, vma);
vma_mas_store(new, &mas);
mm->map_count++;
return 0;

err_mas_preallocate:
Expand Down

0 comments on commit e733121

Please sign in to comment.