Merge branch 'core-memblock-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-memblock-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (74 commits) x86-64: Only set max_pfn_mapped to 512 MiB if we enter via head_64.S xen: Cope with unmapped pages when initializing kernel pagetable memblock, bootmem: Round pfn properly for memory and reserved regions memblock: Annotate memblock functions with __init_memblock memblock: Allow memblock_init to be called early memblock/arm: Fix memblock_region_is_memory() typo x86, memblock: Remove __memblock_x86_find_in_range_size() memblock: Fix wraparound in find_region() x86-32, memblock: Make add_highpages honor early reserved ranges x86, memblock: Fix crashkernel allocation arm, memblock: Fix the sparsemem build memblock: Fix section mismatch warnings powerpc, memblock: Fix memblock API change fallout memblock, microblaze: Fix memblock API change fallout x86: Remove old bootmem code x86, memblock: Use memblock_memory_size()/memblock_free_memory_size() to get correct dma_reserve x86: Remove not used early_res code x86, memblock: Replace e820_/_early string with memblock_ x86: Use memblock to replace early_res x86, memblock: Use memblock_debug to control debug message print out ... Fix up trivial conflicts in arch/x86/kernel/setup.c and kernel/Makefile
This commit is contained in:
@ -25,6 +25,7 @@
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/poison.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/memory_hotplug.h>
|
||||
#include <linux/initrd.h>
|
||||
@ -422,49 +423,28 @@ static void __init add_one_highpage_init(struct page *page)
|
||||
totalhigh_pages++;
|
||||
}
|
||||
|
||||
struct add_highpages_data {
|
||||
unsigned long start_pfn;
|
||||
unsigned long end_pfn;
|
||||
};
|
||||
|
||||
static int __init add_highpages_work_fn(unsigned long start_pfn,
|
||||
unsigned long end_pfn, void *datax)
|
||||
void __init add_highpages_with_active_regions(int nid,
|
||||
unsigned long start_pfn, unsigned long end_pfn)
|
||||
{
|
||||
int node_pfn;
|
||||
struct page *page;
|
||||
unsigned long final_start_pfn, final_end_pfn;
|
||||
struct add_highpages_data *data;
|
||||
struct range *range;
|
||||
int nr_range;
|
||||
int i;
|
||||
|
||||
data = (struct add_highpages_data *)datax;
|
||||
nr_range = __get_free_all_memory_range(&range, nid, start_pfn, end_pfn);
|
||||
|
||||
final_start_pfn = max(start_pfn, data->start_pfn);
|
||||
final_end_pfn = min(end_pfn, data->end_pfn);
|
||||
if (final_start_pfn >= final_end_pfn)
|
||||
return 0;
|
||||
for (i = 0; i < nr_range; i++) {
|
||||
struct page *page;
|
||||
int node_pfn;
|
||||
|
||||
for (node_pfn = final_start_pfn; node_pfn < final_end_pfn;
|
||||
node_pfn++) {
|
||||
if (!pfn_valid(node_pfn))
|
||||
continue;
|
||||
page = pfn_to_page(node_pfn);
|
||||
add_one_highpage_init(page);
|
||||
for (node_pfn = range[i].start; node_pfn < range[i].end;
|
||||
node_pfn++) {
|
||||
if (!pfn_valid(node_pfn))
|
||||
continue;
|
||||
page = pfn_to_page(node_pfn);
|
||||
add_one_highpage_init(page);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
void __init add_highpages_with_active_regions(int nid, unsigned long start_pfn,
|
||||
unsigned long end_pfn)
|
||||
{
|
||||
struct add_highpages_data data;
|
||||
|
||||
data.start_pfn = start_pfn;
|
||||
data.end_pfn = end_pfn;
|
||||
|
||||
work_with_active_regions(nid, add_highpages_work_fn, &data);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void permanent_kmaps_init(pgd_t *pgd_base)
|
||||
{
|
||||
@ -712,14 +692,14 @@ void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,
|
||||
highstart_pfn = highend_pfn = max_pfn;
|
||||
if (max_pfn > max_low_pfn)
|
||||
highstart_pfn = max_low_pfn;
|
||||
e820_register_active_regions(0, 0, highend_pfn);
|
||||
memblock_x86_register_active_regions(0, 0, highend_pfn);
|
||||
sparse_memory_present_with_active_regions(0);
|
||||
printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
|
||||
pages_to_mb(highend_pfn - highstart_pfn));
|
||||
num_physpages = highend_pfn;
|
||||
high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
|
||||
#else
|
||||
e820_register_active_regions(0, 0, max_low_pfn);
|
||||
memblock_x86_register_active_regions(0, 0, max_low_pfn);
|
||||
sparse_memory_present_with_active_regions(0);
|
||||
num_physpages = max_low_pfn;
|
||||
high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1;
|
||||
@ -750,68 +730,12 @@ static void __init zone_sizes_init(void)
|
||||
free_area_init_nodes(max_zone_pfns);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_NO_BOOTMEM
|
||||
static unsigned long __init setup_node_bootmem(int nodeid,
|
||||
unsigned long start_pfn,
|
||||
unsigned long end_pfn,
|
||||
unsigned long bootmap)
|
||||
{
|
||||
unsigned long bootmap_size;
|
||||
|
||||
/* don't touch min_low_pfn */
|
||||
bootmap_size = init_bootmem_node(NODE_DATA(nodeid),
|
||||
bootmap >> PAGE_SHIFT,
|
||||
start_pfn, end_pfn);
|
||||
printk(KERN_INFO " node %d low ram: %08lx - %08lx\n",
|
||||
nodeid, start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT);
|
||||
printk(KERN_INFO " node %d bootmap %08lx - %08lx\n",
|
||||
nodeid, bootmap, bootmap + bootmap_size);
|
||||
free_bootmem_with_active_regions(nodeid, end_pfn);
|
||||
|
||||
return bootmap + bootmap_size;
|
||||
}
|
||||
#endif
|
||||
|
||||
void __init setup_bootmem_allocator(void)
|
||||
{
|
||||
#ifndef CONFIG_NO_BOOTMEM
|
||||
int nodeid;
|
||||
unsigned long bootmap_size, bootmap;
|
||||
/*
|
||||
* Initialize the boot-time allocator (with low memory only):
|
||||
*/
|
||||
bootmap_size = bootmem_bootmap_pages(max_low_pfn)<<PAGE_SHIFT;
|
||||
bootmap = find_e820_area(0, max_pfn_mapped<<PAGE_SHIFT, bootmap_size,
|
||||
PAGE_SIZE);
|
||||
if (bootmap == -1L)
|
||||
panic("Cannot find bootmem map of size %ld\n", bootmap_size);
|
||||
reserve_early(bootmap, bootmap + bootmap_size, "BOOTMAP");
|
||||
#endif
|
||||
|
||||
printk(KERN_INFO " mapped low ram: 0 - %08lx\n",
|
||||
max_pfn_mapped<<PAGE_SHIFT);
|
||||
printk(KERN_INFO " low ram: 0 - %08lx\n", max_low_pfn<<PAGE_SHIFT);
|
||||
|
||||
#ifndef CONFIG_NO_BOOTMEM
|
||||
for_each_online_node(nodeid) {
|
||||
unsigned long start_pfn, end_pfn;
|
||||
|
||||
#ifdef CONFIG_NEED_MULTIPLE_NODES
|
||||
start_pfn = node_start_pfn[nodeid];
|
||||
end_pfn = node_end_pfn[nodeid];
|
||||
if (start_pfn > max_low_pfn)
|
||||
continue;
|
||||
if (end_pfn > max_low_pfn)
|
||||
end_pfn = max_low_pfn;
|
||||
#else
|
||||
start_pfn = 0;
|
||||
end_pfn = max_low_pfn;
|
||||
#endif
|
||||
bootmap = setup_node_bootmem(nodeid, start_pfn, end_pfn,
|
||||
bootmap);
|
||||
}
|
||||
#endif
|
||||
|
||||
after_bootmem = 1;
|
||||
}
|
||||
|
||||
@ -1070,8 +994,3 @@ void mark_rodata_ro(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
int __init reserve_bootmem_generic(unsigned long phys, unsigned long len,
|
||||
int flags)
|
||||
{
|
||||
return reserve_bootmem(phys, len, flags);
|
||||
}
|
||||
|
Reference in New Issue
Block a user