Commit 82d82900 authored by Martin J. Bligh's avatar Martin J. Bligh Committed by Linus Torvalds

[PATCH] 1/6 Share common physnode_map code between NUMA-Q and Summit

From Andy Whitcroft

Share a common physnode_map structure between NUMA-Q and Summit.
parent a785c298
...@@ -68,6 +68,7 @@ EXPORT_SYMBOL(EISA_bus); ...@@ -68,6 +68,7 @@ EXPORT_SYMBOL(EISA_bus);
EXPORT_SYMBOL(MCA_bus); EXPORT_SYMBOL(MCA_bus);
#ifdef CONFIG_DISCONTIGMEM #ifdef CONFIG_DISCONTIGMEM
EXPORT_SYMBOL(node_data); EXPORT_SYMBOL(node_data);
EXPORT_SYMBOL(physnode_map);
#endif #endif
#ifdef CONFIG_X86_NUMAQ #ifdef CONFIG_X86_NUMAQ
EXPORT_SYMBOL(xquad_portio); EXPORT_SYMBOL(xquad_portio);
......
...@@ -31,8 +31,7 @@ ...@@ -31,8 +31,7 @@
#include <asm/numaq.h> #include <asm/numaq.h>
/* These are needed before the pgdat's are created */ /* These are needed before the pgdat's are created */
unsigned long node_start_pfn[MAX_NUMNODES]; extern long node_start_pfn[], node_end_pfn[];
unsigned long node_end_pfn[MAX_NUMNODES];
#define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT)) #define MB_TO_PAGES(addr) ((addr) << (20 - PAGE_SHIFT))
...@@ -65,25 +64,7 @@ static void __init smp_dump_qct(void) ...@@ -65,25 +64,7 @@ static void __init smp_dump_qct(void)
} }
} }
/* extern int physnode_map[];
* -----------------------------------------
*
* functions related to physnode_map
*
* -----------------------------------------
*/
/*
* physnode_map keeps track of the physical memory layout of the
* numaq nodes on a 256Mb break (each element of the array will
* represent 256Mb of memory and will be marked by the node id. so,
* if the first gig is on node 0, and the second gig is on node 1
* physnode_map will contain:
* physnode_map[0-3] = 0;
* physnode_map[4-7] = 1;
* physnode_map[8- ] = -1;
*/
int physnode_map[MAX_ELEMENTS] = { [0 ... (MAX_ELEMENTS - 1)] = -1};
EXPORT_SYMBOL(physnode_map);
/* /*
* for each node mark the regions * for each node mark the regions
......
...@@ -57,8 +57,7 @@ static int num_memory_chunks; /* total number of memory chunks */ ...@@ -57,8 +57,7 @@ static int num_memory_chunks; /* total number of memory chunks */
static int zholes_size_init; static int zholes_size_init;
static unsigned long zholes_size[MAX_NUMNODES * MAX_NR_ZONES]; static unsigned long zholes_size[MAX_NUMNODES * MAX_NR_ZONES];
unsigned long node_start_pfn[MAX_NUMNODES]; extern unsigned long node_start_pfn[], node_end_pfn[];
unsigned long node_end_pfn[MAX_NUMNODES];
extern void * boot_ioremap(unsigned long, unsigned long); extern void * boot_ioremap(unsigned long, unsigned long);
...@@ -182,30 +181,19 @@ static __init void chunk_to_zones(unsigned long cstart, unsigned long cend, ...@@ -182,30 +181,19 @@ static __init void chunk_to_zones(unsigned long cstart, unsigned long cend,
} }
} }
/* static void __init initialize_physnode_map(void)
* physnode_map keeps track of the physical memory layout of the
* numaq nodes on a 256Mb break (each element of the array will
* represent 256Mb of memory and will be marked by the node id. so,
* if the first gig is on node 0, and the second gig is on node 1
* physnode_map will contain:
* physnode_map[0-3] = 0;
* physnode_map[4-7] = 1;
* physnode_map[8- ] = -1;
*/
int pfnnode_map[MAX_ELEMENTS] = { [0 ... (MAX_ELEMENTS - 1)] = -1};
EXPORT_SYMBOL(pfnnode_map);
static void __init initialize_pfnnode_map(void)
{ {
unsigned long topofchunk, cur = 0;
int i; int i;
unsigned long pfn;
for (i = 0; i < num_memory_chunks; i++) { struct node_memory_chunk_s *nmcp;
cur = node_memory_chunk[i].start_pfn;
topofchunk = node_memory_chunk[i].end_pfn; /* Run the list of memory chunks and fill in the phymap. */
while (cur < topofchunk) { nmcp = node_memory_chunk;
pfnnode_map[PFN_TO_ELEMENT(cur)] = node_memory_chunk[i].nid; for (i = num_memory_chunks; --i >= 0; nmcp++) {
cur ++; for (pfn = nmcp->start_pfn; pfn <= nmcp->end_pfn;
pfn += PAGES_PER_ELEMENT)
{
physnode_map[pfn / PAGES_PER_ELEMENT] = (int)nmcp->nid;
} }
} }
} }
...@@ -272,7 +260,7 @@ static int __init acpi20_parse_srat(struct acpi_table_srat *sratp) ...@@ -272,7 +260,7 @@ static int __init acpi20_parse_srat(struct acpi_table_srat *sratp)
for (i = 0; i < num_memory_chunks; i++) for (i = 0; i < num_memory_chunks; i++)
node_memory_chunk[i].nid = pxm_to_nid_map[node_memory_chunk[i].pxm]; node_memory_chunk[i].nid = pxm_to_nid_map[node_memory_chunk[i].pxm];
initialize_pfnnode_map(); initialize_physnode_map();
printk("pxm bitmap: "); printk("pxm bitmap: ");
for (i = 0; i < sizeof(pxm_bitmap); i++) { for (i = 0; i < sizeof(pxm_bitmap); i++) {
......
...@@ -36,11 +36,36 @@ ...@@ -36,11 +36,36 @@
struct pglist_data *node_data[MAX_NUMNODES]; struct pglist_data *node_data[MAX_NUMNODES];
bootmem_data_t node0_bdata; bootmem_data_t node0_bdata;
/*
* numa interface - we expect the numa architecture specfic code to have
* populated the following initialisation.
*
* 1) numnodes - the total number of nodes configured in the system
* 2) physnode_map - the mapping between a pfn and owning node
* 3) node_start_pfn - the starting page frame number for a node
* 3) node_end_pfn - the ending page fram number for a node
*/
/*
* physnode_map keeps track of the physical memory layout of a generic
* numa node on a 256Mb break (each element of the array will
* represent 256Mb of memory and will be marked by the node id. so,
* if the first gig is on node 0, and the second gig is on node 1
* physnode_map will contain:
*
* physnode_map[0-3] = 0;
* physnode_map[4-7] = 1;
* physnode_map[8- ] = -1;
*/
int physnode_map[MAX_ELEMENTS] = { [0 ... (MAX_ELEMENTS - 1)] = -1};
unsigned long node_start_pfn[MAX_NUMNODES];
unsigned long node_end_pfn[MAX_NUMNODES];
extern unsigned long find_max_low_pfn(void); extern unsigned long find_max_low_pfn(void);
extern void find_max_pfn(void); extern void find_max_pfn(void);
extern void one_highpage_init(struct page *, int, int); extern void one_highpage_init(struct page *, int, int);
extern unsigned long node_start_pfn[], node_end_pfn[];
extern struct e820map e820; extern struct e820map e820;
extern char _end; extern char _end;
extern unsigned long highend_pfn, highstart_pfn; extern unsigned long highend_pfn, highstart_pfn;
......
...@@ -10,14 +10,6 @@ ...@@ -10,14 +10,6 @@
#ifdef CONFIG_DISCONTIGMEM #ifdef CONFIG_DISCONTIGMEM
#ifdef CONFIG_X86_NUMAQ
#include <asm/numaq.h>
#elif CONFIG_X86_SUMMIT
#include <asm/srat.h>
#else
#define pfn_to_nid(pfn) (0)
#endif /* CONFIG_X86_NUMAQ */
extern struct pglist_data *node_data[]; extern struct pglist_data *node_data[];
/* /*
...@@ -101,5 +93,38 @@ extern struct pglist_data *node_data[]; ...@@ -101,5 +93,38 @@ extern struct pglist_data *node_data[];
* ( pfn_to_pgdat(pfn) && ((pfn) < node_end_pfn(pfn_to_nid(pfn))) ) * ( pfn_to_pgdat(pfn) && ((pfn) < node_end_pfn(pfn_to_nid(pfn))) )
*/ */
#define pfn_valid(pfn) ((pfn) < num_physpages) #define pfn_valid(pfn) ((pfn) < num_physpages)
/*
* generic node memory support, the following assumptions apply:
*
* 1) memory comes in 256Mb contigious chunks which are either present or not
* 2) we will not have more than 64Gb in total
*
* for now assume that 64Gb is max amount of RAM for whole system
* 64Gb / 4096bytes/page = 16777216 pages
*/
#define MAX_NR_PAGES 16777216
#define MAX_ELEMENTS 256
#define PAGES_PER_ELEMENT (MAX_NR_PAGES/MAX_ELEMENTS)
extern int physnode_map[];
static inline int pfn_to_nid(unsigned long pfn)
{
return(physnode_map[(pfn) / PAGES_PER_ELEMENT]);
}
static inline struct pglist_data *pfn_to_pgdat(unsigned long pfn)
{
return(NODE_DATA(pfn_to_nid(pfn)));
}
#ifdef CONFIG_X86_NUMAQ
#include <asm/numaq.h>
#elif CONFIG_X86_SUMMIT
#include <asm/srat.h>
#else
#define pfn_to_nid(pfn) (0)
#endif /* CONFIG_X86_NUMAQ */
#endif /* CONFIG_DISCONTIGMEM */ #endif /* CONFIG_DISCONTIGMEM */
#endif /* _ASM_MMZONE_H_ */ #endif /* _ASM_MMZONE_H_ */
...@@ -28,18 +28,8 @@ ...@@ -28,18 +28,8 @@
#ifdef CONFIG_X86_NUMAQ #ifdef CONFIG_X86_NUMAQ
/*
* for now assume that 64Gb is max amount of RAM for whole system
* 64Gb / 4096bytes/page = 16777216 pages
*/
#define MAX_NR_PAGES 16777216
#define MAX_ELEMENTS 256
#define PAGES_PER_ELEMENT (16777216/256)
extern int physnode_map[]; extern int physnode_map[];
#define pfn_to_nid(pfn) ({ physnode_map[(pfn) / PAGES_PER_ELEMENT]; })
#define pfn_to_pgdat(pfn) NODE_DATA(pfn_to_nid(pfn))
#define PHYSADDR_TO_NID(pa) pfn_to_nid(pa >> PAGE_SHIFT)
#define MAX_NUMNODES 8 #define MAX_NUMNODES 8
extern void get_memcfg_numaq(void); extern void get_memcfg_numaq(void);
#define get_memcfg_numa() get_memcfg_numaq() #define get_memcfg_numa() get_memcfg_numaq()
......
...@@ -27,17 +27,7 @@ ...@@ -27,17 +27,7 @@
#ifndef _ASM_SRAT_H_ #ifndef _ASM_SRAT_H_
#define _ASM_SRAT_H_ #define _ASM_SRAT_H_
/* extern int physnode_map[];
* each element in pfnnode_map represents 256 MB (2^28) of pages.
* so, to represent 64GB we need 256 elements.
*/
#define MAX_ELEMENTS 256
#define PFN_TO_ELEMENT(pfn) ((pfn)>>(28 - PAGE_SHIFT))
extern int pfnnode_map[];
#define pfn_to_nid(pfn) ({ pfnnode_map[PFN_TO_ELEMENT(pfn)]; })
#define pfn_to_pgdat(pfn) NODE_DATA(pfn_to_nid(pfn))
#define PHYSADDR_TO_NID(pa) pfn_to_nid(pa >> PAGE_SHIFT)
#define MAX_NUMNODES 8 #define MAX_NUMNODES 8
extern void get_memcfg_from_srat(void); extern void get_memcfg_from_srat(void);
extern unsigned long *get_zholes_size(int); extern unsigned long *get_zholes_size(int);
......
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