mmzone.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _LINUX_MMZONE_H
  2. #define _LINUX_MMZONE_H
  3. #ifdef __KERNEL__
  4. #ifndef __ASSEMBLY__
  5. #include <linux/config.h>
  6. #include <linux/spinlock.h>
  7. #include <linux/list.h>
  8. /*
  9.  * Free memory management - zoned buddy allocator.
  10.  */
  11. #ifndef CONFIG_FORCE_MAX_ZONEORDER
  12. #define MAX_ORDER 10
  13. #else
  14. #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER
  15. #endif
  16. typedef struct free_area_struct {
  17. struct list_head free_list;
  18. unsigned long *map;
  19. } free_area_t;
  20. struct pglist_data;
  21. /*
  22.  * On machines where it is needed (eg PCs) we divide physical memory
  23.  * into multiple physical zones. On a PC we have 3 zones:
  24.  *
  25.  * ZONE_DMA   < 16 MB ISA DMA capable memory
  26.  * ZONE_NORMAL 16-896 MB direct mapped by the kernel
  27.  * ZONE_HIGHMEM  > 896 MB only page cache and user processes
  28.  */
  29. typedef struct zone_struct {
  30. /*
  31.  * Commonly accessed fields:
  32.  */
  33. spinlock_t lock;
  34. unsigned long free_pages;
  35. unsigned long pages_min, pages_low, pages_high;
  36. int need_balance;
  37. /*
  38.  * free areas of different sizes
  39.  */
  40. free_area_t free_area[MAX_ORDER];
  41. /*
  42.  * Discontig memory support fields.
  43.  */
  44. struct pglist_data *zone_pgdat;
  45. struct page *zone_mem_map;
  46. unsigned long zone_start_paddr;
  47. unsigned long zone_start_mapnr;
  48. /*
  49.  * rarely used fields:
  50.  */
  51. char *name;
  52. unsigned long size;
  53. } zone_t;
  54. #define ZONE_DMA 0
  55. #define ZONE_NORMAL 1
  56. #define ZONE_HIGHMEM 2
  57. #define MAX_NR_ZONES 3
  58. /*
  59.  * One allocation request operates on a zonelist. A zonelist
  60.  * is a list of zones, the first one is the 'goal' of the
  61.  * allocation, the other zones are fallback zones, in decreasing
  62.  * priority.
  63.  *
  64.  * Right now a zonelist takes up less than a cacheline. We never
  65.  * modify it apart from boot-up, and only a few indices are used,
  66.  * so despite the zonelist table being relatively big, the cache
  67.  * footprint of this construct is very small.
  68.  */
  69. typedef struct zonelist_struct {
  70. zone_t * zones [MAX_NR_ZONES+1]; // NULL delimited
  71. } zonelist_t;
  72. #define GFP_ZONEMASK 0x0f
  73. /*
  74.  * The pg_data_t structure is used in machines with CONFIG_DISCONTIGMEM
  75.  * (mostly NUMA machines?) to denote a higher-level memory zone than the
  76.  * zone_struct denotes.
  77.  *
  78.  * On NUMA machines, each NUMA node would have a pg_data_t to describe
  79.  * it's memory layout.
  80.  *
  81.  * XXX: we need to move the global memory statistics (active_list, ...)
  82.  *      into the pg_data_t to properly support NUMA.
  83.  */
  84. struct bootmem_data;
  85. typedef struct pglist_data {
  86. zone_t node_zones[MAX_NR_ZONES];
  87. zonelist_t node_zonelists[GFP_ZONEMASK+1];
  88. int nr_zones;
  89. struct page *node_mem_map;
  90. unsigned long *valid_addr_bitmap;
  91. struct bootmem_data *bdata;
  92. unsigned long node_start_paddr;
  93. unsigned long node_start_mapnr;
  94. unsigned long node_size;
  95. int node_id;
  96. struct pglist_data *node_next;
  97. } pg_data_t;
  98. extern int numnodes;
  99. extern pg_data_t *pgdat_list;
  100. #define memclass(pgzone, classzone) (((pgzone)->zone_pgdat == (classzone)->zone_pgdat) 
  101. && ((pgzone) <= (classzone)))
  102. /*
  103.  * The following two are not meant for general usage. They are here as
  104.  * prototypes for the discontig memory code.
  105.  */
  106. struct page;
  107. extern void show_free_areas_core(pg_data_t *pgdat);
  108. extern void free_area_init_core(int nid, pg_data_t *pgdat, struct page **gmap,
  109.   unsigned long *zones_size, unsigned long paddr, unsigned long *zholes_size,
  110.   struct page *pmap);
  111. extern pg_data_t contig_page_data;
  112. #ifndef CONFIG_DISCONTIGMEM
  113. #define NODE_DATA(nid) (&contig_page_data)
  114. #define NODE_MEM_MAP(nid) mem_map
  115. #else /* !CONFIG_DISCONTIGMEM */
  116. #include <asm/mmzone.h>
  117. #endif /* !CONFIG_DISCONTIGMEM */
  118. #define MAP_ALIGN(x) ((((x) % sizeof(mem_map_t)) == 0) ? (x) : ((x) + 
  119. sizeof(mem_map_t) - ((x) % sizeof(mem_map_t))))
  120. #endif /* !__ASSEMBLY__ */
  121. #endif /* __KERNEL__ */
  122. #endif /* _LINUX_MMZONE_H */