mmap: remove the IA64-specific vma expansion implementation
[linux-2.6-microblaze.git] / mm / mmap.c
index 1971bff..e8470b6 100644 (file)
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -2207,42 +2207,7 @@ struct vm_area_struct *find_extend_vma_locked(struct mm_struct *mm, unsigned lon
 }
 #endif
 
-/*
- * IA64 has some horrid mapping rules: it can expand both up and down,
- * but with various special rules.
- *
- * We'll get rid of this architecture eventually, so the ugliness is
- * temporary.
- */
-#ifdef CONFIG_IA64
-static inline bool vma_expand_ok(struct vm_area_struct *vma, unsigned long addr)
-{
-       return REGION_NUMBER(addr) == REGION_NUMBER(vma->vm_start) &&
-               REGION_OFFSET(addr) < RGN_MAP_LIMIT;
-}
-
-/*
- * IA64 stacks grow down, but there's a special register backing store
- * that can grow up. Only sequentially, though, so the new address must
- * match vm_end.
- */
-static inline int vma_expand_up(struct vm_area_struct *vma, unsigned long addr)
-{
-       if (!vma_expand_ok(vma, addr))
-               return -EFAULT;
-       if (vma->vm_end != (addr & PAGE_MASK))
-               return -EFAULT;
-       return expand_upwards(vma, addr);
-}
-
-static inline bool vma_expand_down(struct vm_area_struct *vma, unsigned long addr)
-{
-       if (!vma_expand_ok(vma, addr))
-               return -EFAULT;
-       return expand_downwards(vma, addr);
-}
-
-#elif defined(CONFIG_STACK_GROWSUP)
+#if defined(CONFIG_STACK_GROWSUP)
 
 #define vma_expand_up(vma,addr) expand_upwards(vma, addr)
 #define vma_expand_down(vma, addr) (-EFAULT)
@@ -3294,10 +3259,11 @@ void exit_mmap(struct mm_struct *mm)
        arch_exit_mmap(mm);
 
        vma = mas_find(&mas, ULONG_MAX);
-       if (!vma) {
+       if (!vma || unlikely(xa_is_zero(vma))) {
                /* Can happen if dup_mmap() received an OOM */
                mmap_read_unlock(mm);
-               return;
+               mmap_write_lock(mm);
+               goto destroy;
        }
 
        lru_add_drain();
@@ -3332,11 +3298,13 @@ void exit_mmap(struct mm_struct *mm)
                remove_vma(vma, true);
                count++;
                cond_resched();
-       } while ((vma = mas_find(&mas, ULONG_MAX)) != NULL);
+               vma = mas_find(&mas, ULONG_MAX);
+       } while (vma && likely(!xa_is_zero(vma)));
 
        BUG_ON(count != mm->map_count);
 
        trace_exit_mmap(mm);
+destroy:
        __mt_destroy(&mm->mm_mt);
        mmap_write_unlock(mm);
        vm_unacct_memory(nr_accounted);