aboutsummaryrefslogtreecommitdiffstats
path: root/mm
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@gmail.com>2011-05-24 20:11:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2011-05-25 11:39:05 -0400
commitb951bf2c4693bfc9744e11293be859209f65f579 (patch)
tree05f0bce8e2c2cd9053d761b17abc8101aab30a3e /mm
parent6038def0d11b322019d0dbb43f2a611247dfbdb6 (diff)
mm: nommu: don't scan the vma list when deleting
Since commit 297c5eee3724 ("mm: make the vma list be doubly linked") made it a doubly linked list, we don't need to scan the list when deleting @vma. And the original code didn't update the prev pointer. Fix it too. Signed-off-by: Namhyung Kim <namhyung@gmail.com> Acked-by: Greg Ungerer <gerg@uclinux.org> Cc: David Howells <dhowells@redhat.com> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm')
-rw-r--r--mm/nommu.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/mm/nommu.c b/mm/nommu.c
index 0b16cb4c517b..2454d39dc068 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -746,7 +746,6 @@ static void add_vma_to_mm(struct mm_struct *mm, struct vm_area_struct *vma)
746 */ 746 */
747static void delete_vma_from_mm(struct vm_area_struct *vma) 747static void delete_vma_from_mm(struct vm_area_struct *vma)
748{ 748{
749 struct vm_area_struct **pp;
750 struct address_space *mapping; 749 struct address_space *mapping;
751 struct mm_struct *mm = vma->vm_mm; 750 struct mm_struct *mm = vma->vm_mm;
752 751
@@ -769,12 +768,14 @@ static void delete_vma_from_mm(struct vm_area_struct *vma)
769 768
770 /* remove from the MM's tree and list */ 769 /* remove from the MM's tree and list */
771 rb_erase(&vma->vm_rb, &mm->mm_rb); 770 rb_erase(&vma->vm_rb, &mm->mm_rb);
772 for (pp = &mm->mmap; *pp; pp = &(*pp)->vm_next) { 771
773 if (*pp == vma) { 772 if (vma->vm_prev)
774 *pp = vma->vm_next; 773 vma->vm_prev->vm_next = vma->vm_next;
775 break; 774 else
776 } 775 mm->mmap = vma->vm_next;
777 } 776
777 if (vma->vm_next)
778 vma->vm_next->vm_prev = vma->vm_prev;
778 779
779 vma->vm_mm = NULL; 780 vma->vm_mm = NULL;
780} 781}