2005-04-17 02:20:36 +04:00
/*
* Written by Pat Gaughen ( gone @ us . ibm . com ) Mar 2002
*
*/
# ifndef _ASM_MMZONE_H_
# define _ASM_MMZONE_H_
# include <asm/smp.h>
2005-07-08 04:56:39 +04:00
# ifdef CONFIG_NUMA
2005-06-23 11:07:57 +04:00
extern struct pglist_data * node_data [ ] ;
# define NODE_DATA(nid) (node_data[nid])
2005-04-17 02:20:36 +04:00
2005-07-08 04:56:39 +04:00
# ifdef CONFIG_X86_NUMAQ
# include <asm/numaq.h>
# else /* summit or generic arch */
# include <asm/srat.h>
# endif
2005-04-17 02:20:36 +04:00
2005-06-23 11:07:57 +04:00
extern int get_memcfg_numa_flat ( void ) ;
/*
* This allows any one NUMA architecture to be compiled
* for , and still fall back to the flat function if it
* fails .
*/
static inline void get_memcfg_numa ( void )
{
# ifdef CONFIG_X86_NUMAQ
if ( get_memcfg_numaq ( ) )
return ;
2005-09-10 00:01:23 +04:00
# elif defined(CONFIG_ACPI_SRAT)
2005-06-23 11:07:57 +04:00
if ( get_memcfg_from_srat ( ) )
return ;
# endif
get_memcfg_numa_flat ( ) ;
}
2005-07-08 04:56:39 +04:00
extern int early_pfn_to_nid ( unsigned long pfn ) ;
2005-07-08 04:56:39 +04:00
# else /* !CONFIG_NUMA */
# define get_memcfg_numa get_memcfg_numa_flat
# define get_zholes_size(n) (0)
2005-06-23 11:07:57 +04:00
# endif /* CONFIG_NUMA */
# ifdef CONFIG_DISCONTIGMEM
2005-04-17 02:20:36 +04:00
/*
* generic node memory support , the following assumptions apply :
*
* 1 ) memory comes in 256 Mb contigious chunks which are either present or not
* 2 ) we will not have more than 64 Gb in total
*
* for now assume that 64 Gb is max amount of RAM for whole system
* 64 Gb / 4096 bytes / page = 16777216 pages
*/
# define MAX_NR_PAGES 16777216
# define MAX_ELEMENTS 256
# define PAGES_PER_ELEMENT (MAX_NR_PAGES / MAX_ELEMENTS)
extern s8 physnode_map [ ] ;
static inline int pfn_to_nid ( unsigned long pfn )
{
# ifdef CONFIG_NUMA
return ( ( int ) physnode_map [ ( pfn ) / PAGES_PER_ELEMENT ] ) ;
# else
return 0 ;
# endif
}
# define node_localnr(pfn, nid) ((pfn) - node_data[nid]->node_start_pfn)
/*
* Following are macros that each numa implmentation must define .
*/
# define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
# define node_end_pfn(nid) \
( { \
pg_data_t * __pgdat = NODE_DATA ( nid ) ; \
__pgdat - > node_start_pfn + __pgdat - > node_spanned_pages ; \
} )
/* XXX: FIXME -- wli */
# define kern_addr_valid(kaddr) (0)
# define pfn_to_page(pfn) \
( { \
unsigned long __pfn = pfn ; \
int __node = pfn_to_nid ( __pfn ) ; \
[PATCH] remove non-DISCONTIG use of pgdat->node_mem_map
This patch effectively eliminates direct use of pgdat->node_mem_map outside
of the DISCONTIG code. On a flat memory system, these fields aren't
currently used, neither are they on a sparsemem system.
There was also a node_mem_map(nid) macro on many architectures. Its use
along with the use of ->node_mem_map itself was not consistent. It has
been removed in favor of two new, more explicit, arch-independent macros:
pgdat_page_nr(pgdat, pagenr)
nid_page_nr(nid, pagenr)
I called them "pgdat" and "nid" because we overload the term "node" to mean
"NUMA node", "DISCONTIG node" or "pg_data_t" in very confusing ways. I
believe the newer names are much clearer.
These macros can be overridden in the sparsemem case with a theoretically
slower operation using node_start_pfn and pfn_to_page(), instead. We could
make this the only behavior if people want, but I don't want to change too
much at once. One thing at a time.
This patch removes more code than it adds.
Compile tested on alpha, alpha discontig, arm, arm-discontig, i386, i386
generic, NUMAQ, Summit, ppc64, ppc64 discontig, and x86_64. Full list
here: http://sr71.net/patches/2.6.12/2.6.12-rc1-mhp2/configs/
Boot tested on NUMAQ, x86 SMP and ppc64 power4/5 LPARs.
Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
Signed-off-by: Martin J. Bligh <mbligh@aracnet.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-06-23 11:07:37 +04:00
& NODE_DATA ( __node ) - > node_mem_map [ node_localnr ( __pfn , __node ) ] ; \
2005-04-17 02:20:36 +04:00
} )
# define page_to_pfn(pg) \
( { \
struct page * __page = pg ; \
struct zone * __zone = page_zone ( __page ) ; \
( unsigned long ) ( __page - __zone - > zone_mem_map ) \
+ __zone - > zone_start_pfn ; \
} )
# ifdef CONFIG_X86_NUMAQ /* we have contiguous memory on NUMA-Q */
# define pfn_valid(pfn) ((pfn) < num_physpages)
# else
static inline int pfn_valid ( int pfn )
{
int nid = pfn_to_nid ( pfn ) ;
if ( nid > = 0 )
return ( pfn < node_end_pfn ( nid ) ) ;
return 0 ;
}
2005-06-23 11:07:57 +04:00
# endif /* CONFIG_X86_NUMAQ */
# endif /* CONFIG_DISCONTIGMEM */
# ifdef CONFIG_NEED_MULTIPLE_NODES
2005-04-17 02:20:36 +04:00
/*
2005-06-23 11:07:57 +04:00
* Following are macros that are specific to this numa platform .
2005-04-17 02:20:36 +04:00
*/
2005-06-23 11:07:57 +04:00
# define reserve_bootmem(addr, size) \
reserve_bootmem_node ( NODE_DATA ( 0 ) , ( addr ) , ( size ) )
# define alloc_bootmem(x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , SMP_CACHE_BYTES , __pa ( MAX_DMA_ADDRESS ) )
# define alloc_bootmem_low(x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , SMP_CACHE_BYTES , 0 )
# define alloc_bootmem_pages(x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , PAGE_SIZE , __pa ( MAX_DMA_ADDRESS ) )
# define alloc_bootmem_low_pages(x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , PAGE_SIZE , 0 )
# define alloc_bootmem_node(ignore, x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , SMP_CACHE_BYTES , __pa ( MAX_DMA_ADDRESS ) )
# define alloc_bootmem_pages_node(ignore, x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , PAGE_SIZE , __pa ( MAX_DMA_ADDRESS ) )
# define alloc_bootmem_low_pages_node(ignore, x) \
__alloc_bootmem_node ( NODE_DATA ( 0 ) , ( x ) , PAGE_SIZE , 0 )
2005-04-17 02:20:36 +04:00
2005-06-23 11:07:57 +04:00
# endif /* CONFIG_NEED_MULTIPLE_NODES */
2005-06-23 11:07:52 +04:00
2005-04-17 02:20:36 +04:00
# endif /* _ASM_MMZONE_H_ */