home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / linux / mmzone.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  18.8 KB  |  615 lines

  1. #ifndef _LINUX_MMZONE_H
  2. #define _LINUX_MMZONE_H
  3.  
  4. #ifdef __KERNEL__
  5. #ifndef __ASSEMBLY__
  6.  
  7. #include <linux/spinlock.h>
  8. #include <linux/list.h>
  9. #include <linux/wait.h>
  10. #include <linux/cache.h>
  11. #include <linux/threads.h>
  12. #include <linux/numa.h>
  13. #include <linux/init.h>
  14. #include <linux/seqlock.h>
  15. #include <linux/nodemask.h>
  16. #include <asm/atomic.h>
  17. #include <asm/page.h>
  18.  
  19. /* Free memory management - zoned buddy allocator.  */
  20. #ifndef CONFIG_FORCE_MAX_ZONEORDER
  21. #define MAX_ORDER 11
  22. #else
  23. #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
  24. #endif
  25. #define MAX_ORDER_NR_PAGES (1 << (MAX_ORDER - 1))
  26.  
  27. struct free_area {
  28.     struct list_head    free_list;
  29.     unsigned long        nr_free;
  30. };
  31.  
  32. struct pglist_data;
  33.  
  34. /*
  35.  * zone->lock and zone->lru_lock are two of the hottest locks in the kernel.
  36.  * So add a wild amount of padding here to ensure that they fall into separate
  37.  * cachelines.  There are very few zone structures in the machine, so space
  38.  * consumption is not a concern here.
  39.  */
  40. #if defined(CONFIG_SMP)
  41. struct zone_padding {
  42.     char x[0];
  43. } ____cacheline_internodealigned_in_smp;
  44. #define ZONE_PADDING(name)    struct zone_padding name;
  45. #else
  46. #define ZONE_PADDING(name)
  47. #endif
  48.  
  49. struct per_cpu_pages {
  50.     int count;        /* number of pages in the list */
  51.     int high;        /* high watermark, emptying needed */
  52.     int batch;        /* chunk size for buddy add/remove */
  53.     struct list_head list;    /* the list of pages */
  54. };
  55.  
  56. struct per_cpu_pageset {
  57.     struct per_cpu_pages pcp[2];    /* 0: hot.  1: cold */
  58. #ifdef CONFIG_NUMA
  59.     unsigned long numa_hit;        /* allocated in intended node */
  60.     unsigned long numa_miss;    /* allocated in non intended node */
  61.     unsigned long numa_foreign;    /* was intended here, hit elsewhere */
  62.     unsigned long interleave_hit;     /* interleaver prefered this zone */
  63.     unsigned long local_node;    /* allocation from local node */
  64.     unsigned long other_node;    /* allocation from other node */
  65. #endif
  66. } ____cacheline_aligned_in_smp;
  67.  
  68. #ifdef CONFIG_NUMA
  69. #define zone_pcp(__z, __cpu) ((__z)->pageset[(__cpu)])
  70. #else
  71. #define zone_pcp(__z, __cpu) (&(__z)->pageset[(__cpu)])
  72. #endif
  73.  
  74. #define ZONE_DMA        0
  75. #define ZONE_DMA32        1
  76. #define ZONE_NORMAL        2
  77. #define ZONE_HIGHMEM        3
  78.  
  79. #define MAX_NR_ZONES        4    /* Sync this with ZONES_SHIFT */
  80. #define ZONES_SHIFT        2    /* ceil(log2(MAX_NR_ZONES)) */
  81.  
  82.  
  83. /*
  84.  * When a memory allocation must conform to specific limitations (such
  85.  * as being suitable for DMA) the caller will pass in hints to the
  86.  * allocator in the gfp_mask, in the zone modifier bits.  These bits
  87.  * are used to select a priority ordered list of memory zones which
  88.  * match the requested limits.  GFP_ZONEMASK defines which bits within
  89.  * the gfp_mask should be considered as zone modifiers.  Each valid
  90.  * combination of the zone modifier bits has a corresponding list
  91.  * of zones (in node_zonelists).  Thus for two zone modifiers there
  92.  * will be a maximum of 4 (2 ** 2) zonelists, for 3 modifiers there will
  93.  * be 8 (2 ** 3) zonelists.  GFP_ZONETYPES defines the number of possible
  94.  * combinations of zone modifiers in "zone modifier space".
  95.  *
  96.  * As an optimisation any zone modifier bits which are only valid when
  97.  * no other zone modifier bits are set (loners) should be placed in
  98.  * the highest order bits of this field.  This allows us to reduce the
  99.  * extent of the zonelists thus saving space.  For example in the case
  100.  * of three zone modifier bits, we could require up to eight zonelists.
  101.  * If the left most zone modifier is a "loner" then the highest valid
  102.  * zonelist would be four allowing us to allocate only five zonelists.
  103.  * Use the first form for GFP_ZONETYPES when the left most bit is not
  104.  * a "loner", otherwise use the second.
  105.  *
  106.  * NOTE! Make sure this matches the zones in <linux/gfp.h>
  107.  */
  108. #define GFP_ZONEMASK    0x07
  109. /* #define GFP_ZONETYPES       (GFP_ZONEMASK + 1) */           /* Non-loner */
  110. #define GFP_ZONETYPES  ((GFP_ZONEMASK + 1) / 2 + 1)            /* Loner */
  111.  
  112. /*
  113.  * On machines where it is needed (eg PCs) we divide physical memory
  114.  * into multiple physical zones. On a 32bit PC we have 4 zones:
  115.  *
  116.  * ZONE_DMA      < 16 MB    ISA DMA capable memory
  117.  * ZONE_DMA32         0 MB     Empty
  118.  * ZONE_NORMAL    16-896 MB    direct mapped by the kernel
  119.  * ZONE_HIGHMEM     > 896 MB    only page cache and user processes
  120.  */
  121.  
  122. struct zone {
  123.     /* Fields commonly accessed by the page allocator */
  124.     unsigned long        free_pages;
  125.     unsigned long        pages_min, pages_low, pages_high;
  126.     /*
  127.      * We don't know if the memory that we're going to allocate will be freeable
  128.      * or/and it will be released eventually, so to avoid totally wasting several
  129.      * GB of ram we must reserve some of the lower zone memory (otherwise we risk
  130.      * to run OOM on the lower zones despite there's tons of freeable ram
  131.      * on the higher zones). This array is recalculated at runtime if the
  132.      * sysctl_lowmem_reserve_ratio sysctl changes.
  133.      */
  134.     unsigned long        lowmem_reserve[MAX_NR_ZONES];
  135.  
  136. #ifdef CONFIG_NUMA
  137.     struct per_cpu_pageset    *pageset[NR_CPUS];
  138. #else
  139.     struct per_cpu_pageset    pageset[NR_CPUS];
  140. #endif
  141.     /*
  142.      * free areas of different sizes
  143.      */
  144.     spinlock_t        lock;
  145. #ifdef CONFIG_MEMORY_HOTPLUG
  146.     /* see spanned/present_pages for more description */
  147.     seqlock_t        span_seqlock;
  148. #endif
  149.     struct free_area    free_area[MAX_ORDER];
  150.  
  151.  
  152.     ZONE_PADDING(_pad1_)
  153.  
  154.     /* Fields commonly accessed by the page reclaim scanner */
  155.     spinlock_t        lru_lock;    
  156.     struct list_head    active_list;
  157.     struct list_head    inactive_list;
  158.     unsigned long        nr_scan_active;
  159.     unsigned long        nr_scan_inactive;
  160.     unsigned long        nr_active;
  161.     unsigned long        nr_inactive;
  162.     unsigned long        pages_scanned;       /* since last reclaim */
  163.     int            all_unreclaimable; /* All pages pinned */
  164.  
  165.     /* A count of how many reclaimers are scanning this zone */
  166.     atomic_t        reclaim_in_progress;
  167.  
  168.     /*
  169.      * timestamp (in jiffies) of the last zone reclaim that did not
  170.      * result in freeing of pages. This is used to avoid repeated scans
  171.      * if all memory in the zone is in use.
  172.      */
  173.     unsigned long        last_unsuccessful_zone_reclaim;
  174.  
  175.     /*
  176.      * prev_priority holds the scanning priority for this zone.  It is
  177.      * defined as the scanning priority at which we achieved our reclaim
  178.      * target at the previous try_to_free_pages() or balance_pgdat()
  179.      * invokation.
  180.      *
  181.      * We use prev_priority as a measure of how much stress page reclaim is
  182.      * under - it drives the swappiness decision: whether to unmap mapped
  183.      * pages.
  184.      *
  185.      * temp_priority is used to remember the scanning priority at which
  186.      * this zone was successfully refilled to free_pages == pages_high.
  187.      *
  188.      * Access to both these fields is quite racy even on uniprocessor.  But
  189.      * it is expected to average out OK.
  190.      */
  191.     int temp_priority;
  192.     int prev_priority;
  193.  
  194.  
  195.     ZONE_PADDING(_pad2_)
  196.     /* Rarely used or read-mostly fields */
  197.  
  198.     /*
  199.      * wait_table        -- the array holding the hash table
  200.      * wait_table_size    -- the size of the hash table array
  201.      * wait_table_bits    -- wait_table_size == (1 << wait_table_bits)
  202.      *
  203.      * The purpose of all these is to keep track of the people
  204.      * waiting for a page to become available and make them
  205.      * runnable again when possible. The trouble is that this
  206.      * consumes a lot of space, especially when so few things
  207.      * wait on pages at a given time. So instead of using
  208.      * per-page waitqueues, we use a waitqueue hash table.
  209.      *
  210.      * The bucket discipline is to sleep on the same queue when
  211.      * colliding and wake all in that wait queue when removing.
  212.      * When something wakes, it must check to be sure its page is
  213.      * truly available, a la thundering herd. The cost of a
  214.      * collision is great, but given the expected load of the
  215.      * table, they should be so rare as to be outweighed by the
  216.      * benefits from the saved space.
  217.      *
  218.      * __wait_on_page_locked() and unlock_page() in mm/filemap.c, are the
  219.      * primary users of these fields, and in mm/page_alloc.c
  220.      * free_area_init_core() performs the initialization of them.
  221.      */
  222.     wait_queue_head_t    * wait_table;
  223.     unsigned long        wait_table_size;
  224.     unsigned long        wait_table_bits;
  225.  
  226.     /*
  227.      * Discontig memory support fields.
  228.      */
  229.     struct pglist_data    *zone_pgdat;
  230.     /* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */
  231.     unsigned long        zone_start_pfn;
  232.  
  233.     /*
  234.      * zone_start_pfn, spanned_pages and present_pages are all
  235.      * protected by span_seqlock.  It is a seqlock because it has
  236.      * to be read outside of zone->lock, and it is done in the main
  237.      * allocator path.  But, it is written quite infrequently.
  238.      *
  239.      * The lock is declared along with zone->lock because it is
  240.      * frequently read in proximity to zone->lock.  It's good to
  241.      * give them a chance of being in the same cacheline.
  242.      */
  243.     unsigned long        spanned_pages;    /* total size, including holes */
  244.     unsigned long        present_pages;    /* amount of memory (excluding holes) */
  245.  
  246.     /*
  247.      * rarely used fields:
  248.      */
  249.     char            *name;
  250. } ____cacheline_internodealigned_in_smp;
  251.  
  252.  
  253. /*
  254.  * The "priority" of VM scanning is how much of the queues we will scan in one
  255.  * go. A value of 12 for DEF_PRIORITY implies that we will scan 1/4096th of the
  256.  * queues ("queue_length >> 12") during an aging round.
  257.  */
  258. #define DEF_PRIORITY 12
  259.  
  260. /*
  261.  * One allocation request operates on a zonelist. A zonelist
  262.  * is a list of zones, the first one is the 'goal' of the
  263.  * allocation, the other zones are fallback zones, in decreasing
  264.  * priority.
  265.  *
  266.  * Right now a zonelist takes up less than a cacheline. We never
  267.  * modify it apart from boot-up, and only a few indices are used,
  268.  * so despite the zonelist table being relatively big, the cache
  269.  * footprint of this construct is very small.
  270.  */
  271. struct zonelist {
  272.     struct zone *zones[MAX_NUMNODES * MAX_NR_ZONES + 1]; // NULL delimited
  273. };
  274.  
  275.  
  276. /*
  277.  * The pg_data_t structure is used in machines with CONFIG_DISCONTIGMEM
  278.  * (mostly NUMA machines?) to denote a higher-level memory zone than the
  279.  * zone denotes.
  280.  *
  281.  * On NUMA machines, each NUMA node would have a pg_data_t to describe
  282.  * it's memory layout.
  283.  *
  284.  * Memory statistics and page replacement data structures are maintained on a
  285.  * per-zone basis.
  286.  */
  287. struct bootmem_data;
  288. typedef struct pglist_data {
  289.     struct zone node_zones[MAX_NR_ZONES];
  290.     struct zonelist node_zonelists[GFP_ZONETYPES];
  291.     int nr_zones;
  292. #ifdef CONFIG_FLAT_NODE_MEM_MAP
  293.     struct page *node_mem_map;
  294. #endif
  295.     struct bootmem_data *bdata;
  296. #ifdef CONFIG_MEMORY_HOTPLUG
  297.     /*
  298.      * Must be held any time you expect node_start_pfn, node_present_pages
  299.      * or node_spanned_pages stay constant.  Holding this will also
  300.      * guarantee that any pfn_valid() stays that way.
  301.      *
  302.      * Nests above zone->lock and zone->size_seqlock.
  303.      */
  304.     spinlock_t node_size_lock;
  305. #endif
  306.     unsigned long node_start_pfn;
  307.     unsigned long node_present_pages; /* total number of physical pages */
  308.     unsigned long node_spanned_pages; /* total size of physical page
  309.                          range, including holes */
  310.     int node_id;
  311.     wait_queue_head_t kswapd_wait;
  312.     struct task_struct *kswapd;
  313.     int kswapd_max_order;
  314. } pg_data_t;
  315.  
  316. #define node_present_pages(nid)    (NODE_DATA(nid)->node_present_pages)
  317. #define node_spanned_pages(nid)    (NODE_DATA(nid)->node_spanned_pages)
  318. #ifdef CONFIG_FLAT_NODE_MEM_MAP
  319. #define pgdat_page_nr(pgdat, pagenr)    ((pgdat)->node_mem_map + (pagenr))
  320. #else
  321. #define pgdat_page_nr(pgdat, pagenr)    pfn_to_page((pgdat)->node_start_pfn + (pagenr))
  322. #endif
  323. #define nid_page_nr(nid, pagenr)     pgdat_page_nr(NODE_DATA(nid),(pagenr))
  324.  
  325. #include <linux/memory_hotplug.h>
  326.  
  327. void __get_zone_counts(unsigned long *active, unsigned long *inactive,
  328.             unsigned long *free, struct pglist_data *pgdat);
  329. void get_zone_counts(unsigned long *active, unsigned long *inactive,
  330.             unsigned long *free);
  331. void build_all_zonelists(void);
  332. void wakeup_kswapd(struct zone *zone, int order);
  333. int zone_watermark_ok(struct zone *z, int order, unsigned long mark,
  334.         int classzone_idx, int alloc_flags);
  335.  
  336. #ifdef CONFIG_HAVE_MEMORY_PRESENT
  337. void memory_present(int nid, unsigned long start, unsigned long end);
  338. #else
  339. static inline void memory_present(int nid, unsigned long start, unsigned long end) {}
  340. #endif
  341.  
  342. #ifdef CONFIG_NEED_NODE_MEMMAP_SIZE
  343. unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
  344. #endif
  345.  
  346. /*
  347.  * zone_idx() returns 0 for the ZONE_DMA zone, 1 for the ZONE_NORMAL zone, etc.
  348.  */
  349. #define zone_idx(zone)        ((zone) - (zone)->zone_pgdat->node_zones)
  350.  
  351. static inline int populated_zone(struct zone *zone)
  352. {
  353.     return (!!zone->present_pages);
  354. }
  355.  
  356. static inline int is_highmem_idx(int idx)
  357. {
  358.     return (idx == ZONE_HIGHMEM);
  359. }
  360.  
  361. static inline int is_normal_idx(int idx)
  362. {
  363.     return (idx == ZONE_NORMAL);
  364. }
  365.  
  366. /**
  367.  * is_highmem - helper function to quickly check if a struct zone is a 
  368.  *              highmem zone or not.  This is an attempt to keep references
  369.  *              to ZONE_{DMA/NORMAL/HIGHMEM/etc} in general code to a minimum.
  370.  * @zone - pointer to struct zone variable
  371.  */
  372. static inline int is_highmem(struct zone *zone)
  373. {
  374.     return zone == zone->zone_pgdat->node_zones + ZONE_HIGHMEM;
  375. }
  376.  
  377. static inline int is_normal(struct zone *zone)
  378. {
  379.     return zone == zone->zone_pgdat->node_zones + ZONE_NORMAL;
  380. }
  381.  
  382. static inline int is_dma32(struct zone *zone)
  383. {
  384.     return zone == zone->zone_pgdat->node_zones + ZONE_DMA32;
  385. }
  386.  
  387. static inline int is_dma(struct zone *zone)
  388. {
  389.     return zone == zone->zone_pgdat->node_zones + ZONE_DMA;
  390. }
  391.  
  392. /* These two functions are used to setup the per zone pages min values */
  393. struct ctl_table;
  394. struct file;
  395. int min_free_kbytes_sysctl_handler(struct ctl_table *, int, struct file *, 
  396.                     void __user *, size_t *, loff_t *);
  397. extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1];
  398. int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, struct file *,
  399.                     void __user *, size_t *, loff_t *);
  400. int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int, struct file *,
  401.                     void __user *, size_t *, loff_t *);
  402.  
  403. #include <linux/topology.h>
  404. /* Returns the number of the current Node. */
  405. #ifndef numa_node_id
  406. #define numa_node_id()        (cpu_to_node(raw_smp_processor_id()))
  407. #endif
  408.  
  409. #ifndef CONFIG_NEED_MULTIPLE_NODES
  410.  
  411. extern struct pglist_data contig_page_data;
  412. #define NODE_DATA(nid)        (&contig_page_data)
  413. #define NODE_MEM_MAP(nid)    mem_map
  414. #define MAX_NODES_SHIFT        1
  415.  
  416. #else /* CONFIG_NEED_MULTIPLE_NODES */
  417.  
  418. #include <asm/mmzone.h>
  419.  
  420. #endif /* !CONFIG_NEED_MULTIPLE_NODES */
  421.  
  422. extern struct pglist_data *first_online_pgdat(void);
  423. extern struct pglist_data *next_online_pgdat(struct pglist_data *pgdat);
  424. extern struct zone *next_zone(struct zone *zone);
  425.  
  426. /**
  427.  * for_each_pgdat - helper macro to iterate over all nodes
  428.  * @pgdat - pointer to a pg_data_t variable
  429.  */
  430. #define for_each_online_pgdat(pgdat)            \
  431.     for (pgdat = first_online_pgdat();        \
  432.          pgdat;                    \
  433.          pgdat = next_online_pgdat(pgdat))
  434. /**
  435.  * for_each_zone - helper macro to iterate over all memory zones
  436.  * @zone - pointer to struct zone variable
  437.  *
  438.  * The user only needs to declare the zone variable, for_each_zone
  439.  * fills it in.
  440.  */
  441. #define for_each_zone(zone)                    \
  442.     for (zone = (first_online_pgdat())->node_zones; \
  443.          zone;                    \
  444.          zone = next_zone(zone))
  445.  
  446. #ifdef CONFIG_SPARSEMEM
  447. #include <asm/sparsemem.h>
  448. #endif
  449.  
  450. #if BITS_PER_LONG == 32
  451. /*
  452.  * with 32 bit page->flags field, we reserve 9 bits for node/zone info.
  453.  * there are 4 zones (3 bits) and this leaves 9-3=6 bits for nodes.
  454.  */
  455. #define FLAGS_RESERVED        9
  456.  
  457. #elif BITS_PER_LONG == 64
  458. /*
  459.  * with 64 bit flags field, there's plenty of room.
  460.  */
  461. #define FLAGS_RESERVED        32
  462.  
  463. #else
  464.  
  465. #error BITS_PER_LONG not defined
  466.  
  467. #endif
  468.  
  469. #ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
  470. #define early_pfn_to_nid(nid)  (0UL)
  471. #endif
  472.  
  473. #ifdef CONFIG_FLATMEM
  474. #define pfn_to_nid(pfn)        (0)
  475. #endif
  476.  
  477. #define pfn_to_section_nr(pfn) ((pfn) >> PFN_SECTION_SHIFT)
  478. #define section_nr_to_pfn(sec) ((sec) << PFN_SECTION_SHIFT)
  479.  
  480. #ifdef CONFIG_SPARSEMEM
  481.  
  482. /*
  483.  * SECTION_SHIFT            #bits space required to store a section #
  484.  *
  485.  * PA_SECTION_SHIFT        physical address to/from section number
  486.  * PFN_SECTION_SHIFT        pfn to/from section number
  487.  */
  488. #define SECTIONS_SHIFT        (MAX_PHYSMEM_BITS - SECTION_SIZE_BITS)
  489.  
  490. #define PA_SECTION_SHIFT    (SECTION_SIZE_BITS)
  491. #define PFN_SECTION_SHIFT    (SECTION_SIZE_BITS - PAGE_SHIFT)
  492.  
  493. #define NR_MEM_SECTIONS        (1UL << SECTIONS_SHIFT)
  494.  
  495. #define PAGES_PER_SECTION       (1UL << PFN_SECTION_SHIFT)
  496. #define PAGE_SECTION_MASK    (~(PAGES_PER_SECTION-1))
  497.  
  498. #if (MAX_ORDER - 1 + PAGE_SHIFT) > SECTION_SIZE_BITS
  499. #error Allocator MAX_ORDER exceeds SECTION_SIZE
  500. #endif
  501.  
  502. struct page;
  503. struct mem_section {
  504.     /*
  505.      * This is, logically, a pointer to an array of struct
  506.      * pages.  However, it is stored with some other magic.
  507.      * (see sparse.c::sparse_init_one_section())
  508.      *
  509.      * Making it a UL at least makes someone do a cast
  510.      * before using it wrong.
  511.      */
  512.     unsigned long section_mem_map;
  513. };
  514.  
  515. #ifdef CONFIG_SPARSEMEM_EXTREME
  516. #define SECTIONS_PER_ROOT       (PAGE_SIZE / sizeof (struct mem_section))
  517. #else
  518. #define SECTIONS_PER_ROOT    1
  519. #endif
  520.  
  521. #define SECTION_NR_TO_ROOT(sec)    ((sec) / SECTIONS_PER_ROOT)
  522. #define NR_SECTION_ROOTS    (NR_MEM_SECTIONS / SECTIONS_PER_ROOT)
  523. #define SECTION_ROOT_MASK    (SECTIONS_PER_ROOT - 1)
  524.  
  525. #ifdef CONFIG_SPARSEMEM_EXTREME
  526. extern struct mem_section *mem_section[NR_SECTION_ROOTS];
  527. #else
  528. extern struct mem_section mem_section[NR_SECTION_ROOTS][SECTIONS_PER_ROOT];
  529. #endif
  530.  
  531. static inline struct mem_section *__nr_to_section(unsigned long nr)
  532. {
  533.     if (!mem_section[SECTION_NR_TO_ROOT(nr)])
  534.         return NULL;
  535.     return &mem_section[SECTION_NR_TO_ROOT(nr)][nr & SECTION_ROOT_MASK];
  536. }
  537. extern int __section_nr(struct mem_section* ms);
  538.  
  539. /*
  540.  * We use the lower bits of the mem_map pointer to store
  541.  * a little bit of information.  There should be at least
  542.  * 3 bits here due to 32-bit alignment.
  543.  */
  544. #define    SECTION_MARKED_PRESENT    (1UL<<0)
  545. #define SECTION_HAS_MEM_MAP    (1UL<<1)
  546. #define SECTION_MAP_LAST_BIT    (1UL<<2)
  547. #define SECTION_MAP_MASK    (~(SECTION_MAP_LAST_BIT-1))
  548.  
  549. static inline struct page *__section_mem_map_addr(struct mem_section *section)
  550. {
  551.     unsigned long map = section->section_mem_map;
  552.     map &= SECTION_MAP_MASK;
  553.     return (struct page *)map;
  554. }
  555.  
  556. static inline int valid_section(struct mem_section *section)
  557. {
  558.     return (section && (section->section_mem_map & SECTION_MARKED_PRESENT));
  559. }
  560.  
  561. static inline int section_has_mem_map(struct mem_section *section)
  562. {
  563.     return (section && (section->section_mem_map & SECTION_HAS_MEM_MAP));
  564. }
  565.  
  566. static inline int valid_section_nr(unsigned long nr)
  567. {
  568.     return valid_section(__nr_to_section(nr));
  569. }
  570.  
  571. static inline struct mem_section *__pfn_to_section(unsigned long pfn)
  572. {
  573.     return __nr_to_section(pfn_to_section_nr(pfn));
  574. }
  575.  
  576. static inline int pfn_valid(unsigned long pfn)
  577. {
  578.     if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS)
  579.         return 0;
  580.     return valid_section(__nr_to_section(pfn_to_section_nr(pfn)));
  581. }
  582.  
  583. /*
  584.  * These are _only_ used during initialisation, therefore they
  585.  * can use __initdata ...  They could have names to indicate
  586.  * this restriction.
  587.  */
  588. #ifdef CONFIG_NUMA
  589. #define pfn_to_nid(pfn)                            \
  590. ({                                    \
  591.     unsigned long __pfn_to_nid_pfn = (pfn);                \
  592.     page_to_nid(pfn_to_page(__pfn_to_nid_pfn));            \
  593. })
  594. #else
  595. #define pfn_to_nid(pfn)        (0)
  596. #endif
  597.  
  598. #define early_pfn_valid(pfn)    pfn_valid(pfn)
  599. void sparse_init(void);
  600. #else
  601. #define sparse_init()    do {} while (0)
  602. #define sparse_index_init(_sec, _nid)  do {} while (0)
  603. #endif /* CONFIG_SPARSEMEM */
  604.  
  605. #ifndef early_pfn_valid
  606. #define early_pfn_valid(pfn)    (1)
  607. #endif
  608.  
  609. void memory_present(int nid, unsigned long start, unsigned long end);
  610. unsigned long __init node_memmap_size_bytes(int, unsigned long, unsigned long);
  611.  
  612. #endif /* !__ASSEMBLY__ */
  613. #endif /* __KERNEL__ */
  614. #endif /* _LINUX_MMZONE_H */
  615.