diff options
| author | Jack Steiner <steiner@sgi.com> | 2009-03-30 09:01:11 -0500 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-04-03 19:49:58 +0200 | 
| commit | 6a891a24e4d0056c365a90ff2d71c38fd366b0d0 (patch) | |
| tree | 1aba8d7f336ce83aab9611e4411401716c02a92b | |
| parent | 1a544e659cbfce178395e9a090a47d1907d0cfa8 (diff) | |
x86, UV: Fix for nodes with memory and no cpus
Fix initialization of UV blade information for systems that have
nodes with memory but no cpus.
Signed-off-by: Jack Steiner <steiner@sgi.com>
LKML-Reference: <20090330140111.GA18461@sgi.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | arch/x86/kernel/apic/x2apic_uv_x.c | 16 | 
1 files changed, 14 insertions, 2 deletions
| diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c index 1248318436e8..de1a50af807b 100644 --- a/arch/x86/kernel/apic/x2apic_uv_x.c +++ b/arch/x86/kernel/apic/x2apic_uv_x.c @@ -549,7 +549,8 @@ void __init uv_system_init(void)  	unsigned long gnode_upper, lowmem_redir_base, lowmem_redir_size;  	int bytes, nid, cpu, lcpu, pnode, blade, i, j, m_val, n_val;  	int max_pnode = 0; -	unsigned long mmr_base, present; +	unsigned long mmr_base, present, paddr; +	unsigned short pnode_mask;  	map_low_mmrs(); @@ -592,6 +593,7 @@ void __init uv_system_init(void)  		}  	} +	pnode_mask = (1 << n_val) - 1;  	node_id.v = uv_read_local_mmr(UVH_NODE_ID);  	gnode_upper = (((unsigned long)node_id.s.node_id) &  		       ~((1 << n_val) - 1)) << m_val; @@ -615,7 +617,7 @@ void __init uv_system_init(void)  		uv_cpu_hub_info(cpu)->numa_blade_id = blade;  		uv_cpu_hub_info(cpu)->blade_processor_id = lcpu;  		uv_cpu_hub_info(cpu)->pnode = pnode; -		uv_cpu_hub_info(cpu)->pnode_mask = (1 << n_val) - 1; +		uv_cpu_hub_info(cpu)->pnode_mask = pnode_mask;  		uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1;  		uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper;  		uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base; @@ -631,6 +633,16 @@ void __init uv_system_init(void)  			lcpu, blade);  	} +	/* Add blade/pnode info for nodes without cpus */ +	for_each_online_node(nid) { +		if (uv_node_to_blade[nid] >= 0) +			continue; +		paddr = node_start_pfn(nid) << PAGE_SHIFT; +		pnode = (paddr >> m_val) & pnode_mask; +		blade = boot_pnode_to_blade(pnode); +		uv_node_to_blade[nid] = blade; +	} +  	map_gru_high(max_pnode);  	map_mmr_high(max_pnode);  	map_config_high(max_pnode); | 
