linux/mm/mmzone.c
<<
>>
Prefs
   1/*
   2 * linux/mm/mmzone.c
   3 *
   4 * management codes for pgdats and zones.
   5 */
   6
   7
   8#include <linux/stddef.h>
   9#include <linux/mm.h>
  10#include <linux/mmzone.h>
  11#include <linux/module.h>
  12
  13struct pglist_data *first_online_pgdat(void)
  14{
  15        return NODE_DATA(first_online_node);
  16}
  17
  18struct pglist_data *next_online_pgdat(struct pglist_data *pgdat)
  19{
  20        int nid = next_online_node(pgdat->node_id);
  21
  22        if (nid == MAX_NUMNODES)
  23                return NULL;
  24        return NODE_DATA(nid);
  25}
  26
  27/*
  28 * next_zone - helper magic for for_each_zone()
  29 */
  30struct zone *next_zone(struct zone *zone)
  31{
  32        pg_data_t *pgdat = zone->zone_pgdat;
  33
  34        if (zone < pgdat->node_zones + MAX_NR_ZONES - 1)
  35                zone++;
  36        else {
  37                pgdat = next_online_pgdat(pgdat);
  38                if (pgdat)
  39                        zone = pgdat->node_zones;
  40                else
  41                        zone = NULL;
  42        }
  43        return zone;
  44}
  45
  46static inline int zref_in_nodemask(struct zoneref *zref, nodemask_t *nodes)
  47{
  48#ifdef CONFIG_NUMA
  49        return node_isset(zonelist_node_idx(zref), *nodes);
  50#else
  51        return 1;
  52#endif /* CONFIG_NUMA */
  53}
  54
  55/* Returns the next zone at or below highest_zoneidx in a zonelist */
  56struct zoneref *next_zones_zonelist(struct zoneref *z,
  57                                        enum zone_type highest_zoneidx,
  58                                        nodemask_t *nodes,
  59                                        struct zone **zone)
  60{
  61        /*
  62         * Find the next suitable zone to use for the allocation.
  63         * Only filter based on nodemask if it's set
  64         */
  65        if (likely(nodes == NULL))
  66                while (zonelist_zone_idx(z) > highest_zoneidx)
  67                        z++;
  68        else
  69                while (zonelist_zone_idx(z) > highest_zoneidx ||
  70                                (z->zone && !zref_in_nodemask(z, nodes)))
  71                        z++;
  72
  73        *zone = zonelist_zone(z);
  74        return z;
  75}
  76
  77#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
  78int memmap_valid_within(unsigned long pfn,
  79                                        struct page *page, struct zone *zone)
  80{
  81        if (page_to_pfn(page) != pfn)
  82                return 0;
  83
  84        if (page_zone(page) != zone)
  85                return 0;
  86
  87        return 1;
  88}
  89#endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */
  90