2005-04-17 02:20:36 +04:00
/*
* Written by Kanoj Sarcar ( kanoj @ sgi . com ) Aug 99
*
* PowerPC64 port :
* Copyright ( C ) 2002 Anton Blanchard , IBM Corp .
*/
# ifndef _ASM_MMZONE_H_
# define _ASM_MMZONE_H_
# include <linux/config.h>
# include <asm/smp.h>
2005-06-23 11:08:03 +04:00
/* generic non-linear memory support:
*
* 1 ) we will not split memory into more chunks than will fit into the
* flags field of the struct page
*/
# ifdef CONFIG_NEED_MULTIPLE_NODES
2005-04-17 02:20:36 +04:00
extern struct pglist_data * node_data [ ] ;
2005-06-23 11:08:03 +04:00
/*
* Return a pointer to the node data for node n .
*/
# define NODE_DATA(nid) (node_data[nid])
2005-04-17 02:20:36 +04:00
/*
* Following are specific to this numa platform .
*/
extern int numa_cpu_lookup_table [ ] ;
extern char * numa_memory_lookup_table ;
extern cpumask_t numa_cpumask_lookup_table [ ] ;
extern int nr_cpus_in_node [ ] ;
/* 16MB regions */
# define MEMORY_INCREMENT_SHIFT 24
# define MEMORY_INCREMENT (1UL << MEMORY_INCREMENT_SHIFT)
/* NUMA debugging, will not work on a DLPAR machine */
# undef DEBUG_NUMA
static inline int pa_to_nid ( unsigned long pa )
{
int nid ;
nid = numa_memory_lookup_table [ pa > > MEMORY_INCREMENT_SHIFT ] ;
# ifdef DEBUG_NUMA
/* the physical address passed in is not in the map for the system */
if ( nid = = - 1 ) {
printk ( " bad address: %lx \n " , pa ) ;
BUG ( ) ;
}
# endif
return nid ;
}
# 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) (NODE_DATA(nid)->node_end_pfn)
2005-06-23 11:08:03 +04:00
# ifdef CONFIG_DISCONTIGMEM
/*
* Given a kernel address , find the home node of the underlying memory .
*/
# define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr))
# define pfn_to_nid(pfn) pa_to_nid((unsigned long)(pfn) << PAGE_SHIFT)
2005-04-17 02:20:36 +04:00
/* Written this way to avoid evaluating arguments twice */
# define discontigmem_pfn_to_page(pfn) \
( { \
unsigned long __tmp = 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 ( pfn_to_nid ( __tmp ) ) - > node_mem_map + \
2005-04-17 02:20:36 +04:00
node_localnr ( __tmp , pfn_to_nid ( __tmp ) ) ) ; \
} )
# define discontigmem_page_to_pfn(p) \
( { \
struct page * __tmp = p ; \
( ( ( __tmp ) - page_zone ( __tmp ) - > zone_mem_map ) + \
page_zone ( __tmp ) - > zone_start_pfn ) ; \
} )
/* XXX fix for discontiguous physical memory */
# define discontigmem_pfn_valid(pfn) ((pfn) < num_physpages)
# endif /* CONFIG_DISCONTIGMEM */
2005-06-23 11:08:01 +04:00
2005-06-23 11:08:03 +04:00
# endif /* CONFIG_NEED_MULTIPLE_NODES */
2005-06-23 11:08:01 +04:00
# ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
# define early_pfn_to_nid(pfn) pa_to_nid(((unsigned long)pfn) << PAGE_SHIFT)
# endif
2005-04-17 02:20:36 +04:00
# endif /* _ASM_MMZONE_H_ */