memblock/powerpc: Use new accessors

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
Benjamin Herrenschmidt 2010-08-04 13:43:53 +10:00
parent 08b8479881
commit 28be7072ce
3 changed files with 45 additions and 70 deletions

View file

@ -588,7 +588,7 @@ static void __init htab_initialize(void)
unsigned long pteg_count; unsigned long pteg_count;
unsigned long prot; unsigned long prot;
unsigned long base = 0, size = 0, limit; unsigned long base = 0, size = 0, limit;
int i; struct memblock_region *reg;
DBG(" -> htab_initialize()\n"); DBG(" -> htab_initialize()\n");
@ -659,9 +659,9 @@ static void __init htab_initialize(void)
*/ */
/* create bolted the linear mapping in the hash table */ /* create bolted the linear mapping in the hash table */
for (i=0; i < memblock.memory.cnt; i++) { for_each_memblock(memory, reg) {
base = (unsigned long)__va(memblock.memory.regions[i].base); base = (unsigned long)__va(reg->base);
size = memblock.memory.region[i].size; size = reg->size;
DBG("creating mapping for region: %lx..%lx (prot: %lx)\n", DBG("creating mapping for region: %lx..%lx (prot: %lx)\n",
base, size, prot); base, size, prot);

View file

@ -82,18 +82,11 @@ int page_is_ram(unsigned long pfn)
return pfn < max_pfn; return pfn < max_pfn;
#else #else
unsigned long paddr = (pfn << PAGE_SHIFT); unsigned long paddr = (pfn << PAGE_SHIFT);
int i; struct memblock_region *reg;
for (i=0; i < memblock.memory.cnt; i++) {
unsigned long base;
base = memblock.memory.regions[i].base; for_each_memblock(memory, reg)
if (paddr >= reg->base && paddr < (reg->base + reg->size))
if ((paddr >= base) &&
(paddr < (base + memblock.memory.regions[i].size))) {
return 1; return 1;
}
}
return 0; return 0;
#endif #endif
} }
@ -149,23 +142,19 @@ int
walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
void *arg, int (*func)(unsigned long, unsigned long, void *)) void *arg, int (*func)(unsigned long, unsigned long, void *))
{ {
struct memblock_region res; struct memblock_region *reg;
unsigned long pfn, len; unsigned long end_pfn = start_pfn + nr_pages;
u64 end; unsigned long tstart, tend;
int ret = -1; int ret = -1;
res.base = (u64) start_pfn << PAGE_SHIFT; for_each_memblock(memory, reg) {
res.size = (u64) nr_pages << PAGE_SHIFT; tstart = max(start_pfn, memblock_region_base_pfn(reg));
tend = min(end_pfn, memblock_region_end_pfn(reg));
end = res.base + res.size - 1; if (tstart >= tend)
while ((res.base < end) && (memblock_find(&res) >= 0)) { continue;
pfn = (unsigned long)(res.base >> PAGE_SHIFT); ret = (*func)(tstart, tend - tstart, arg);
len = (unsigned long)(res.size >> PAGE_SHIFT);
ret = (*func)(pfn, len, arg);
if (ret) if (ret)
break; break;
res.base += (res.size + 1);
res.size = (end - res.base + 1);
} }
return ret; return ret;
} }
@ -179,9 +168,9 @@ EXPORT_SYMBOL_GPL(walk_system_ram_range);
#ifndef CONFIG_NEED_MULTIPLE_NODES #ifndef CONFIG_NEED_MULTIPLE_NODES
void __init do_init_bootmem(void) void __init do_init_bootmem(void)
{ {
unsigned long i;
unsigned long start, bootmap_pages; unsigned long start, bootmap_pages;
unsigned long total_pages; unsigned long total_pages;
struct memblock_region *reg;
int boot_mapsize; int boot_mapsize;
max_low_pfn = max_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT; max_low_pfn = max_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT;
@ -204,10 +193,10 @@ void __init do_init_bootmem(void)
boot_mapsize = init_bootmem_node(NODE_DATA(0), start >> PAGE_SHIFT, min_low_pfn, max_low_pfn); boot_mapsize = init_bootmem_node(NODE_DATA(0), start >> PAGE_SHIFT, min_low_pfn, max_low_pfn);
/* Add active regions with valid PFNs */ /* Add active regions with valid PFNs */
for (i = 0; i < memblock.memory.cnt; i++) { for_each_memblock(memory, reg) {
unsigned long start_pfn, end_pfn; unsigned long start_pfn, end_pfn;
start_pfn = memblock.memory.regions[i].base >> PAGE_SHIFT; start_pfn = memblock_region_base_pfn(reg);
end_pfn = start_pfn + memblock_size_pages(&memblock.memory, i); end_pfn = memblock_region_end_pfn(reg);
add_active_range(0, start_pfn, end_pfn); add_active_range(0, start_pfn, end_pfn);
} }
@ -218,29 +207,21 @@ void __init do_init_bootmem(void)
free_bootmem_with_active_regions(0, lowmem_end_addr >> PAGE_SHIFT); free_bootmem_with_active_regions(0, lowmem_end_addr >> PAGE_SHIFT);
/* reserve the sections we're already using */ /* reserve the sections we're already using */
for (i = 0; i < memblock.reserved.cnt; i++) { for_each_memblock(reserved, reg) {
unsigned long addr = memblock.reserved.regions[i].base + unsigned long top = reg->base + reg->size - 1;
memblock_size_bytes(&memblock.reserved, i) - 1; if (top < lowmem_end_addr)
if (addr < lowmem_end_addr) reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT);
reserve_bootmem(memblock.reserved.regions[i].base, else if (reg->base < lowmem_end_addr) {
memblock_size_bytes(&memblock.reserved, i), unsigned long trunc_size = lowmem_end_addr - reg->base;
BOOTMEM_DEFAULT); reserve_bootmem(reg->base, trunc_size, BOOTMEM_DEFAULT);
else if (memblock.reserved.regions[i].base < lowmem_end_addr) {
unsigned long adjusted_size = lowmem_end_addr -
memblock.reserved.regions[i].base;
reserve_bootmem(memblock.reserved.regions[i].base,
adjusted_size, BOOTMEM_DEFAULT);
} }
} }
#else #else
free_bootmem_with_active_regions(0, max_pfn); free_bootmem_with_active_regions(0, max_pfn);
/* reserve the sections we're already using */ /* reserve the sections we're already using */
for (i = 0; i < memblock.reserved.cnt; i++) for_each_memblock(reserved, reg)
reserve_bootmem(memblock.reserved.regions[i].base, reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT);
memblock_size_bytes(&memblock.reserved, i),
BOOTMEM_DEFAULT);
#endif #endif
/* XXX need to clip this if using highmem? */ /* XXX need to clip this if using highmem? */
sparse_memory_present_with_active_regions(0); sparse_memory_present_with_active_regions(0);
@ -251,22 +232,15 @@ void __init do_init_bootmem(void)
/* mark pages that don't exist as nosave */ /* mark pages that don't exist as nosave */
static int __init mark_nonram_nosave(void) static int __init mark_nonram_nosave(void)
{ {
unsigned long memblock_next_region_start_pfn, struct memblock_region *reg, *prev = NULL;
memblock_region_max_pfn;
int i;
for (i = 0; i < memblock.memory.cnt - 1; i++) { for_each_memblock(memory, reg) {
memblock_region_max_pfn = if (prev &&
(memblock.memory.regions[i].base >> PAGE_SHIFT) + memblock_region_end_pfn(prev) < memblock_region_base_pfn(reg))
(memblock.memory.regions[i].size >> PAGE_SHIFT); register_nosave_region(memblock_region_end_pfn(prev),
memblock_next_region_start_pfn = memblock_region_base_pfn(reg));
memblock.memory.regions[i+1].base >> PAGE_SHIFT; prev = reg;
if (memblock_region_max_pfn < memblock_next_region_start_pfn)
register_nosave_region(memblock_region_max_pfn,
memblock_next_region_start_pfn);
} }
return 0; return 0;
} }

View file

@ -746,16 +746,17 @@ static void __init setup_nonnuma(void)
unsigned long top_of_ram = memblock_end_of_DRAM(); unsigned long top_of_ram = memblock_end_of_DRAM();
unsigned long total_ram = memblock_phys_mem_size(); unsigned long total_ram = memblock_phys_mem_size();
unsigned long start_pfn, end_pfn; unsigned long start_pfn, end_pfn;
unsigned int i, nid = 0; unsigned int nid = 0;
struct memblock_region *reg;
printk(KERN_DEBUG "Top of RAM: 0x%lx, Total RAM: 0x%lx\n", printk(KERN_DEBUG "Top of RAM: 0x%lx, Total RAM: 0x%lx\n",
top_of_ram, total_ram); top_of_ram, total_ram);
printk(KERN_DEBUG "Memory hole size: %ldMB\n", printk(KERN_DEBUG "Memory hole size: %ldMB\n",
(top_of_ram - total_ram) >> 20); (top_of_ram - total_ram) >> 20);
for (i = 0; i < memblock.memory.cnt; ++i) { for_each_memblock(memory, reg) {
start_pfn = memblock.memory.region[i].base >> PAGE_SHIFT; start_pfn = memblock_region_base_pfn(reg);
end_pfn = start_pfn + memblock_size_pages(&memblock.memory, i); end_pfn = memblock_region_end_pfn(reg);
fake_numa_create_new_node(end_pfn, &nid); fake_numa_create_new_node(end_pfn, &nid);
add_active_range(nid, start_pfn, end_pfn); add_active_range(nid, start_pfn, end_pfn);
@ -891,11 +892,11 @@ static struct notifier_block __cpuinitdata ppc64_numa_nb = {
static void mark_reserved_regions_for_nid(int nid) static void mark_reserved_regions_for_nid(int nid)
{ {
struct pglist_data *node = NODE_DATA(nid); struct pglist_data *node = NODE_DATA(nid);
int i; struct memblock_region *reg;
for (i = 0; i < memblock.reserved.cnt; i++) { for_each_memblock(reserved, reg) {
unsigned long physbase = memblock.reserved.region[i].base; unsigned long physbase = reg->base;
unsigned long size = memblock.reserved.region[i].size; unsigned long size = reg->size;
unsigned long start_pfn = physbase >> PAGE_SHIFT; unsigned long start_pfn = physbase >> PAGE_SHIFT;
unsigned long end_pfn = PFN_UP(physbase + size); unsigned long end_pfn = PFN_UP(physbase + size);
struct node_active_region node_ar; struct node_active_region node_ar;