static void unmap_single_vma(struct mmu_gather *tlb,
                struct vm_area_struct *vma, unsigned long start_addr,
-               unsigned long end_addr, unsigned long *nr_accounted,
+               unsigned long end_addr,
                struct zap_details *details)
 {
        unsigned long start = max(vma->vm_start, start_addr);
        if (end <= vma->vm_start)
                return;
 
-       if (vma->vm_flags & VM_ACCOUNT)
-               *nr_accounted += (end - start) >> PAGE_SHIFT;
-
        if (unlikely(is_pfn_mapping(vma)))
                untrack_pfn_vma(vma, 0, 0);
 
  * @vma: the starting vma
  * @start_addr: virtual address at which to start unmapping
  * @end_addr: virtual address at which to end unmapping
- * @nr_accounted: Place number of unmapped pages in vm-accountable vma's here
  *
  * Unmap all pages in the vma list.
  *
  */
 void unmap_vmas(struct mmu_gather *tlb,
                struct vm_area_struct *vma, unsigned long start_addr,
-               unsigned long end_addr, unsigned long *nr_accounted)
+               unsigned long end_addr)
 {
        struct mm_struct *mm = vma->vm_mm;
 
        mmu_notifier_invalidate_range_start(mm, start_addr, end_addr);
        for ( ; vma && vma->vm_start < end_addr; vma = vma->vm_next)
-               unmap_single_vma(tlb, vma, start_addr, end_addr, nr_accounted, NULL);
+               unmap_single_vma(tlb, vma, start_addr, end_addr, NULL);
        mmu_notifier_invalidate_range_end(mm, start_addr, end_addr);
 }
 
        struct mm_struct *mm = vma->vm_mm;
        struct mmu_gather tlb;
        unsigned long end = start + size;
-       unsigned long nr_accounted = 0;
 
        lru_add_drain();
        tlb_gather_mmu(&tlb, mm, 0);
        update_hiwater_rss(mm);
        mmu_notifier_invalidate_range_start(mm, start, end);
        for ( ; vma && vma->vm_start < end; vma = vma->vm_next)
-               unmap_single_vma(&tlb, vma, start, end, &nr_accounted, details);
+               unmap_single_vma(&tlb, vma, start, end, details);
        mmu_notifier_invalidate_range_end(mm, start, end);
        tlb_finish_mmu(&tlb, start, end);
 }
        struct mm_struct *mm = vma->vm_mm;
        struct mmu_gather tlb;
        unsigned long end = address + size;
-       unsigned long nr_accounted = 0;
 
        lru_add_drain();
        tlb_gather_mmu(&tlb, mm, 0);
        update_hiwater_rss(mm);
        mmu_notifier_invalidate_range_start(mm, address, end);
-       unmap_single_vma(&tlb, vma, address, end, &nr_accounted, details);
+       unmap_single_vma(&tlb, vma, address, end, details);
        mmu_notifier_invalidate_range_end(mm, address, end);
        tlb_finish_mmu(&tlb, address, end);
 }
 
  */
 static void remove_vma_list(struct mm_struct *mm, struct vm_area_struct *vma)
 {
+       unsigned long nr_accounted = 0;
+
        /* Update high watermark before we lower total_vm */
        update_hiwater_vm(mm);
        do {
                long nrpages = vma_pages(vma);
 
+               if (vma->vm_flags & VM_ACCOUNT)
+                       nr_accounted += nrpages;
                mm->total_vm -= nrpages;
                vm_stat_account(mm, vma->vm_flags, vma->vm_file, -nrpages);
                vma = remove_vma(vma);
        } while (vma);
+       vm_unacct_memory(nr_accounted);
        validate_mm(mm);
 }
 
 {
        struct vm_area_struct *next = prev? prev->vm_next: mm->mmap;
        struct mmu_gather tlb;
-       unsigned long nr_accounted = 0;
 
        lru_add_drain();
        tlb_gather_mmu(&tlb, mm, 0);
        update_hiwater_rss(mm);
-       unmap_vmas(&tlb, vma, start, end, &nr_accounted);
-       vm_unacct_memory(nr_accounted);
+       unmap_vmas(&tlb, vma, start, end);
        free_pgtables(&tlb, vma, prev ? prev->vm_end : FIRST_USER_ADDRESS,
                                 next ? next->vm_start : 0);
        tlb_finish_mmu(&tlb, start, end);
        tlb_gather_mmu(&tlb, mm, 1);
        /* update_hiwater_rss(mm) here? but nobody should be looking */
        /* Use -1 here to ensure all VMAs in the mm are unmapped */
-       unmap_vmas(&tlb, vma, 0, -1, &nr_accounted);
-       vm_unacct_memory(nr_accounted);
+       unmap_vmas(&tlb, vma, 0, -1);
 
        free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, 0);
        tlb_finish_mmu(&tlb, 0, -1);
         * Walk the list again, actually closing and freeing it,
         * with preemption enabled, without holding any MM locks.
         */
-       while (vma)
+       while (vma) {
+               if (vma->vm_flags & VM_ACCOUNT)
+                       nr_accounted += vma_pages(vma);
                vma = remove_vma(vma);
+       }
+       vm_unacct_memory(nr_accounted);
 
        BUG_ON(mm->nr_ptes > (FIRST_USER_ADDRESS+PMD_SIZE-1)>>PMD_SHIFT);
 }