Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
[platform/kernel/linux-starfive.git] / arch / arm64 / mm / mmu.c
index d386033..14c87e8 100644 (file)
@@ -814,53 +814,6 @@ void __init paging_init(void)
        create_idmap();
 }
 
-/*
- * Check whether a kernel address is valid (derived from arch/x86/).
- */
-int kern_addr_valid(unsigned long addr)
-{
-       pgd_t *pgdp;
-       p4d_t *p4dp;
-       pud_t *pudp, pud;
-       pmd_t *pmdp, pmd;
-       pte_t *ptep, pte;
-
-       addr = arch_kasan_reset_tag(addr);
-       if ((((long)addr) >> VA_BITS) != -1UL)
-               return 0;
-
-       pgdp = pgd_offset_k(addr);
-       if (pgd_none(READ_ONCE(*pgdp)))
-               return 0;
-
-       p4dp = p4d_offset(pgdp, addr);
-       if (p4d_none(READ_ONCE(*p4dp)))
-               return 0;
-
-       pudp = pud_offset(p4dp, addr);
-       pud = READ_ONCE(*pudp);
-       if (pud_none(pud))
-               return 0;
-
-       if (pud_sect(pud))
-               return pfn_valid(pud_pfn(pud));
-
-       pmdp = pmd_offset(pudp, addr);
-       pmd = READ_ONCE(*pmdp);
-       if (pmd_none(pmd))
-               return 0;
-
-       if (pmd_sect(pmd))
-               return pfn_valid(pmd_pfn(pmd));
-
-       ptep = pte_offset_kernel(pmdp, addr);
-       pte = READ_ONCE(*ptep);
-       if (pte_none(pte))
-               return 0;
-
-       return pfn_valid(pte_pfn(pte));
-}
-
 #ifdef CONFIG_MEMORY_HOTPLUG
 static void free_hotplug_page_range(struct page *page, size_t size,
                                    struct vmem_altmap *altmap)
@@ -1184,53 +1137,28 @@ static void free_empty_tables(unsigned long addr, unsigned long end,
 }
 #endif
 
+void __meminit vmemmap_set_pmd(pmd_t *pmdp, void *p, int node,
+                              unsigned long addr, unsigned long next)
+{
+       pmd_set_huge(pmdp, __pa(p), __pgprot(PROT_SECT_NORMAL));
+}
+
+int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node,
+                               unsigned long addr, unsigned long next)
+{
+       vmemmap_verify((pte_t *)pmdp, node, addr, next);
+       return 1;
+}
+
 int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
                struct vmem_altmap *altmap)
 {
-       unsigned long addr = start;
-       unsigned long next;
-       pgd_t *pgdp;
-       p4d_t *p4dp;
-       pud_t *pudp;
-       pmd_t *pmdp;
-
        WARN_ON((start < VMEMMAP_START) || (end > VMEMMAP_END));
 
        if (!IS_ENABLED(CONFIG_ARM64_4K_PAGES))
                return vmemmap_populate_basepages(start, end, node, altmap);
-
-       do {
-               next = pmd_addr_end(addr, end);
-
-               pgdp = vmemmap_pgd_populate(addr, node);
-               if (!pgdp)
-                       return -ENOMEM;
-
-               p4dp = vmemmap_p4d_populate(pgdp, addr, node);
-               if (!p4dp)
-                       return -ENOMEM;
-
-               pudp = vmemmap_pud_populate(p4dp, addr, node);
-               if (!pudp)
-                       return -ENOMEM;
-
-               pmdp = pmd_offset(pudp, addr);
-               if (pmd_none(READ_ONCE(*pmdp))) {
-                       void *p = NULL;
-
-                       p = vmemmap_alloc_block_buf(PMD_SIZE, node, altmap);
-                       if (!p) {
-                               if (vmemmap_populate_basepages(addr, next, node, altmap))
-                                       return -ENOMEM;
-                               continue;
-                       }
-
-                       pmd_set_huge(pmdp, __pa(p), __pgprot(PROT_SECT_NORMAL));
-               } else
-                       vmemmap_verify((pte_t *)pmdp, node, addr, next);
-       } while (addr = next, addr != end);
-
-       return 0;
+       else
+               return vmemmap_populate_hugepages(start, end, node, altmap);
 }
 
 #ifdef CONFIG_MEMORY_HOTPLUG