mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-13 15:36:44 +07:00
mm: pass the vmem_altmap to vmemmap_populate
We can just pass this on instead of having to do a radix tree lookup without proper locking a few levels into the callchain. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
parent
24e6d5a59a
commit
7b73d978a5
@ -654,12 +654,14 @@ int kern_addr_valid(unsigned long addr)
|
|||||||
}
|
}
|
||||||
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||||
#if !ARM64_SWAPPER_USES_SECTION_MAPS
|
#if !ARM64_SWAPPER_USES_SECTION_MAPS
|
||||||
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
|
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
return vmemmap_populate_basepages(start, end, node);
|
return vmemmap_populate_basepages(start, end, node);
|
||||||
}
|
}
|
||||||
#else /* !ARM64_SWAPPER_USES_SECTION_MAPS */
|
#else /* !ARM64_SWAPPER_USES_SECTION_MAPS */
|
||||||
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
|
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
unsigned long addr = start;
|
unsigned long addr = start;
|
||||||
unsigned long next;
|
unsigned long next;
|
||||||
|
@ -754,7 +754,8 @@ void arch_refresh_nodedata(int update_node, pg_data_t *update_pgdat)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||||
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
|
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
return vmemmap_populate_basepages(start, end, node);
|
return vmemmap_populate_basepages(start, end, node);
|
||||||
}
|
}
|
||||||
|
@ -183,7 +183,8 @@ static __meminit void vmemmap_list_populate(unsigned long phys,
|
|||||||
vmemmap_list = vmem_back;
|
vmemmap_list = vmem_back;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int 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;
|
unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift;
|
||||||
|
|
||||||
@ -193,16 +194,12 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
|
|||||||
pr_debug("vmemmap_populate %lx..%lx, node %d\n", start, end, node);
|
pr_debug("vmemmap_populate %lx..%lx, node %d\n", start, end, node);
|
||||||
|
|
||||||
for (; start < end; start += page_size) {
|
for (; start < end; start += page_size) {
|
||||||
struct vmem_altmap *altmap;
|
|
||||||
void *p;
|
void *p;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (vmemmap_populated(start, page_size))
|
if (vmemmap_populated(start, page_size))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* altmap lookups only work at section boundaries */
|
|
||||||
altmap = to_vmem_altmap(SECTION_ALIGN_DOWN(start));
|
|
||||||
|
|
||||||
p = __vmemmap_alloc_block_buf(page_size, node, altmap);
|
p = __vmemmap_alloc_block_buf(page_size, node, altmap);
|
||||||
if (!p)
|
if (!p)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -211,7 +211,8 @@ static void vmem_remove_range(unsigned long start, unsigned long size)
|
|||||||
/*
|
/*
|
||||||
* Add a backed mem_map array to the virtual mem_map array.
|
* Add a backed mem_map array to the virtual mem_map array.
|
||||||
*/
|
*/
|
||||||
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
|
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
unsigned long pgt_prot, sgt_prot;
|
unsigned long pgt_prot, sgt_prot;
|
||||||
unsigned long address = start;
|
unsigned long address = start;
|
||||||
|
@ -2628,7 +2628,7 @@ EXPORT_SYMBOL(_PAGE_CACHE);
|
|||||||
|
|
||||||
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||||
int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
|
int __meminit vmemmap_populate(unsigned long vstart, unsigned long vend,
|
||||||
int node)
|
int node, struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
unsigned long pte_base;
|
unsigned long pte_base;
|
||||||
|
|
||||||
|
@ -1411,9 +1411,9 @@ static int __meminit vmemmap_populate_hugepages(unsigned long start,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)
|
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
struct vmem_altmap *altmap = to_vmem_altmap(start);
|
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (boot_cpu_has(X86_FEATURE_PSE))
|
if (boot_cpu_has(X86_FEATURE_PSE))
|
||||||
|
@ -327,7 +327,8 @@ extern void move_pfn_range_to_zone(struct zone *zone, unsigned long start_pfn,
|
|||||||
extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
|
extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages);
|
||||||
extern bool is_memblock_offlined(struct memory_block *mem);
|
extern bool is_memblock_offlined(struct memory_block *mem);
|
||||||
extern void remove_memory(int nid, u64 start, u64 size);
|
extern void remove_memory(int nid, u64 start, u64 size);
|
||||||
extern int sparse_add_one_section(struct pglist_data *pgdat, unsigned long start_pfn);
|
extern int sparse_add_one_section(struct pglist_data *pgdat,
|
||||||
|
unsigned long start_pfn, struct vmem_altmap *altmap);
|
||||||
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms,
|
extern void sparse_remove_one_section(struct zone *zone, struct mem_section *ms,
|
||||||
unsigned long map_offset);
|
unsigned long map_offset);
|
||||||
extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map,
|
extern struct page *sparse_decode_mem_map(unsigned long coded_mem_map,
|
||||||
|
@ -2538,7 +2538,8 @@ void sparse_mem_maps_populate_node(struct page **map_map,
|
|||||||
unsigned long map_count,
|
unsigned long map_count,
|
||||||
int nodeid);
|
int nodeid);
|
||||||
|
|
||||||
struct page *sparse_mem_map_populate(unsigned long pnum, int nid);
|
struct page *sparse_mem_map_populate(unsigned long pnum, int nid,
|
||||||
|
struct vmem_altmap *altmap);
|
||||||
pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);
|
pgd_t *vmemmap_pgd_populate(unsigned long addr, int node);
|
||||||
p4d_t *vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node);
|
p4d_t *vmemmap_p4d_populate(pgd_t *pgd, unsigned long addr, int node);
|
||||||
pud_t *vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node);
|
pud_t *vmemmap_pud_populate(p4d_t *p4d, unsigned long addr, int node);
|
||||||
@ -2556,7 +2557,8 @@ static inline void *vmemmap_alloc_block_buf(unsigned long size, int node)
|
|||||||
void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
|
void vmemmap_verify(pte_t *, int, unsigned long, unsigned long);
|
||||||
int vmemmap_populate_basepages(unsigned long start, unsigned long end,
|
int vmemmap_populate_basepages(unsigned long start, unsigned long end,
|
||||||
int node);
|
int node);
|
||||||
int vmemmap_populate(unsigned long start, unsigned long end, int node);
|
int vmemmap_populate(unsigned long start, unsigned long end, int node,
|
||||||
|
struct vmem_altmap *altmap);
|
||||||
void vmemmap_populate_print_last(void);
|
void vmemmap_populate_print_last(void);
|
||||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||||
void vmemmap_free(unsigned long start, unsigned long end);
|
void vmemmap_free(unsigned long start, unsigned long end);
|
||||||
|
@ -250,7 +250,7 @@ void __init register_page_bootmem_info_node(struct pglist_data *pgdat)
|
|||||||
#endif /* CONFIG_HAVE_BOOTMEM_INFO_NODE */
|
#endif /* CONFIG_HAVE_BOOTMEM_INFO_NODE */
|
||||||
|
|
||||||
static int __meminit __add_section(int nid, unsigned long phys_start_pfn,
|
static int __meminit __add_section(int nid, unsigned long phys_start_pfn,
|
||||||
bool want_memblock)
|
struct vmem_altmap *altmap, bool want_memblock)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int i;
|
int i;
|
||||||
@ -258,7 +258,7 @@ static int __meminit __add_section(int nid, unsigned long phys_start_pfn,
|
|||||||
if (pfn_valid(phys_start_pfn))
|
if (pfn_valid(phys_start_pfn))
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
|
|
||||||
ret = sparse_add_one_section(NODE_DATA(nid), phys_start_pfn);
|
ret = sparse_add_one_section(NODE_DATA(nid), phys_start_pfn, altmap);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@ -317,7 +317,8 @@ int __ref __add_pages(int nid, unsigned long phys_start_pfn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = start_sec; i <= end_sec; i++) {
|
for (i = start_sec; i <= end_sec; i++) {
|
||||||
err = __add_section(nid, section_nr_to_pfn(i), want_memblock);
|
err = __add_section(nid, section_nr_to_pfn(i), altmap,
|
||||||
|
want_memblock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* EEXIST is finally dealt with by ioresource collision
|
* EEXIST is finally dealt with by ioresource collision
|
||||||
|
@ -278,7 +278,8 @@ int __meminit vmemmap_populate_basepages(unsigned long start,
|
|||||||
return 0;
|
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 start;
|
||||||
unsigned long end;
|
unsigned long end;
|
||||||
@ -288,7 +289,7 @@ struct page * __meminit sparse_mem_map_populate(unsigned long pnum, int nid)
|
|||||||
start = (unsigned long)map;
|
start = (unsigned long)map;
|
||||||
end = (unsigned long)(map + PAGES_PER_SECTION);
|
end = (unsigned long)(map + PAGES_PER_SECTION);
|
||||||
|
|
||||||
if (vmemmap_populate(start, end, nid))
|
if (vmemmap_populate(start, end, nid, altmap))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
@ -318,7 +319,7 @@ void __init sparse_mem_maps_populate_node(struct page **map_map,
|
|||||||
if (!present_section_nr(pnum))
|
if (!present_section_nr(pnum))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
map_map[pnum] = sparse_mem_map_populate(pnum, nodeid);
|
map_map[pnum] = sparse_mem_map_populate(pnum, nodeid, NULL);
|
||||||
if (map_map[pnum])
|
if (map_map[pnum])
|
||||||
continue;
|
continue;
|
||||||
ms = __nr_to_section(pnum);
|
ms = __nr_to_section(pnum);
|
||||||
|
20
mm/sparse.c
20
mm/sparse.c
@ -417,7 +417,8 @@ static void __init sparse_early_usemaps_alloc_node(void *data,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_SPARSEMEM_VMEMMAP
|
#ifndef CONFIG_SPARSEMEM_VMEMMAP
|
||||||
struct page __init *sparse_mem_map_populate(unsigned long pnum, int nid)
|
struct page __init *sparse_mem_map_populate(unsigned long pnum, int nid,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
struct page *map;
|
struct page *map;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
@ -472,7 +473,7 @@ void __init sparse_mem_maps_populate_node(struct page **map_map,
|
|||||||
|
|
||||||
if (!present_section_nr(pnum))
|
if (!present_section_nr(pnum))
|
||||||
continue;
|
continue;
|
||||||
map_map[pnum] = sparse_mem_map_populate(pnum, nodeid);
|
map_map[pnum] = sparse_mem_map_populate(pnum, nodeid, NULL);
|
||||||
if (map_map[pnum])
|
if (map_map[pnum])
|
||||||
continue;
|
continue;
|
||||||
ms = __nr_to_section(pnum);
|
ms = __nr_to_section(pnum);
|
||||||
@ -500,7 +501,7 @@ static struct page __init *sparse_early_mem_map_alloc(unsigned long pnum)
|
|||||||
struct mem_section *ms = __nr_to_section(pnum);
|
struct mem_section *ms = __nr_to_section(pnum);
|
||||||
int nid = sparse_early_nid(ms);
|
int nid = sparse_early_nid(ms);
|
||||||
|
|
||||||
map = sparse_mem_map_populate(pnum, nid);
|
map = sparse_mem_map_populate(pnum, nid, NULL);
|
||||||
if (map)
|
if (map)
|
||||||
return map;
|
return map;
|
||||||
|
|
||||||
@ -678,10 +679,11 @@ void offline_mem_sections(unsigned long start_pfn, unsigned long end_pfn)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||||
static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid)
|
static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
/* This will make the necessary allocations eventually. */
|
/* This will make the necessary allocations eventually. */
|
||||||
return sparse_mem_map_populate(pnum, nid);
|
return sparse_mem_map_populate(pnum, nid, altmap);
|
||||||
}
|
}
|
||||||
static void __kfree_section_memmap(struct page *memmap)
|
static void __kfree_section_memmap(struct page *memmap)
|
||||||
{
|
{
|
||||||
@ -721,7 +723,8 @@ static struct page *__kmalloc_section_memmap(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid)
|
static inline struct page *kmalloc_section_memmap(unsigned long pnum, int nid,
|
||||||
|
struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
return __kmalloc_section_memmap();
|
return __kmalloc_section_memmap();
|
||||||
}
|
}
|
||||||
@ -773,7 +776,8 @@ static void free_map_bootmem(struct page *memmap)
|
|||||||
* set. If this is <=0, then that means that the passed-in
|
* set. If this is <=0, then that means that the passed-in
|
||||||
* map was not consumed and must be freed.
|
* map was not consumed and must be freed.
|
||||||
*/
|
*/
|
||||||
int __meminit sparse_add_one_section(struct pglist_data *pgdat, unsigned long start_pfn)
|
int __meminit sparse_add_one_section(struct pglist_data *pgdat,
|
||||||
|
unsigned long start_pfn, struct vmem_altmap *altmap)
|
||||||
{
|
{
|
||||||
unsigned long section_nr = pfn_to_section_nr(start_pfn);
|
unsigned long section_nr = pfn_to_section_nr(start_pfn);
|
||||||
struct mem_section *ms;
|
struct mem_section *ms;
|
||||||
@ -789,7 +793,7 @@ int __meminit sparse_add_one_section(struct pglist_data *pgdat, unsigned long st
|
|||||||
ret = sparse_index_init(section_nr, pgdat->node_id);
|
ret = sparse_index_init(section_nr, pgdat->node_id);
|
||||||
if (ret < 0 && ret != -EEXIST)
|
if (ret < 0 && ret != -EEXIST)
|
||||||
return ret;
|
return ret;
|
||||||
memmap = kmalloc_section_memmap(section_nr, pgdat->node_id);
|
memmap = kmalloc_section_memmap(section_nr, pgdat->node_id, altmap);
|
||||||
if (!memmap)
|
if (!memmap)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
usemap = __kmalloc_section_usemap();
|
usemap = __kmalloc_section_usemap();
|
||||||
|
Loading…
Reference in New Issue
Block a user