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: Tejun 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>
This commit is contained in:
@@ -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 {
|
|||||||
|
|
||||||
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 @@
|
|||||||
#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];
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user