Skip to content

Commit

Permalink
x86: use core id bits for apicid_to_node initialization
Browse files Browse the repository at this point in the history
We shoud use core id bits instead of max cores, in case later with AMD
downcores Quad core Opteron.

[ tglx: arch/x86 adaptation ]

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: Len Brown <lenb@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
  • Loading branch information
Yinghai Lu authored and Ingo Molnar committed Jan 30, 2008
1 parent a860b63 commit 3f6e5a1
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions arch/x86/mm/k8topology_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,14 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
{
unsigned long prevbase;
struct bootnode nodes[8];
int nodeid, i, j, nb;
int nodeid, i, nb;
unsigned char nodeids[8];
int found = 0;
u32 reg;
unsigned numnodes;
unsigned num_cores;
unsigned cores;
unsigned bits;
int j;

if (!early_pci_allowed())
return -1;
Expand All @@ -60,9 +62,6 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)

printk(KERN_INFO "Scanning NUMA topology in Northbridge %d\n", nb);

num_cores = (cpuid_ecx(0x80000008) & 0xff) + 1;
printk(KERN_INFO "CPU has %d num_cores\n", num_cores);

reg = read_pci_config(0, nb, 0, 0x60);
numnodes = ((reg >> 4) & 0xF) + 1;
if (numnodes <= 1)
Expand Down Expand Up @@ -168,11 +167,15 @@ int __init k8_scan_nodes(unsigned long start, unsigned long end)
}
printk(KERN_INFO "Using node hash shift of %d\n", memnode_shift);

/* use the coreid bits from early_identify_cpu */
bits = boot_cpu_data.x86_coreid_bits;
cores = (1<<bits);

for (i = 0; i < 8; i++) {
if (nodes[i].start != nodes[i].end) {
nodeid = nodeids[i];
for (j = 0; j < num_cores; j++)
apicid_to_node[(nodeid * num_cores) + j] = i;
for (j = 0; j < cores; j++)
apicid_to_node[(nodeid << bits) + j] = i;
setup_node_bootmem(i, nodes[i].start, nodes[i].end);
}
}
Expand Down

0 comments on commit 3f6e5a1

Please sign in to comment.