2005-04-17 02:20:36 +04:00
/*
* linux / arch / m32r / mm / init . c
*
* Copyright ( c ) 2001 , 2002 Hitoshi Yamamoto
*
* Some code taken from sh version .
* Copyright ( C ) 1999 Niibe Yutaka
* Based on linux / arch / i386 / mm / init . c :
* Copyright ( C ) 1995 Linus Torvalds
*/
# include <linux/init.h>
# include <linux/kernel.h>
# include <linux/mm.h>
# include <linux/pagemap.h>
# include <linux/bootmem.h>
# include <linux/swap.h>
# include <linux/highmem.h>
# include <linux/bitops.h>
# include <linux/nodemask.h>
2006-03-27 13:16:04 +04:00
# include <linux/pfn.h>
2005-04-17 02:20:36 +04:00
# include <asm/types.h>
# include <asm/processor.h>
# include <asm/page.h>
# include <asm/pgtable.h>
# include <asm/pgalloc.h>
# include <asm/mmu_context.h>
# include <asm/setup.h>
# include <asm/tlb.h>
/* References to section boundaries */
extern char _text , _etext , _edata ;
extern char __init_begin , __init_end ;
pgd_t swapper_pg_dir [ 1024 ] ;
DEFINE_PER_CPU ( struct mmu_gather , mmu_gathers ) ;
/*
* Cache of MMU context last used .
*/
# ifndef CONFIG_SMP
unsigned long mmu_context_cache_dat ;
# else
unsigned long mmu_context_cache_dat [ NR_CPUS ] ;
# endif
static unsigned long hole_pages ;
/*
* function prototype
*/
void __init paging_init ( void ) ;
void __init mem_init ( void ) ;
void free_initmem ( void ) ;
# ifdef CONFIG_BLK_DEV_INITRD
void free_initrd_mem ( unsigned long , unsigned long ) ;
# endif
/* It'd be good if these lines were in the standard header file. */
2008-07-24 08:28:09 +04:00
# define START_PFN(nid) (NODE_DATA(nid)->bdata->node_min_pfn)
2005-04-17 02:20:36 +04:00
# define MAX_LOW_PFN(nid) (NODE_DATA(nid)->bdata->node_low_pfn)
# ifndef CONFIG_DISCONTIGMEM
unsigned long __init zone_sizes_init ( void )
{
2006-09-26 10:31:10 +04:00
unsigned long zones_size [ MAX_NR_ZONES ] = { 0 , } ;
2005-04-17 02:20:36 +04:00
unsigned long max_dma ;
unsigned long low ;
unsigned long start_pfn ;
# ifdef CONFIG_MMU
start_pfn = START_PFN ( 0 ) ;
max_dma = virt_to_phys ( ( char * ) MAX_DMA_ADDRESS ) > > PAGE_SHIFT ;
low = MAX_LOW_PFN ( 0 ) ;
if ( low < max_dma ) {
zones_size [ ZONE_DMA ] = low - start_pfn ;
zones_size [ ZONE_NORMAL ] = 0 ;
} else {
zones_size [ ZONE_DMA ] = low - start_pfn ;
zones_size [ ZONE_NORMAL ] = low - max_dma ;
}
# else
zones_size [ ZONE_DMA ] = 0 > > PAGE_SHIFT ;
zones_size [ ZONE_NORMAL ] = __MEMORY_SIZE > > PAGE_SHIFT ;
start_pfn = __MEMORY_START > > PAGE_SHIFT ;
# endif /* CONFIG_MMU */
2008-07-24 08:27:20 +04:00
free_area_init_node ( 0 , zones_size , start_pfn , 0 ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
# else /* CONFIG_DISCONTIGMEM */
extern unsigned long zone_sizes_init ( void ) ;
# endif /* CONFIG_DISCONTIGMEM */
/*======================================================================*
* paging_init ( ) : sets up the page tables
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
void __init paging_init ( void )
{
# ifdef CONFIG_MMU
int i ;
pgd_t * pg_dir ;
/* We don't need kernel mapping as hardware support that. */
pg_dir = swapper_pg_dir ;
for ( i = 0 ; i < USER_PTRS_PER_PGD * 2 ; i + + )
pgd_val ( pg_dir [ i ] ) = 0 ;
# endif /* CONFIG_MMU */
hole_pages = zone_sizes_init ( ) ;
}
int __init reservedpages_count ( void )
{
int reservedpages , nid , i ;
reservedpages = 0 ;
2005-10-30 04:16:52 +03:00
for_each_online_node ( nid ) {
unsigned long flags ;
pgdat_resize_lock ( NODE_DATA ( nid ) , & flags ) ;
2005-04-17 02:20:36 +04:00
for ( i = 0 ; i < MAX_LOW_PFN ( nid ) - START_PFN ( nid ) ; i + + )
[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
if ( PageReserved ( nid_page_nr ( nid , i ) ) )
2005-04-17 02:20:36 +04:00
reservedpages + + ;
2005-10-30 04:16:52 +03:00
pgdat_resize_unlock ( NODE_DATA ( nid ) , & flags ) ;
}
2005-04-17 02:20:36 +04:00
return reservedpages ;
}
/*======================================================================*
* mem_init ( ) :
* orig : arch / sh / mm / init . c
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
void __init mem_init ( void )
{
int codesize , reservedpages , datasize , initsize ;
int nid ;
# ifndef CONFIG_MMU
extern unsigned long memory_end ;
# endif
num_physpages = 0 ;
for_each_online_node ( nid )
num_physpages + = MAX_LOW_PFN ( nid ) - START_PFN ( nid ) + 1 ;
num_physpages - = hole_pages ;
# ifndef CONFIG_DISCONTIGMEM
max_mapnr = num_physpages ;
# endif /* CONFIG_DISCONTIGMEM */
# ifdef CONFIG_MMU
high_memory = ( void * ) __va ( PFN_PHYS ( MAX_LOW_PFN ( 0 ) ) ) ;
# else
high_memory = ( void * ) ( memory_end & PAGE_MASK ) ;
# endif /* CONFIG_MMU */
/* clear the zero-page */
memset ( empty_zero_page , 0 , PAGE_SIZE ) ;
/* this will put all low memory onto the freelists */
for_each_online_node ( nid )
totalram_pages + = free_all_bootmem_node ( NODE_DATA ( nid ) ) ;
reservedpages = reservedpages_count ( ) - hole_pages ;
codesize = ( unsigned long ) & _etext - ( unsigned long ) & _text ;
datasize = ( unsigned long ) & _edata - ( unsigned long ) & _etext ;
initsize = ( unsigned long ) & __init_end - ( unsigned long ) & __init_begin ;
printk ( KERN_INFO " Memory: %luk/%luk available (%dk kernel code, "
" %dk reserved, %dk data, %dk init) \n " ,
( unsigned long ) nr_free_pages ( ) < < ( PAGE_SHIFT - 10 ) ,
num_physpages < < ( PAGE_SHIFT - 10 ) ,
codesize > > 10 ,
reservedpages < < ( PAGE_SHIFT - 10 ) ,
datasize > > 10 ,
initsize > > 10 ) ;
}
/*======================================================================*
* free_initmem ( ) :
* orig : arch / sh / mm / init . c
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
void free_initmem ( void )
{
unsigned long addr ;
addr = ( unsigned long ) ( & __init_begin ) ;
for ( ; addr < ( unsigned long ) ( & __init_end ) ; addr + = PAGE_SIZE ) {
ClearPageReserved ( virt_to_page ( addr ) ) ;
2006-03-22 11:08:40 +03:00
init_page_count ( virt_to_page ( addr ) ) ;
2005-04-17 02:20:36 +04:00
free_page ( addr ) ;
totalram_pages + + ;
}
printk ( KERN_INFO " Freeing unused kernel memory: %dk freed \n " , \
( int ) ( & __init_end - & __init_begin ) > > 10 ) ;
}
# ifdef CONFIG_BLK_DEV_INITRD
/*======================================================================*
* free_initrd_mem ( ) :
* orig : arch / sh / mm / init . c
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
void free_initrd_mem ( unsigned long start , unsigned long end )
{
unsigned long p ;
for ( p = start ; p < end ; p + = PAGE_SIZE ) {
ClearPageReserved ( virt_to_page ( p ) ) ;
2006-03-22 11:08:40 +03:00
init_page_count ( virt_to_page ( p ) ) ;
2005-04-17 02:20:36 +04:00
free_page ( p ) ;
totalram_pages + + ;
}
printk ( KERN_INFO " Freeing initrd memory: %ldk freed \n " , ( end - start ) > > 10 ) ;
}
# endif