Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Kernel v2.4.13-ac8 /mm/mremap.c

Filename:/mm/mremap.c
Lines Added:17
Lines Deleted:45
Also changed in: (Previous) 2.4.13-ac7  2.4.13-ac6  2.4.13-ac5  2.4.13-ac4  2.4.13-ac3  2.4.13-ac1 
(Following) 2.4.18-pre3-ac1  2.4.18-pre3-ac2  2.4.18-pre7-ac1  2.4.18-pre7-ac2  2.4.18-pre7-ac3  2.4.18-pre9-ac1 

Location
[  2.4.13-ac8
  [  mm
     o  mremap.c

Patch

diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla/mm/mremap.c linux.ac/mm/mremap.c
--- linux.vanilla/mm/mremap.c   Fri Sep 21 04:31:26 2001
+++ linux.ac/mm/mremap.c   Wed Oct 10 01:48:38 2001
@@ -15,6 +15,11 @@
 
 extern int vm_enough_memory(long pages);
 
+/*
+ * Throughout all the following functions, mm->mmap_sem must be held for
+ * writing, and mm->page_table_lock must be held
+ */
+
 static inline pte_t *get_one_pte(struct mm_struct *mm, unsigned long addr)
 {
    pgd_t * pgd;
@@ -126,53 +131,19 @@
    unsigned long addr, unsigned long old_len, unsigned long new_len,
    unsigned long new_addr)
 {
-   struct mm_struct * mm = vma->vm_mm;
-   struct vm_area_struct * new_vma, * next, * prev;
-   int allocated_vma;
-
-   new_vma = NULL;
-   next = find_vma_prev(mm, new_addr, &prev);
-   if (next) {
-      if (prev && prev->vm_end == new_addr &&
-          can_vma_merge(prev, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-         spin_lock(&mm->page_table_lock);
-         prev->vm_end = new_addr + new_len;
-         spin_unlock(&mm->page_table_lock);
-         new_vma = prev;
-         if (next != prev->vm_next)
-            BUG();
-         if (prev->vm_end == next->vm_start && can_vma_merge(next, prev->vm_flags)) {
-            spin_lock(&mm->page_table_lock);
-            prev->vm_end = next->vm_end;
-            __vma_unlink(mm, next, prev);
-            spin_unlock(&mm->page_table_lock);
-
-            mm->map_count--;
-            kmem_cache_free(vm_area_cachep, next);
-         }
-      } else if (next->vm_start == new_addr + new_len &&
-            can_vma_merge(next, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-         spin_lock(&mm->page_table_lock);
-         next->vm_start = new_addr;
-         spin_unlock(&mm->page_table_lock);
-         new_vma = next;
-      }
-   } else {
-      prev = find_vma(mm, new_addr-1);
-      if (prev && prev->vm_end == new_addr &&
-          can_vma_merge(prev, vma->vm_flags) && !vma->vm_file && !(vma->vm_flags & VM_SHARED)) {
-         spin_lock(&mm->page_table_lock);
-         prev->vm_end = new_addr + new_len;
-         spin_unlock(&mm->page_table_lock);
-         new_vma = prev;
-      }
-   }
+   struct vm_area_struct * new_vma;
+   int allocated_vma = 0;
 
-   allocated_vma = 0;
-   if (!new_vma) {
+   /* First, check if we can merge a mapping. -ben */
+   new_vma = find_vma(current->mm, new_addr-1);
+   if (new_vma && !vma->vm_file && !(vma->vm_flags & VM_SHARED) &&
+       new_vma->vm_end == new_addr && !new_vma->vm_file && 
+      new_vma->vm_flags == vma->vm_flags) {
+      new_vma->vm_end = new_addr + new_len;
+   } else {
       new_vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
       if (!new_vma)
-         goto out;
+         goto no_mem;
       allocated_vma = 1;
    }
 
@@ -200,7 +171,8 @@
    }
    if (allocated_vma)
       kmem_cache_free(vm_area_cachep, new_vma);
- out:
+
+no_mem:
    return -ENOMEM;
 }
 


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.