2006-03-27 13:16:02 +04:00
/*
* linux / mm / mmzone . c
*
* management codes for pgdats and zones .
*/
# include <linux/stddef.h>
2009-05-13 20:34:48 +04:00
# include <linux/mm.h>
2006-03-27 13:16:02 +04:00
# include <linux/mmzone.h>
# include <linux/module.h>
struct pglist_data * first_online_pgdat ( void )
{
return NODE_DATA ( first_online_node ) ;
}
struct pglist_data * next_online_pgdat ( struct pglist_data * pgdat )
{
int nid = next_online_node ( pgdat - > node_id ) ;
if ( nid = = MAX_NUMNODES )
return NULL ;
return NODE_DATA ( nid ) ;
}
/*
* next_zone - helper magic for for_each_zone ( )
*/
struct zone * next_zone ( struct zone * zone )
{
pg_data_t * pgdat = zone - > zone_pgdat ;
if ( zone < pgdat - > node_zones + MAX_NR_ZONES - 1 )
zone + + ;
else {
pgdat = next_online_pgdat ( pgdat ) ;
if ( pgdat )
zone = pgdat - > node_zones ;
else
zone = NULL ;
}
return zone ;
}
2008-04-28 13:12:18 +04:00
static inline int zref_in_nodemask ( struct zoneref * zref , nodemask_t * nodes )
{
# ifdef CONFIG_NUMA
return node_isset ( zonelist_node_idx ( zref ) , * nodes ) ;
# else
return 1 ;
# endif /* CONFIG_NUMA */
}
/* Returns the next zone at or below highest_zoneidx in a zonelist */
struct zoneref * next_zones_zonelist ( struct zoneref * z ,
enum zone_type highest_zoneidx ,
nodemask_t * nodes ,
struct zone * * zone )
{
/*
* Find the next suitable zone to use for the allocation .
* Only filter based on nodemask if it ' s set
*/
if ( likely ( nodes = = NULL ) )
while ( zonelist_zone_idx ( z ) > highest_zoneidx )
z + + ;
else
while ( zonelist_zone_idx ( z ) > highest_zoneidx | |
( z - > zone & & ! zref_in_nodemask ( z , nodes ) ) )
z + + ;
2008-09-13 13:33:19 +04:00
* zone = zonelist_zone ( z ) ;
2008-04-28 13:12:18 +04:00
return z ;
}
2009-05-13 20:34:48 +04:00
# ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
int memmap_valid_within ( unsigned long pfn ,
struct page * page , struct zone * zone )
{
if ( page_to_pfn ( page ) ! = pfn )
return 0 ;
if ( page_zone ( page ) ! = zone )
return 0 ;
return 1 ;
}
# endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */