]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - mm/sparse-vmemmap.c
perf mmap: Discard legacy interfaces for mmap read forward
[linux.git] / mm / sparse-vmemmap.c
index 17acf01791fa832e1c8414cecc98034f2d652662..bd0276d5f66b17f6b6c78e503b91972c7677e599 100644 (file)
@@ -74,7 +74,7 @@ void * __meminit vmemmap_alloc_block(unsigned long size, int node)
 }
 
 /* need to make sure size is all the same during early stage */
-static void * __meminit alloc_block_buf(unsigned long size, int node)
+void * __meminit vmemmap_alloc_block_buf(unsigned long size, int node)
 {
        void *ptr;
 
@@ -107,33 +107,16 @@ static unsigned long __meminit vmem_altmap_nr_free(struct vmem_altmap *altmap)
 }
 
 /**
- * vmem_altmap_alloc - allocate pages from the vmem_altmap reservation
- * @altmap - reserved page pool for the allocation
- * @nr_pfns - size (in pages) of the allocation
+ * altmap_alloc_block_buf - allocate pages from the device page map
+ * @altmap:    device page map
+ * @size:      size (in bytes) of the allocation
  *
- * Allocations are aligned to the size of the request
+ * Allocations are aligned to the size of the request.
  */
-static unsigned long __meminit vmem_altmap_alloc(struct vmem_altmap *altmap,
-               unsigned long nr_pfns)
-{
-       unsigned long pfn = vmem_altmap_next_pfn(altmap);
-       unsigned long nr_align;
-
-       nr_align = 1UL << find_first_bit(&nr_pfns, BITS_PER_LONG);
-       nr_align = ALIGN(pfn, nr_align) - pfn;
-
-       if (nr_pfns + nr_align > vmem_altmap_nr_free(altmap))
-               return ULONG_MAX;
-       altmap->alloc += nr_pfns;
-       altmap->align += nr_align;
-       return pfn + nr_align;
-}
-
-static void * __meminit altmap_alloc_block_buf(unsigned long size,
+void * __meminit altmap_alloc_block_buf(unsigned long size,
                struct vmem_altmap *altmap)
 {
-       unsigned long pfn, nr_pfns;
-       void *ptr;
+       unsigned long pfn, nr_pfns, nr_align;
 
        if (size & ~PAGE_MASK) {
                pr_warn_once("%s: allocations must be multiple of PAGE_SIZE (%ld)\n",
@@ -141,25 +124,20 @@ static void * __meminit altmap_alloc_block_buf(unsigned long size,
                return NULL;
        }
 
+       pfn = vmem_altmap_next_pfn(altmap);
        nr_pfns = size >> PAGE_SHIFT;
-       pfn = vmem_altmap_alloc(altmap, nr_pfns);
-       if (pfn < ULONG_MAX)
-               ptr = __va(__pfn_to_phys(pfn));
-       else
-               ptr = NULL;
-       pr_debug("%s: pfn: %#lx alloc: %ld align: %ld nr: %#lx\n",
-                       __func__, pfn, altmap->alloc, altmap->align, nr_pfns);
+       nr_align = 1UL << find_first_bit(&nr_pfns, BITS_PER_LONG);
+       nr_align = ALIGN(pfn, nr_align) - pfn;
+       if (nr_pfns + nr_align > vmem_altmap_nr_free(altmap))
+               return NULL;
 
-       return ptr;
-}
+       altmap->alloc += nr_pfns;
+       altmap->align += nr_align;
+       pfn += nr_align;
 
-/* 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);
+       pr_debug("%s: pfn: %#lx alloc: %ld align: %ld nr: %#lx\n",
+                       __func__, pfn, altmap->alloc, altmap->align, nr_pfns);
+       return __va(__pfn_to_phys(pfn));
 }
 
 void __meminit vmemmap_verify(pte_t *pte, int node,
@@ -178,7 +156,7 @@ pte_t * __meminit vmemmap_pte_populate(pmd_t *pmd, unsigned long addr, int node)
        pte_t *pte = pte_offset_kernel(pmd, addr);
        if (pte_none(*pte)) {
                pte_t entry;
-               void *p = alloc_block_buf(PAGE_SIZE, node);
+               void *p = vmemmap_alloc_block_buf(PAGE_SIZE, node);
                if (!p)
                        return NULL;
                entry = pfn_pte(__pa(p) >> PAGE_SHIFT, PAGE_KERNEL);
@@ -278,7 +256,8 @@ int __meminit vmemmap_populate_basepages(unsigned long start,
        return 0;
 }
 
-struct page * __meminit sparse_mem_map_populate(unsigned long pnum, int nid)
+struct page * __meminit sparse_mem_map_populate(unsigned long pnum, int nid,
+               struct vmem_altmap *altmap)
 {
        unsigned long start;
        unsigned long end;
@@ -288,7 +267,7 @@ struct page * __meminit sparse_mem_map_populate(unsigned long pnum, int nid)
        start = (unsigned long)map;
        end = (unsigned long)(map + PAGES_PER_SECTION);
 
-       if (vmemmap_populate(start, end, nid))
+       if (vmemmap_populate(start, end, nid, altmap))
                return NULL;
 
        return map;
@@ -318,7 +297,7 @@ void __init sparse_mem_maps_populate_node(struct page **map_map,
                if (!present_section_nr(pnum))
                        continue;
 
-               map_map[pnum] = sparse_mem_map_populate(pnum, nodeid);
+               map_map[pnum] = sparse_mem_map_populate(pnum, nodeid, NULL);
                if (map_map[pnum])
                        continue;
                ms = __nr_to_section(pnum);