提交 625d693e 编写于 作者: D David S. Miller

sparc64: Convert over to NO_BOOTMEM.

With help from Sam Ravnborg.
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 8fe5f56c
...@@ -61,6 +61,7 @@ config SPARC64 ...@@ -61,6 +61,7 @@ config SPARC64
select IRQ_PREFLOW_FASTEOI select IRQ_PREFLOW_FASTEOI
select ARCH_HAVE_NMI_SAFE_CMPXCHG select ARCH_HAVE_NMI_SAFE_CMPXCHG
select HAVE_C_RECORDMCOUNT select HAVE_C_RECORDMCOUNT
select NO_BOOTMEM
config ARCH_DEFCONFIG config ARCH_DEFCONFIG
string string
......
...@@ -741,7 +741,6 @@ static void __init find_ramdisk(unsigned long phys_base) ...@@ -741,7 +741,6 @@ static void __init find_ramdisk(unsigned long phys_base)
struct node_mem_mask { struct node_mem_mask {
unsigned long mask; unsigned long mask;
unsigned long val; unsigned long val;
unsigned long bootmem_paddr;
}; };
static struct node_mem_mask node_masks[MAX_NUMNODES]; static struct node_mem_mask node_masks[MAX_NUMNODES];
static int num_node_masks; static int num_node_masks;
...@@ -820,7 +819,7 @@ static u64 memblock_nid_range(u64 start, u64 end, int *nid) ...@@ -820,7 +819,7 @@ static u64 memblock_nid_range(u64 start, u64 end, int *nid)
*/ */
static void __init allocate_node_data(int nid) static void __init allocate_node_data(int nid)
{ {
unsigned long paddr, num_pages, start_pfn, end_pfn; unsigned long paddr, start_pfn, end_pfn;
struct pglist_data *p; struct pglist_data *p;
#ifdef CONFIG_NEED_MULTIPLE_NODES #ifdef CONFIG_NEED_MULTIPLE_NODES
...@@ -832,7 +831,7 @@ static void __init allocate_node_data(int nid) ...@@ -832,7 +831,7 @@ static void __init allocate_node_data(int nid)
NODE_DATA(nid) = __va(paddr); NODE_DATA(nid) = __va(paddr);
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data)); memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
NODE_DATA(nid)->bdata = &bootmem_node_data[nid]; NODE_DATA(nid)->node_id = nid;
#endif #endif
p = NODE_DATA(nid); p = NODE_DATA(nid);
...@@ -840,18 +839,6 @@ static void __init allocate_node_data(int nid) ...@@ -840,18 +839,6 @@ static void __init allocate_node_data(int nid)
get_pfn_range_for_nid(nid, &start_pfn, &end_pfn); get_pfn_range_for_nid(nid, &start_pfn, &end_pfn);
p->node_start_pfn = start_pfn; p->node_start_pfn = start_pfn;
p->node_spanned_pages = end_pfn - start_pfn; p->node_spanned_pages = end_pfn - start_pfn;
if (p->node_spanned_pages) {
num_pages = bootmem_bootmap_pages(p->node_spanned_pages);
paddr = memblock_alloc_try_nid(num_pages << PAGE_SHIFT, PAGE_SIZE, nid);
if (!paddr) {
prom_printf("Cannot allocate bootmap for nid[%d]\n",
nid);
prom_halt();
}
node_masks[nid].bootmem_paddr = paddr;
}
} }
static void init_node_masks_nonnuma(void) static void init_node_masks_nonnuma(void)
...@@ -1292,75 +1279,9 @@ static void __init bootmem_init_nonnuma(void) ...@@ -1292,75 +1279,9 @@ static void __init bootmem_init_nonnuma(void)
node_set_online(0); node_set_online(0);
} }
static void __init reserve_range_in_node(int nid, unsigned long start,
unsigned long end)
{
numadbg(" reserve_range_in_node(nid[%d],start[%lx],end[%lx]\n",
nid, start, end);
while (start < end) {
unsigned long this_end;
int n;
this_end = memblock_nid_range(start, end, &n);
if (n == nid) {
numadbg(" MATCH reserving range [%lx:%lx]\n",
start, this_end);
reserve_bootmem_node(NODE_DATA(nid), start,
(this_end - start), BOOTMEM_DEFAULT);
} else
numadbg(" NO MATCH, advancing start to %lx\n",
this_end);
start = this_end;
}
}
static void __init trim_reserved_in_node(int nid)
{
struct memblock_region *reg;
numadbg(" trim_reserved_in_node(%d)\n", nid);
for_each_memblock(reserved, reg)
reserve_range_in_node(nid, reg->base, reg->base + reg->size);
}
static void __init bootmem_init_one_node(int nid)
{
struct pglist_data *p;
numadbg("bootmem_init_one_node(%d)\n", nid);
p = NODE_DATA(nid);
if (p->node_spanned_pages) {
unsigned long paddr = node_masks[nid].bootmem_paddr;
unsigned long end_pfn;
end_pfn = p->node_start_pfn + p->node_spanned_pages;
numadbg(" init_bootmem_node(%d, %lx, %lx, %lx)\n",
nid, paddr >> PAGE_SHIFT, p->node_start_pfn, end_pfn);
init_bootmem_node(p, paddr >> PAGE_SHIFT,
p->node_start_pfn, end_pfn);
numadbg(" free_bootmem_with_active_regions(%d, %lx)\n",
nid, end_pfn);
free_bootmem_with_active_regions(nid, end_pfn);
trim_reserved_in_node(nid);
numadbg(" sparse_memory_present_with_active_regions(%d)\n",
nid);
sparse_memory_present_with_active_regions(nid);
}
}
static unsigned long __init bootmem_init(unsigned long phys_base) static unsigned long __init bootmem_init(unsigned long phys_base)
{ {
unsigned long end_pfn; unsigned long end_pfn;
int nid;
end_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT; end_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT;
max_pfn = max_low_pfn = end_pfn; max_pfn = max_low_pfn = end_pfn;
...@@ -1369,11 +1290,12 @@ static unsigned long __init bootmem_init(unsigned long phys_base) ...@@ -1369,11 +1290,12 @@ static unsigned long __init bootmem_init(unsigned long phys_base)
if (bootmem_init_numa() < 0) if (bootmem_init_numa() < 0)
bootmem_init_nonnuma(); bootmem_init_nonnuma();
/* XXX cpu notifier XXX */ /* Dump memblock with node info. */
memblock_dump_all();
for_each_online_node(nid) /* XXX cpu notifier XXX */
bootmem_init_one_node(nid);
sparse_memory_present_with_active_regions(MAX_NUMNODES);
sparse_init(); sparse_init();
return end_pfn; return end_pfn;
...@@ -1973,6 +1895,7 @@ void __init mem_init(void) ...@@ -1973,6 +1895,7 @@ void __init mem_init(void)
free_all_bootmem_node(NODE_DATA(i)); free_all_bootmem_node(NODE_DATA(i));
} }
} }
totalram_pages += free_low_memory_core_early(MAX_NUMNODES);
} }
#else #else
totalram_pages = free_all_bootmem(); totalram_pages = free_all_bootmem();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册