unsigned long floor, unsigned long ceiling);
 void pmd_install(struct mm_struct *mm, pmd_t *pmd, pgtable_t *pte);
 
-static inline bool can_madv_lru_vma(struct vm_area_struct *vma)
-{
-       return !(vma->vm_flags & (VM_LOCKED|VM_HUGETLB|VM_PFNMAP));
-}
-
 struct zap_details;
 void unmap_page_range(struct mmu_gather *tlb,
                             struct vm_area_struct *vma,
 extern long faultin_vma_page_range(struct vm_area_struct *vma,
                                   unsigned long start, unsigned long end,
                                   bool write, int *locked);
-extern void munlock_vma_pages_range(struct vm_area_struct *vma,
-                       unsigned long start, unsigned long end);
-static inline void munlock_vma_pages_all(struct vm_area_struct *vma)
-{
-       munlock_vma_pages_range(vma, vma->vm_start, vma->vm_end);
-}
+extern int mlock_future_check(struct mm_struct *mm, unsigned long flags,
+                             unsigned long len);
 
 /*
  * must be called with vma's mmap_lock held for read or write, and page locked.
 extern void mlock_vma_page(struct page *page);
 extern void munlock_vma_page(struct page *page);
 
-extern int mlock_future_check(struct mm_struct *mm, unsigned long flags,
-                             unsigned long len);
-
 /*
  * Clear the page's PageMlocked().  This can be useful in a situation where
  * we want to unconditionally remove a page from the pagecache -- e.g.,
 
        tlb_end_vma(tlb, vma);
 }
 
+static inline bool can_madv_lru_vma(struct vm_area_struct *vma)
+{
+       return !(vma->vm_flags & (VM_LOCKED|VM_HUGETLB|VM_PFNMAP));
+}
+
 static long madvise_cold(struct vm_area_struct *vma,
                        struct vm_area_struct **prev,
                        unsigned long start_addr, unsigned long end_addr)
 
  * Returns with VM_LOCKED cleared.  Callers must be prepared to
  * deal with this.
  */
-void munlock_vma_pages_range(struct vm_area_struct *vma,
-                            unsigned long start, unsigned long end)
+static void munlock_vma_pages_range(struct vm_area_struct *vma,
+                                   unsigned long start, unsigned long end)
 {
        vma->vm_flags &= VM_LOCKED_CLEAR_MASK;
 
 
        vma->vm_prev = NULL;
        do {
                vma_rb_erase(vma, &mm->mm_rb);
+               if (vma->vm_flags & VM_LOCKED)
+                       mm->locked_vm -= vma_pages(vma);
                mm->map_count--;
                tail_vma = vma;
                vma = vma->vm_next;
        return __split_vma(mm, vma, addr, new_below);
 }
 
-static inline void
-unlock_range(struct vm_area_struct *start, unsigned long limit)
-{
-       struct mm_struct *mm = start->vm_mm;
-       struct vm_area_struct *tmp = start;
-
-       while (tmp && tmp->vm_start < limit) {
-               if (tmp->vm_flags & VM_LOCKED) {
-                       mm->locked_vm -= vma_pages(tmp);
-                       munlock_vma_pages_all(tmp);
-               }
-
-               tmp = tmp->vm_next;
-       }
-}
-
 /* Munmap is split into 2 main parts -- this part which finds
  * what needs doing, and the areas themselves, which do the
  * work.  This now handles partial unmappings.
                        return error;
        }
 
-       /*
-        * unlock any mlock()ed ranges before detaching vmas
-        */
-       if (mm->locked_vm)
-               unlock_range(vma, end);
-
        /* Detach vmas from rbtree */
        if (!detach_vmas_to_be_unmapped(mm, vma, prev, end))
                downgrade = false;
                 * Nothing can be holding mm->mmap_lock here and the above call
                 * to mmu_notifier_release(mm) ensures mmu notifier callbacks in
                 * __oom_reap_task_mm() will not block.
-                *
-                * This needs to be done before calling unlock_range(),
-                * which clears VM_LOCKED, otherwise the oom reaper cannot
-                * reliably test it.
                 */
                (void)__oom_reap_task_mm(mm);
-
                set_bit(MMF_OOM_SKIP, &mm->flags);
        }
 
        mmap_write_lock(mm);
-       if (mm->locked_vm)
-               unlock_range(mm->mmap, ULONG_MAX);
-
        arch_exit_mmap(mm);
 
        vma = mm->mmap;
 
        set_bit(MMF_UNSTABLE, &mm->flags);
 
        for (vma = mm->mmap ; vma; vma = vma->vm_next) {
-               if (!can_madv_lru_vma(vma))
+               if (vma->vm_flags & (VM_HUGETLB|VM_PFNMAP))
                        continue;
 
                /*