X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=mm%2Fmmzone.c;h=f5b7d1760213e53db3c46e84dde56daf219ea0cd;hb=5407a56257b6ade44fd9bcac972c99845b7413cd;hp=b022370e612e990d0d9d80c12e65b0f97ba5c81e;hpb=95144c788dc01b6a0ff2c9c2222e37ffdab358b8;p=safe%2Fjmp%2Flinux-2.6 diff --git a/mm/mmzone.c b/mm/mmzone.c index b022370..f5b7d17 100644 --- a/mm/mmzone.c +++ b/mm/mmzone.c @@ -5,8 +5,8 @@ */ -#include #include +#include #include #include @@ -15,8 +15,6 @@ struct pglist_data *first_online_pgdat(void) return NODE_DATA(first_online_node); } -EXPORT_SYMBOL(first_online_pgdat); - struct pglist_data *next_online_pgdat(struct pglist_data *pgdat) { int nid = next_online_node(pgdat->node_id); @@ -25,8 +23,6 @@ struct pglist_data *next_online_pgdat(struct pglist_data *pgdat) return NULL; return NODE_DATA(nid); } -EXPORT_SYMBOL(next_online_pgdat); - /* * next_zone - helper magic for for_each_zone() @@ -46,5 +42,48 @@ struct zone *next_zone(struct zone *zone) } return zone; } -EXPORT_SYMBOL(next_zone); +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++; + + *zone = zonelist_zone(z); + return z; +} + +#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 */