}
 
 static unsigned long slice_find_area_bottomup(struct mm_struct *mm,
-                                             unsigned long len,
+                                             unsigned long addr, unsigned long len,
                                              const struct slice_mask *available,
                                              int psize, unsigned long high_limit)
 {
        int pshift = max_t(int, mmu_psize_defs[psize].shift, PAGE_SHIFT);
-       unsigned long addr, found, next_end;
+       unsigned long found, next_end;
        struct vm_unmapped_area_info info;
 
        info.flags = 0;
        info.length = len;
        info.align_mask = PAGE_MASK & ((1ul << pshift) - 1);
        info.align_offset = 0;
-
-       addr = TASK_UNMAPPED_BASE;
        /*
         * Check till the allow max value for this mmap request
         */
 }
 
 static unsigned long slice_find_area_topdown(struct mm_struct *mm,
-                                            unsigned long len,
+                                            unsigned long addr, unsigned long len,
                                             const struct slice_mask *available,
                                             int psize, unsigned long high_limit)
 {
        int pshift = max_t(int, mmu_psize_defs[psize].shift, PAGE_SHIFT);
-       unsigned long addr, found, prev;
+       unsigned long found, prev;
        struct vm_unmapped_area_info info;
        unsigned long min_addr = max(PAGE_SIZE, mmap_min_addr);
 
        info.length = len;
        info.align_mask = PAGE_MASK & ((1ul << pshift) - 1);
        info.align_offset = 0;
-
-       addr = mm->mmap_base;
        /*
         * If we are trying to allocate above DEFAULT_MAP_WINDOW
         * Add the different to the mmap_base.
         * can happen with large stack limits and large mmap()
         * allocations.
         */
-       return slice_find_area_bottomup(mm, len, available, psize, high_limit);
+       return slice_find_area_bottomup(mm, TASK_UNMAPPED_BASE, len, available, psize, high_limit);
 }
 
 
                                     int topdown, unsigned long high_limit)
 {
        if (topdown)
-               return slice_find_area_topdown(mm, len, mask, psize, high_limit);
+               return slice_find_area_topdown(mm, mm->mmap_base, len, mask, psize, high_limit);
        else
-               return slice_find_area_bottomup(mm, len, mask, psize, high_limit);
+               return slice_find_area_bottomup(mm, mm->mmap_base, len, mask, psize, high_limit);
 }
 
 static inline void slice_copy_mask(struct slice_mask *dst,