Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 234815
b: refs/heads/master
c: 1411e0e
h: refs/heads/master
i:
  234813: d2f96d3
  234811: 512a781
  234807: 036213a
  234799: 3338018
  234783: abb49ff
  234751: 5f788bb
v: v3
  • Loading branch information
Yinghai Lu authored and H. Peter Anvin committed Dec 29, 2010
1 parent 5f2d245 commit be73b14
Show file tree
Hide file tree
Showing 8 changed files with 69 additions and 21 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: dbef7b56d2fc5115f26f72a0b080283bbf972cab
refs/heads/master: 1411e0ec3123ae4c4ead6bfc9fe3ee5a3ae5c327
2 changes: 2 additions & 0 deletions trunk/arch/x86/include/asm/page_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ static inline phys_addr_t get_max_mapped(void)
extern unsigned long init_memory_mapping(unsigned long start,
unsigned long end);

void init_memory_mapping_high(void);

extern void initmem_init(unsigned long start_pfn, unsigned long end_pfn,
int acpi, int k8);
extern void free_initmem(void);
Expand Down
8 changes: 0 additions & 8 deletions trunk/arch/x86/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -931,14 +931,6 @@ void __init setup_arch(char **cmdline_p)
max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT);
max_pfn_mapped = max_low_pfn_mapped;

#ifdef CONFIG_X86_64
if (max_pfn > max_low_pfn) {
max_pfn_mapped = init_memory_mapping(1UL<<32,
max_pfn<<PAGE_SHIFT);
/* can we preseve max_low_pfn ?*/
max_low_pfn = max_pfn;
}
#endif
memblock.current_limit = get_max_mapped();

/*
Expand Down
8 changes: 5 additions & 3 deletions trunk/arch/x86/mm/amdtopology_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,12 +221,14 @@ int __init amd_scan_nodes(void)
apicid_base = boot_cpu_physical_apicid;
}

for_each_node_mask(i, node_possible_map) {
int j;

for_each_node_mask(i, node_possible_map)
memblock_x86_register_active_regions(i,
nodes[i].start >> PAGE_SHIFT,
nodes[i].end >> PAGE_SHIFT);
init_memory_mapping_high();
for_each_node_mask(i, node_possible_map) {
int j;

for (j = apicid_base; j < cores + apicid_base; j++)
apicid_to_node[(i << bits) + j] = i;
setup_node_bootmem(i, nodes[i].start, nodes[i].end);
Expand Down
8 changes: 1 addition & 7 deletions trunk/arch/x86/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,10 @@ static void __init find_early_table_space(unsigned long end, int use_pse,
#ifdef CONFIG_X86_32
/* for fixmap */
tables += roundup(__end_of_fixed_addresses * sizeof(pte_t), PAGE_SIZE);
#endif

/*
* RED-PEN putting page tables only on node 0 could
* cause a hotspot and fill up ZONE_DMA. The page tables
* need roughly 0.5KB per GB.
*/
#ifdef CONFIG_X86_32
good_end = max_pfn_mapped << PAGE_SHIFT;
#endif

base = memblock_find_in_range(start, good_end, tables, PAGE_SIZE);
if (base == MEMBLOCK_ERROR)
panic("Cannot find space for the kernel page tables");
Expand Down
54 changes: 54 additions & 0 deletions trunk/arch/x86/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -607,9 +607,63 @@ void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,
int acpi, int k8)
{
memblock_x86_register_active_regions(0, start_pfn, end_pfn);
init_memory_mapping_high();
}
#endif

struct mapping_work_data {
unsigned long start;
unsigned long end;
unsigned long pfn_mapped;
};

static int __init_refok
mapping_work_fn(unsigned long start_pfn, unsigned long end_pfn, void *datax)
{
struct mapping_work_data *data = datax;
unsigned long pfn_mapped;
unsigned long final_start, final_end;

final_start = max_t(unsigned long, start_pfn<<PAGE_SHIFT, data->start);
final_end = min_t(unsigned long, end_pfn<<PAGE_SHIFT, data->end);

if (final_end <= final_start)
return 0;

pfn_mapped = init_memory_mapping(final_start, final_end);

if (pfn_mapped > data->pfn_mapped)
data->pfn_mapped = pfn_mapped;

return 0;
}

static unsigned long __init_refok
init_memory_mapping_active_regions(unsigned long start, unsigned long end)
{
struct mapping_work_data data;

data.start = start;
data.end = end;
data.pfn_mapped = 0;

work_with_active_regions(MAX_NUMNODES, mapping_work_fn, &data);

return data.pfn_mapped;
}

void __init_refok init_memory_mapping_high(void)
{
if (max_pfn > max_low_pfn) {
max_pfn_mapped = init_memory_mapping_active_regions(1UL<<32,
max_pfn<<PAGE_SHIFT);
/* can we preserve max_low_pfn ? */
max_low_pfn = max_pfn;

memblock.current_limit = get_max_mapped();
}
}

void __init paging_init(void)
{
unsigned long max_zone_pfns[MAX_NR_ZONES];
Expand Down
6 changes: 4 additions & 2 deletions trunk/arch/x86/mm/numa_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -590,11 +590,12 @@ static int __init numa_emulation(unsigned long start_pfn,
* the e820 memory map.
*/
remove_all_active_ranges();
for_each_node_mask(i, node_possible_map) {
for_each_node_mask(i, node_possible_map)
memblock_x86_register_active_regions(i, nodes[i].start >> PAGE_SHIFT,
nodes[i].end >> PAGE_SHIFT);
init_memory_mapping_high();
for_each_node_mask(i, node_possible_map)
setup_node_bootmem(i, nodes[i].start, nodes[i].end);
}
acpi_fake_nodes(nodes, num_nodes);
numa_init_array();
return 0;
Expand Down Expand Up @@ -645,6 +646,7 @@ void __init initmem_init(unsigned long start_pfn, unsigned long last_pfn,
for (i = 0; i < nr_cpu_ids; i++)
numa_set_node(i, 0);
memblock_x86_register_active_regions(0, start_pfn, last_pfn);
init_memory_mapping_high();
setup_node_bootmem(0, start_pfn << PAGE_SHIFT, last_pfn << PAGE_SHIFT);
}

Expand Down
2 changes: 2 additions & 0 deletions trunk/arch/x86/mm/srat_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,8 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end)
return -1;
}

init_memory_mapping_high();

/* Account for nodes with cpus and no memory */
nodes_or(node_possible_map, nodes_parsed, cpu_nodes_parsed);

Expand Down

0 comments on commit be73b14

Please sign in to comment.