Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 173032
b: refs/heads/master
c: 8ee2deb
h: refs/heads/master
v: v3
  • Loading branch information
David Rientjes authored and Ingo Molnar committed Oct 12, 2009
1 parent 0c2127b commit 1f09d64
Show file tree
Hide file tree
Showing 9 changed files with 63 additions and 25 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: 1af5ba514f0c2f2e2af965a4ffa5e8ab269271b9
refs/heads/master: 8ee2debce32412118cf8c239e0026ace56ea1425
4 changes: 3 additions & 1 deletion trunk/arch/x86/include/asm/k8.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ extern struct pci_dev **k8_northbridges;
extern int num_k8_northbridges;
extern int cache_k8_northbridges(void);
extern void k8_flush_garts(void);
extern int k8_scan_nodes(unsigned long start, unsigned long end);
extern int k8_get_nodes(struct bootnode *nodes);
extern int k8_numa_init(unsigned long start_pfn, unsigned long end_pfn);
extern int k8_scan_nodes(void);

#ifdef CONFIG_K8_NB
static inline struct pci_dev *node_to_k8_nb_misc(int node)
Expand Down
3 changes: 2 additions & 1 deletion trunk/arch/x86/include/asm/page_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ extern unsigned long max_pfn_mapped;
extern unsigned long init_memory_mapping(unsigned long start,
unsigned long end);

extern void initmem_init(unsigned long start_pfn, unsigned long end_pfn);
extern void initmem_init(unsigned long start_pfn, unsigned long end_pfn,
int acpi, int k8);
extern void free_initmem(void);

#endif /* !__ASSEMBLY__ */
Expand Down
10 changes: 9 additions & 1 deletion trunk/arch/x86/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@
#include <asm/percpu.h>
#include <asm/topology.h>
#include <asm/apicdef.h>
#include <asm/k8.h>
#ifdef CONFIG_X86_64
#include <asm/numa_64.h>
#endif
Expand Down Expand Up @@ -691,6 +692,9 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {

void __init setup_arch(char **cmdline_p)
{
int acpi = 0;
int k8 = 0;

#ifdef CONFIG_X86_32
memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
visws_early_detect();
Expand Down Expand Up @@ -937,7 +941,11 @@ void __init setup_arch(char **cmdline_p)
acpi_numa_init();
#endif

initmem_init(0, max_pfn);
#ifdef CONFIG_K8_NUMA
k8 = !k8_numa_init(0, max_pfn);
#endif

initmem_init(0, max_pfn, acpi, k8);

#ifdef CONFIG_ACPI_SLEEP
/*
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/x86/mm/init_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -703,8 +703,8 @@ void __init find_low_pfn_range(void)
}

#ifndef CONFIG_NEED_MULTIPLE_NODES
void __init initmem_init(unsigned long start_pfn,
unsigned long end_pfn)
void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,
int acpi, int k8)
{
#ifdef CONFIG_HIGHMEM
highstart_pfn = highend_pfn = max_pfn;
Expand Down
3 changes: 2 additions & 1 deletion trunk/arch/x86/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -568,7 +568,8 @@ kernel_physical_mapping_init(unsigned long start,
}

#ifndef CONFIG_NUMA
void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn)
void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,
int acpi, int k8)
{
unsigned long bootmap_size, bootmap;

Expand Down
52 changes: 39 additions & 13 deletions trunk/arch/x86/mm/k8topology_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@
#include <asm/apic.h>
#include <asm/k8.h>

static struct bootnode __initdata nodes[8];
static nodemask_t __initdata nodes_parsed = NODE_MASK_NONE;

static __init int find_northbridge(void)
{
int num;
Expand Down Expand Up @@ -76,12 +79,26 @@ static __init void early_get_boot_cpu_id(void)
early_init_lapic_mapping();
}

int __init k8_scan_nodes(unsigned long start, unsigned long end)
int __init k8_get_nodes(struct bootnode *physnodes)
{
unsigned numnodes, cores, bits, apicid_base;
int i;
int ret = 0;

for_each_node_mask(i, nodes_parsed) {
physnodes[ret].start = nodes[i].start;
physnodes[ret].end = nodes[i].end;
ret++;
}
return ret;
}

int __init k8_numa_init(unsigned long start_pfn, unsigned long end_pfn)
{
unsigned long start = PFN_PHYS(start_pfn);
unsigned long end = PFN_PHYS(end_pfn);
unsigned numnodes;
unsigned long prevbase;
struct bootnode nodes[8];
int i, j, nb, found = 0;
int i, nb, found = 0;
u32 nodeid, reg;

if (!early_pci_allowed())
Expand All @@ -98,9 +115,8 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
if (numnodes <= 1)
return -1;

pr_info("Number of nodes %d\n", numnodes);
pr_info("Number of physical nodes %d\n", numnodes);

memset(&nodes, 0, sizeof(nodes));
prevbase = 0;
for (i = 0; i < 8; i++) {
unsigned long base, limit;
Expand Down Expand Up @@ -130,7 +146,7 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
nodeid, (base >> 8) & 3, (limit >> 8) & 3);
return -1;
}
if (node_isset(nodeid, node_possible_map)) {
if (node_isset(nodeid, nodes_parsed)) {
pr_info("Node %d already present, skipping\n",
nodeid);
continue;
Expand All @@ -141,8 +157,8 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
limit |= (1<<24)-1;
limit++;

if (limit > max_pfn << PAGE_SHIFT)
limit = max_pfn << PAGE_SHIFT;
if (limit > end)
limit = end;
if (limit <= base)
continue;

Expand Down Expand Up @@ -180,12 +196,23 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)

prevbase = base;

node_set(nodeid, node_possible_map);
node_set(nodeid, nodes_parsed);
}

if (!found)
return -1;
return 0;
}

int __init k8_scan_nodes(void)
{
unsigned int bits;
unsigned int cores;
unsigned int apicid_base;
int i;

BUG_ON(nodes_empty(nodes_parsed));
node_possible_map = nodes_parsed;
memnode_shift = compute_hash_shift(nodes, 8, NULL);
if (memnode_shift < 0) {
pr_err("No NUMA node hash function found. Contact maintainer\n");
Expand All @@ -204,9 +231,8 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
apicid_base = boot_cpu_physical_apicid;
}

for (i = 0; i < 8; i++) {
if (nodes[i].start == nodes[i].end)
continue;
for_each_node_mask(i, node_possible_map) {
int j;

e820_register_active_regions(i,
nodes[i].start >> PAGE_SHIFT,
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/x86/mm/numa_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -347,8 +347,8 @@ static void init_remap_allocator(int nid)
(ulong) node_remap_end_vaddr[nid]);
}

void __init initmem_init(unsigned long start_pfn,
unsigned long end_pfn)
void __init initmem_init(unsigned long start_pfn, unsigned long end_pfn,
int acpi, int k8)
{
int nid;
long kva_target_pfn;
Expand Down
6 changes: 3 additions & 3 deletions trunk/arch/x86/mm/numa_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,8 @@ static int __init numa_emulation(unsigned long start_pfn, unsigned long last_pfn
}
#endif /* CONFIG_NUMA_EMU */

void __init initmem_init(unsigned long start_pfn, unsigned long last_pfn)
void __init initmem_init(unsigned long start_pfn, unsigned long last_pfn,
int acpi, int k8)
{
int i;

Expand All @@ -547,8 +548,7 @@ void __init initmem_init(unsigned long start_pfn, unsigned long last_pfn)
#endif

#ifdef CONFIG_K8_NUMA
if (!numa_off && !k8_scan_nodes(start_pfn<<PAGE_SHIFT,
last_pfn<<PAGE_SHIFT))
if (!numa_off && k8 && !k8_scan_nodes())
return;
nodes_clear(node_possible_map);
nodes_clear(node_online_map);
Expand Down

0 comments on commit 1f09d64

Please sign in to comment.