/* need to make sure size is all the same during early stage */ void * __meminit __vmemmap_alloc_block_buf(unsigned long size, int node, struct vmem_altmap *altmap) { if (altmap) return altmap_alloc_block_buf(size, altmap); return alloc_block_buf(size, node); }
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node, struct vmem_altmap *altmap) { 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 %lx..%lx, node %d\n", start, end, node); for (; start < end; start += page_size) { void *p = NULL; int rc; if (vmemmap_populated(start, page_size)) continue; /* * Allocate from the altmap first if we have one. This may * fail due to alignment issues when using 16MB hugepages, so * fall back to system memory if the altmap allocation fail. */ if (altmap) p = altmap_alloc_block_buf(page_size, altmap); if (!p) p = vmemmap_alloc_block_buf(page_size, node); if (!p) return -ENOMEM; vmemmap_list_populate(__pa(p), start, node); pr_debug(" * %016lx..%016lx allocated at %p\n", start, start + page_size, p); rc = vmemmap_create_mapping(start, page_size, __pa(p)); if (rc < 0) { pr_warn("%s: Unable to create vmemmap mapping: %d\n", __func__, rc); return -EFAULT; } } return 0; }