2005-04-16 15:20:36 -07:00
/* internal.h: mm/ internal definitions
*
* Copyright ( C ) 2004 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*/
2006-03-22 00:08:33 -08:00
# ifndef __MM_INTERNAL_H
# define __MM_INTERNAL_H
# include <linux/mm.h>
2005-04-16 15:20:36 -07:00
2008-07-23 21:27:10 -07:00
void free_pgtables ( struct mmu_gather * tlb , struct vm_area_struct * start_vma ,
unsigned long floor , unsigned long ceiling ) ;
2008-07-23 21:27:46 -07:00
extern void prep_compound_page ( struct page * page , unsigned long order ) ;
2006-03-22 00:08:40 -08:00
static inline void set_page_count ( struct page * page , int v )
2006-01-06 00:10:57 -08:00
{
2006-03-22 00:08:40 -08:00
atomic_set ( & page - > _count , v ) ;
}
/*
* Turn a non - refcounted page ( - > _count = = 0 ) into refcounted with
* a count of one .
*/
static inline void set_page_refcounted ( struct page * page )
{
2008-02-04 22:29:27 -08:00
VM_BUG_ON ( PageTail ( page ) ) ;
2006-09-25 23:30:55 -07:00
VM_BUG_ON ( atomic_read ( & page - > _count ) ) ;
2006-01-06 00:10:57 -08:00
set_page_count ( page , 1 ) ;
}
2006-03-22 00:08:33 -08:00
static inline void __put_page ( struct page * page )
{
atomic_dec ( & page - > _count ) ;
}
2008-04-28 02:13:34 -07:00
extern void __free_pages_bootmem ( struct page * page , unsigned int order ) ;
2006-03-22 00:08:33 -08:00
2007-10-16 01:26:10 -07:00
/*
* function for dealing with page ' s order in buddy system .
* zone - > lock is already acquired when we use these .
* So , we don ' t need atomic page - > flags operations here .
*/
static inline unsigned long page_order ( struct page * page )
{
VM_BUG_ON ( ! PageBuddy ( page ) ) ;
return page_private ( page ) ;
}
2008-02-23 15:24:06 -08:00
/*
* FLATMEM and DISCONTIGMEM configurations use alloc_bootmem_node ,
* so all functions starting at paging_init should be marked __init
* in those cases . SPARSEMEM , however , allows for memory hotplug ,
* and alloc_bootmem_node is not used .
*/
# ifdef CONFIG_SPARSEMEM
# define __paginginit __meminit
# else
# define __paginginit __init
# endif
2008-07-23 21:26:49 -07:00
/* Memory initialisation debug and verification */
enum mminit_level {
MMINIT_WARNING ,
MMINIT_VERIFY ,
MMINIT_TRACE
} ;
# ifdef CONFIG_DEBUG_MEMORY_INIT
extern int mminit_loglevel ;
# define mminit_dprintk(level, prefix, fmt, arg...) \
do { \
if ( level < mminit_loglevel ) { \
printk ( level < = MMINIT_WARNING ? KERN_WARNING : KERN_DEBUG ) ; \
printk ( KERN_CONT " mminit:: " prefix " " fmt , # # arg ) ; \
} \
} while ( 0 )
2008-07-23 21:26:51 -07:00
extern void mminit_verify_pageflags_layout ( void ) ;
extern void mminit_verify_page_links ( struct page * page ,
enum zone_type zone , unsigned long nid , unsigned long pfn ) ;
2008-07-23 21:26:52 -07:00
extern void mminit_verify_zonelist ( void ) ;
2008-07-23 21:26:51 -07:00
2008-07-23 21:26:49 -07:00
# else
static inline void mminit_dprintk ( enum mminit_level level ,
const char * prefix , const char * fmt , . . . )
{
}
2008-07-23 21:26:51 -07:00
static inline void mminit_verify_pageflags_layout ( void )
{
}
static inline void mminit_verify_page_links ( struct page * page ,
enum zone_type zone , unsigned long nid , unsigned long pfn )
{
}
2008-07-23 21:26:52 -07:00
static inline void mminit_verify_zonelist ( void )
{
}
2008-07-23 21:26:49 -07:00
# endif /* CONFIG_DEBUG_MEMORY_INIT */
2008-07-23 21:26:52 -07:00
/* mminit_validate_memmodel_limits is independent of CONFIG_DEBUG_MEMORY_INIT */
# if defined(CONFIG_SPARSEMEM)
extern void mminit_validate_memmodel_limits ( unsigned long * start_pfn ,
unsigned long * end_pfn ) ;
# else
static inline void mminit_validate_memmodel_limits ( unsigned long * start_pfn ,
unsigned long * end_pfn )
{
}
# endif /* CONFIG_SPARSEMEM */
2006-03-22 00:08:33 -08:00
# endif