Commit 299a180a authored by Tejun Heo's avatar Tejun Heo

x86-32, NUMA: Update numaq to use new NUMA init protocol

Update numaq such that it calls numa_add_memblk() and sets
numa_nodes_parsed instead of directly diddling with NUMA states.  The
original get_memcfg_numaq() is renamed to numaq_numa_init() and new
get_memcfg_numaq() is created in numa_32.c.

The shim numa_add_memblk() implementation handles node_start/end_pfn[]
and node_set_online() for nodes with memory.  The new
get_memcfg_numaq() exactly the same with get_memcfg_from_srat() other
than calling the numaq init function.  Things get_memcfgs_numaq() do
are not strictly necessary for numaq but added for consistency and to
help unifying NUMA init handling.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Yinghai Lu <yinghai@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
parent 5acd91ab
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#ifdef CONFIG_X86_NUMAQ #ifdef CONFIG_X86_NUMAQ
extern int found_numaq; extern int found_numaq;
extern int get_memcfg_numaq(void); extern int numaq_numa_init(void);
extern int pci_numaq_init(void); extern int pci_numaq_init(void);
extern void *xquad_portio; extern void *xquad_portio;
...@@ -166,11 +166,6 @@ struct sys_cfg_data { ...@@ -166,11 +166,6 @@ struct sys_cfg_data {
void numaq_tsc_disable(void); void numaq_tsc_disable(void);
#else
static inline int get_memcfg_numaq(void)
{
return 0;
}
#endif /* CONFIG_X86_NUMAQ */ #endif /* CONFIG_X86_NUMAQ */
#endif /* _ASM_X86_NUMAQ_H */ #endif /* _ASM_X86_NUMAQ_H */
...@@ -48,8 +48,6 @@ ...@@ -48,8 +48,6 @@
#include <asm/e820.h> #include <asm/e820.h>
#include <asm/ipi.h> #include <asm/ipi.h>
#define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT))
int found_numaq; int found_numaq;
/* /*
...@@ -79,25 +77,20 @@ int quad_local_to_mp_bus_id[NR_CPUS/4][4]; ...@@ -79,25 +77,20 @@ int quad_local_to_mp_bus_id[NR_CPUS/4][4];
static inline void numaq_register_node(int node, struct sys_cfg_data *scd) static inline void numaq_register_node(int node, struct sys_cfg_data *scd)
{ {
struct eachquadmem *eq = scd->eq + node; struct eachquadmem *eq = scd->eq + node;
u64 start = (u64)(eq->hi_shrd_mem_start - eq->priv_mem_size) << 20;
u64 end = (u64)(eq->hi_shrd_mem_start + eq->hi_shrd_mem_size) << 20;
int ret;
node_set_online(node); node_set(node, numa_nodes_parsed);
ret = numa_add_memblk(node, start, end);
/* Convert to pages */ BUG_ON(ret < 0);
node_start_pfn[node] =
MB_TO_PAGES(eq->hi_shrd_mem_start - eq->priv_mem_size);
node_end_pfn[node] =
MB_TO_PAGES(eq->hi_shrd_mem_start + eq->hi_shrd_mem_size);
memblock_x86_register_active_regions(node, node_start_pfn[node],
node_end_pfn[node]);
} }
/* /*
* Function: smp_dump_qct() * Function: smp_dump_qct()
* *
* Description: gets memory layout from the quad config table. This * Description: gets memory layout from the quad config table. This
* function also updates node_online_map with the nodes (quads) present. * function also updates numa_nodes_parsed with the nodes (quads) present.
*/ */
static void __init smp_dump_qct(void) static void __init smp_dump_qct(void)
{ {
...@@ -106,7 +99,6 @@ static void __init smp_dump_qct(void) ...@@ -106,7 +99,6 @@ static void __init smp_dump_qct(void)
scd = (void *)__va(SYS_CFG_DATA_PRIV_ADDR); scd = (void *)__va(SYS_CFG_DATA_PRIV_ADDR);
nodes_clear(node_online_map);
for_each_node(node) { for_each_node(node) {
if (scd->quads_present31_0 & (1 << node)) if (scd->quads_present31_0 & (1 << node))
numaq_register_node(node, scd); numaq_register_node(node, scd);
...@@ -276,14 +268,14 @@ static __init void early_check_numaq(void) ...@@ -276,14 +268,14 @@ static __init void early_check_numaq(void)
} }
} }
int __init get_memcfg_numaq(void) int __init numaq_numa_init(void)
{ {
early_check_numaq(); early_check_numaq();
if (!found_numaq) if (!found_numaq)
return 0; return -ENOENT;
smp_dump_qct(); smp_dump_qct();
return 1; return 0;
} }
#define NUMAQ_APIC_DFR_VALUE (APIC_DFR_CLUSTER) #define NUMAQ_APIC_DFR_VALUE (APIC_DFR_CLUSTER)
......
...@@ -332,6 +332,29 @@ static __init void init_alloc_remap(int nid) ...@@ -332,6 +332,29 @@ static __init void init_alloc_remap(int nid)
nid, node_pa, node_pa + size, remap_va, remap_va + size); nid, node_pa, node_pa + size, remap_va, remap_va + size);
} }
static int get_memcfg_numaq(void)
{
#ifdef CONFIG_X86_NUMAQ
int nid;
if (numa_off)
return 0;
if (numaq_numa_init() < 0) {
nodes_clear(numa_nodes_parsed);
remove_all_active_ranges();
return 0;
}
for_each_node_mask(nid, numa_nodes_parsed)
node_set_online(nid);
sort_node_map();
return 1;
#else
return 0;
#endif
}
static int get_memcfg_from_srat(void) static int get_memcfg_from_srat(void)
{ {
#ifdef CONFIG_ACPI_NUMA #ifdef CONFIG_ACPI_NUMA
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment