[PATCH] sparsemem memory model for i386
Provide the architecture specific implementation for SPARSEMEM for i386 SMP and NUMA systems. Signed-off-by: Andy Whitcroft <apw@shadowen.org> Signed-off-by: Dave Hansen <haveblue@us.ibm.com> Signed-off-by: Martin Bligh <mbligh@aracnet.com> Signed-off-by: Adrian Bunk <bunk@stusta.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
d41dee369b
commit
05b79bdcb4
@ -42,12 +42,16 @@ bootmem_data_t node0_bdata;
|
||||
* populated the following initialisation.
|
||||
*
|
||||
* 1) node_online_map - the map of all nodes configured (online) in the system
|
||||
* 2) physnode_map - the mapping between a pfn and owning node
|
||||
* 3) node_start_pfn - the starting page frame number for a node
|
||||
* 2) node_start_pfn - the starting page frame number for a node
|
||||
* 3) node_end_pfn - the ending page fram number for a node
|
||||
*/
|
||||
unsigned long node_start_pfn[MAX_NUMNODES];
|
||||
unsigned long node_end_pfn[MAX_NUMNODES];
|
||||
|
||||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
/*
|
||||
* 4) physnode_map - the mapping between a pfn and owning node
|
||||
* physnode_map keeps track of the physical memory layout of a generic
|
||||
* numa node on a 256Mb break (each element of the array will
|
||||
* represent 256Mb of memory and will be marked by the node id. so,
|
||||
@ -85,9 +89,7 @@ unsigned long node_memmap_size_bytes(int nid, unsigned long start_pfn,
|
||||
|
||||
return (nr_pages + 1) * sizeof(struct page);
|
||||
}
|
||||
|
||||
unsigned long node_start_pfn[MAX_NUMNODES];
|
||||
unsigned long node_end_pfn[MAX_NUMNODES];
|
||||
#endif
|
||||
|
||||
extern unsigned long find_max_low_pfn(void);
|
||||
extern void find_max_pfn(void);
|
||||
@ -390,24 +392,26 @@ void __init set_highmem_pages_init(int bad_ppro)
|
||||
{
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
struct zone *zone;
|
||||
struct page *page;
|
||||
|
||||
for_each_zone(zone) {
|
||||
unsigned long node_pfn, node_high_size, zone_start_pfn;
|
||||
struct page * zone_mem_map;
|
||||
|
||||
unsigned long node_pfn, zone_start_pfn, zone_end_pfn;
|
||||
|
||||
if (!is_highmem(zone))
|
||||
continue;
|
||||
|
||||
printk("Initializing %s for node %d\n", zone->name,
|
||||
zone->zone_pgdat->node_id);
|
||||
|
||||
node_high_size = zone->spanned_pages;
|
||||
zone_mem_map = zone->zone_mem_map;
|
||||
zone_start_pfn = zone->zone_start_pfn;
|
||||
zone_end_pfn = zone_start_pfn + zone->spanned_pages;
|
||||
|
||||
for (node_pfn = 0; node_pfn < node_high_size; node_pfn++) {
|
||||
one_highpage_init((struct page *)(zone_mem_map + node_pfn),
|
||||
zone_start_pfn + node_pfn, bad_ppro);
|
||||
printk("Initializing %s for node %d (%08lx:%08lx)\n",
|
||||
zone->name, zone->zone_pgdat->node_id,
|
||||
zone_start_pfn, zone_end_pfn);
|
||||
|
||||
for (node_pfn = zone_start_pfn; node_pfn < zone_end_pfn; node_pfn++) {
|
||||
if (!pfn_valid(node_pfn))
|
||||
continue;
|
||||
page = pfn_to_page(node_pfn);
|
||||
one_highpage_init(page, node_pfn, bad_ppro);
|
||||
}
|
||||
}
|
||||
totalram_pages += totalhigh_pages;
|
||||
|
Reference in New Issue
Block a user