}
 #ifdef CONFIG_SPARSEMEM_VMEMMAP
 #ifdef CONFIG_ARM64_64K_PAGES
-int __meminit vmemmap_populate(struct page *start_page,
-                              unsigned long size, int node)
+int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
 {
-       return vmemmap_populate_basepages(start_page, size, node);
+       return vmemmap_populate_basepages(start, end, node);
 }
 #else  /* !CONFIG_ARM64_64K_PAGES */
-int __meminit vmemmap_populate(struct page *start_page,
-                              unsigned long size, int node)
+int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
 {
-       unsigned long addr = (unsigned long)start_page;
-       unsigned long end = (unsigned long)(start_page + size);
+       unsigned long addr = start;
        unsigned long next;
        pgd_t *pgd;
        pud_t *pud;
        return 0;
 }
 #endif /* CONFIG_ARM64_64K_PAGES */
-void vmemmap_free(struct page *memmap, unsigned long nr_pages)
+void vmemmap_free(unsigned long start, unsigned long end)
 {
 }
 #endif /* CONFIG_SPARSEMEM_VMEMMAP */
 
 #endif
 
 #ifdef CONFIG_SPARSEMEM_VMEMMAP
-int __meminit vmemmap_populate(struct page *start_page,
-                                               unsigned long size, int node)
+int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
 {
-       return vmemmap_populate_basepages(start_page, size, node);
+       return vmemmap_populate_basepages(start, end, node);
 }
 
-void vmemmap_free(struct page *memmap, unsigned long nr_pages)
+void vmemmap_free(unsigned long start, unsigned long end)
 {
 }
 #endif
 
        vmemmap_list = vmem_back;
 }
 
-int __meminit vmemmap_populate(struct page *start_page,
-                              unsigned long nr_pages, int node)
+int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
 {
-       unsigned long start = (unsigned long)start_page;
-       unsigned long end = (unsigned long)(start_page + nr_pages);
        unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift;
 
        /* Align to the page size of the linear mapping. */
        start = _ALIGN_DOWN(start, page_size);
 
-       pr_debug("vmemmap_populate page %p, %ld pages, node %d\n",
-                start_page, nr_pages, node);
-       pr_debug(" -> map %lx..%lx\n", start, end);
+       pr_debug("vmemmap_populate %lx..%lx, node %d\n", start, end, node);
 
        for (; start < end; start += page_size) {
                void *p;
        return 0;
 }
 
-void vmemmap_free(struct page *memmap, unsigned long nr_pages)
+void vmemmap_free(unsigned long start, unsigned long end)
 {
 }
 
 
 /*
  * Add a backed mem_map array to the virtual mem_map array.
  */
-int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node)
+int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
 {
-       unsigned long address, start_addr, end_addr;
+       unsigned long address = start;
        pgd_t *pg_dir;
        pud_t *pu_dir;
        pmd_t *pm_dir;
        pte_t *pt_dir;
        int ret = -ENOMEM;
 
-       start_addr = (unsigned long) start;
-       end_addr = (unsigned long) (start + nr);
-
-       for (address = start_addr; address < end_addr;) {
+       for (address = start; address < end;) {
                pg_dir = pgd_offset_k(address);
                if (pgd_none(*pg_dir)) {
                        pu_dir = vmem_pud_alloc();
                }
                address += PAGE_SIZE;
        }
-       memset(start, 0, nr * sizeof(struct page));
+       memset((void *)start, 0, end - start);
        ret = 0;
 out:
-       flush_tlb_kernel_range(start_addr, end_addr);
+       flush_tlb_kernel_range(start, end);
        return ret;
 }
 
-void vmemmap_free(struct page *memmap, unsigned long nr_pages)
+void vmemmap_free(unsigned long start, unsigned long end)
 {
 }
 
 
 static long __meminitdata addr_start, addr_end;
 static int __meminitdata node_start;
 
-int __meminit vmemmap_populate(struct page *start, unsigned long nr, int node)
+int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
+                              int node)
 {
-       unsigned long vstart = (unsigned long) start;
-       unsigned long vend = (unsigned long) (start + nr);
        unsigned long phys_start = (vstart - VMEMMAP_BASE);
        unsigned long phys_end = (vend - VMEMMAP_BASE);
        unsigned long addr = phys_start & VMEMMAP_CHUNK_MASK;
        }
 }
 
-void vmemmap_free(struct page *memmap, unsigned long nr_pages)
+void vmemmap_free(unsigned long start, unsigned long end)
 {
 }
 
 
        flush_tlb_all();
 }
 
-void __ref vmemmap_free(struct page *memmap, unsigned long nr_pages)
+void __ref vmemmap_free(unsigned long start, unsigned long end)
 {
-       unsigned long start = (unsigned long)memmap;
-       unsigned long end = (unsigned long)(memmap + nr_pages);
-
        remove_pagetable(start, end, false);
 }
 
 static void __meminitdata *p_start, *p_end;
 static int __meminitdata node_start;
 
-int __meminit
-vmemmap_populate(struct page *start_page, unsigned long size, int node)
+int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
 {
-       unsigned long addr = (unsigned long)start_page;
-       unsigned long end = (unsigned long)(start_page + size);
+       unsigned long addr;
        unsigned long next;
        pgd_t *pgd;
        pud_t *pud;
        pmd_t *pmd;
 
-       for (; addr < end; addr = next) {
+       for (addr = start; addr < end; addr = next) {
                void *p = NULL;
 
                pgd = vmemmap_pgd_populate(addr, node);
                }
 
        }
-       sync_global_pgds((unsigned long)start_page, end - 1);
+       sync_global_pgds(start, end - 1);
        return 0;
 }
 
 
 void *vmemmap_alloc_block(unsigned long size, int node);
 void *vmemmap_alloc_block_buf(unsigned long size, int node);
 void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
-int vmemmap_populate_basepages(struct page *start_page,
-                                               unsigned long pages, int node);
-int vmemmap_populate(struct page *start_page, unsigned long pages, int node);
+int vmemmap_populate_basepages(unsigned long start, unsigned long end,
+                              int node);
+int vmemmap_populate(unsigned long start, unsigned long end, int node);
 void vmemmap_populate_print_last(void);
 #ifdef CONFIG_MEMORY_HOTPLUG
-void vmemmap_free(struct page *memmap, unsigned long nr_pages);
+void vmemmap_free(unsigned long start, unsigned long end);
 #endif
 void register_page_bootmem_memmap(unsigned long section_nr, struct page *map,
                                  unsigned long size);
 
        return pgd;
 }
 
-int __meminit vmemmap_populate_basepages(struct page *start_page,
-                                               unsigned long size, int node)
+int __meminit vmemmap_populate_basepages(unsigned long start,
+                                        unsigned long end, int node)
 {
-       unsigned long addr = (unsigned long)start_page;
-       unsigned long end = (unsigned long)(start_page + size);
+       unsigned long addr = start;
        pgd_t *pgd;
        pud_t *pud;
        pmd_t *pmd;
 
 struct page * __meminit sparse_mem_map_populate(unsigned long pnum, int nid)
 {
-       struct page *map = pfn_to_page(pnum * PAGES_PER_SECTION);
-       int error = vmemmap_populate(map, PAGES_PER_SECTION, nid);
-       if (error)
+       unsigned long start;
+       unsigned long end;
+       struct page *map;
+
+       map = pfn_to_page(pnum * PAGES_PER_SECTION);
+       start = (unsigned long)map;
+       end = (unsigned long)(map + PAGES_PER_SECTION);
+
+       if (vmemmap_populate(start, end, nid))
                return NULL;
 
        return map;
 
 }
 static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages)
 {
-       vmemmap_free(memmap, nr_pages);
+       unsigned long start = (unsigned long)memmap;
+       unsigned long end = (unsigned long)(memmap + nr_pages);
+
+       vmemmap_free(start, end);
 }
 static void free_map_bootmem(struct page *memmap, unsigned long nr_pages)
 {
-       vmemmap_free(memmap, nr_pages);
+       unsigned long start = (unsigned long)memmap;
+       unsigned long end = (unsigned long)(memmap + nr_pages);
+
+       vmemmap_free(start, end);
 }
 #else
 static struct page *__kmalloc_section_memmap(unsigned long nr_pages)