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
  12struct pglist_data *first_online_pgdat(void)
  13{
  14        return NODE_DATA(first_online_node);
  15}
  16
  17struct pglist_data *next_online_pgdat(struct pglist_data *pgdat)
  18{
  19        int nid = next_online_node(pgdat->node_id);
  20
  21        if (nid == MAX_NUMNODES)
  22                return NULL;
  23        return NODE_DATA(nid);
  24}
  25
  26/*
  27 * next_zone - helper magic for for_each_zone()
  28 */
  29struct zone *next_zone(struct zone *zone)
  30{
  31        pg_data_t *pgdat = zone->zone_pgdat;
  32
  33        if (zone < pgdat->node_zones + MAX_NR_ZONES - 1)
  34                zone++;
  35        else {
  36                pgdat = next_online_pgdat(pgdat);
  37                if (pgdat)
  38                        zone = pgdat->node_zones;
  39                else
  40                        zone = NULL;
  41        }
  42        return zone;
  43}
  44
  45static inline int zref_in_nodemask(struct zoneref *zref, nodemask_t *nodes)
  46{
  47#ifdef CONFIG_NUMA
  48        return node_isset(zonelist_node_idx(zref), *nodes);
  49#else
  50        return 1;
  51#endif /* CONFIG_NUMA */
  52}
  53
  54/* Returns the next zone at or below highest_zoneidx in a zonelist */
  55struct zoneref *next_zones_zonelist(struct zoneref *z,
  56                                        enum zone_type highest_zoneidx,
  57                                        nodemask_t *nodes,
  58                                        struct zone **zone)
  59{
  60        /*
  61         * Find the next suitable zone to use for the allocation.
  62         * Only filter based on nodemask if it's set
  63         */
  64        if (likely(nodes == NULL))
  65                while (zonelist_zone_idx(z) > highest_zoneidx)
  66                        z++;
  67        else
  68                while (zonelist_zone_idx(z) > highest_zoneidx ||
  69                                (z->zone && !zref_in_nodemask(z, nodes)))
  70                        z++;
  71
  72        *zone = zonelist_zone(z);
  73        return z;
  74}
  75
  76#ifdef CONFIG_ARCH_HAS_HOLES_MEMORYMODEL
  77int memmap_valid_within(unsigned long pfn,
  78                                        struct page *page, struct zone *zone)
  79{
  80        if (page_to_pfn(page) != pfn)
  81                return 0;
  82
  83        if (page_zone(page) != zone)
  84                return 0;
  85
  86        return 1;
  87}
  88#endif /* CONFIG_ARCH_HAS_HOLES_MEMORYMODEL */
  89
  90void lruvec_init(struct lruvec *lruvec, struct zone *zone)
  91{
  92        enum lru_list lru;
  93
  94        memset(lruvec, 0, sizeof(struct lruvec));
  95
  96        for_each_lru(lru)
  97                INIT_LIST_HEAD(&lruvec->lists[lru]);
  98
  99#ifdef CONFIG_MEMCG
 100        lruvec->zone = zone;
 101#endif
 102}
 103
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.