swap.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:6k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _LINUX_SWAP_H
  2. #define _LINUX_SWAP_H
  3. #include <linux/spinlock.h>
  4. #include <asm/page.h>
  5. #define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */
  6. #define SWAP_FLAG_PRIO_MASK 0x7fff
  7. #define SWAP_FLAG_PRIO_SHIFT 0
  8. #define MAX_SWAPFILES 32
  9. /*
  10.  * Magic header for a swap area. The first part of the union is
  11.  * what the swap magic looks like for the old (limited to 128MB)
  12.  * swap area format, the second part of the union adds - in the
  13.  * old reserved area - some extra information. Note that the first
  14.  * kilobyte is reserved for boot loader or disk label stuff...
  15.  *
  16.  * Having the magic at the end of the PAGE_SIZE makes detecting swap
  17.  * areas somewhat tricky on machines that support multiple page sizes.
  18.  * For 2.5 we'll probably want to move the magic to just beyond the
  19.  * bootbits...
  20.  */
  21. union swap_header {
  22. struct 
  23. {
  24. char reserved[PAGE_SIZE - 10];
  25. char magic[10]; /* SWAP-SPACE or SWAPSPACE2 */
  26. } magic;
  27. struct 
  28. {
  29. char      bootbits[1024]; /* Space for disklabel etc. */
  30. unsigned int version;
  31. unsigned int last_page;
  32. unsigned int nr_badpages;
  33. unsigned int padding[125];
  34. unsigned int badpages[1];
  35. } info;
  36. };
  37. #ifdef __KERNEL__
  38. /*
  39.  * Max bad pages in the new format..
  40.  */
  41. #define __swapoffset(x) ((unsigned long)&((union swap_header *)0)->x)
  42. #define MAX_SWAP_BADPAGES 
  43. ((__swapoffset(magic.magic) - __swapoffset(info.badpages)) / sizeof(int))
  44. #include <asm/atomic.h>
  45. #define SWP_USED 1
  46. #define SWP_WRITEOK 3
  47. #define SWAP_CLUSTER_MAX 32
  48. #define SWAP_MAP_MAX 0x7fff
  49. #define SWAP_MAP_BAD 0x8000
  50. /*
  51.  * The in-memory structure used to track swap areas.
  52.  */
  53. struct swap_info_struct {
  54. unsigned int flags;
  55. kdev_t swap_device;
  56. spinlock_t sdev_lock;
  57. struct dentry * swap_file;
  58. struct vfsmount *swap_vfsmnt;
  59. unsigned short * swap_map;
  60. unsigned int lowest_bit;
  61. unsigned int highest_bit;
  62. unsigned int cluster_next;
  63. unsigned int cluster_nr;
  64. int prio; /* swap priority */
  65. int pages;
  66. unsigned long max;
  67. int next; /* next entry on swap list */
  68. };
  69. extern int nr_swap_pages;
  70. /* Swap 50% full? Release swapcache more aggressively.. */
  71. #define vm_swap_full() (nr_swap_pages*2 < total_swap_pages)
  72. extern unsigned int nr_free_pages(void);
  73. extern unsigned int nr_free_buffer_pages(void);
  74. extern int nr_active_pages;
  75. extern int nr_inactive_pages;
  76. extern atomic_t page_cache_size;
  77. extern atomic_t buffermem_pages;
  78. extern spinlock_cacheline_t pagecache_lock_cacheline;
  79. #define pagecache_lock (pagecache_lock_cacheline.lock)
  80. extern void __remove_inode_page(struct page *);
  81. /* Incomplete types for prototype declarations: */
  82. struct task_struct;
  83. struct vm_area_struct;
  84. struct sysinfo;
  85. struct zone_t;
  86. /* linux/mm/swap.c */
  87. extern void FASTCALL(lru_cache_add(struct page *));
  88. extern void FASTCALL(__lru_cache_del(struct page *));
  89. extern void FASTCALL(lru_cache_del(struct page *));
  90. extern void FASTCALL(activate_page(struct page *));
  91. extern void swap_setup(void);
  92. /* linux/mm/vmscan.c */
  93. extern wait_queue_head_t kswapd_wait;
  94. extern int FASTCALL(try_to_free_pages_zone(zone_t *, unsigned int));
  95. extern int FASTCALL(try_to_free_pages(unsigned int));
  96. /* linux/mm/page_io.c */
  97. extern void rw_swap_page(int, struct page *);
  98. extern void rw_swap_page_nolock(int, swp_entry_t, char *);
  99. /* linux/mm/page_alloc.c */
  100. /* linux/mm/swap_state.c */
  101. #define SWAP_CACHE_INFO
  102. #ifdef SWAP_CACHE_INFO
  103. extern void show_swap_cache_info(void);
  104. #endif
  105. extern int add_to_swap_cache(struct page *, swp_entry_t);
  106. extern void __delete_from_swap_cache(struct page *page);
  107. extern void delete_from_swap_cache(struct page *page);
  108. extern void free_page_and_swap_cache(struct page *page);
  109. extern struct page * lookup_swap_cache(swp_entry_t);
  110. extern struct page * read_swap_cache_async(swp_entry_t);
  111. /* linux/mm/oom_kill.c */
  112. extern void out_of_memory(void);
  113. /* linux/mm/swapfile.c */
  114. extern int total_swap_pages;
  115. extern unsigned int nr_swapfiles;
  116. extern struct swap_info_struct swap_info[];
  117. extern int is_swap_partition(kdev_t);
  118. extern void si_swapinfo(struct sysinfo *);
  119. extern swp_entry_t get_swap_page(void);
  120. extern void get_swaphandle_info(swp_entry_t, unsigned long *, kdev_t *, 
  121. struct inode **);
  122. extern int swap_duplicate(swp_entry_t);
  123. extern int swap_count(struct page *);
  124. extern int valid_swaphandles(swp_entry_t, unsigned long *);
  125. extern void swap_free(swp_entry_t);
  126. extern void free_swap_and_cache(swp_entry_t);
  127. struct swap_list_t {
  128. int head; /* head of priority-ordered swapfile list */
  129. int next; /* swapfile to be used next */
  130. };
  131. extern struct swap_list_t swap_list;
  132. asmlinkage long sys_swapoff(const char *);
  133. asmlinkage long sys_swapon(const char *, int);
  134. extern spinlock_cacheline_t pagemap_lru_lock_cacheline;
  135. #define pagemap_lru_lock pagemap_lru_lock_cacheline.lock
  136. extern void FASTCALL(mark_page_accessed(struct page *));
  137. /*
  138.  * List add/del helper macros. These must be called
  139.  * with the pagemap_lru_lock held!
  140.  */
  141. #define DEBUG_LRU_PAGE(page)
  142. do {
  143. if (!PageLRU(page))
  144. BUG();
  145. if (PageActive(page))
  146. BUG();
  147. } while (0)
  148. #define add_page_to_active_list(page)
  149. do {
  150. DEBUG_LRU_PAGE(page);
  151. SetPageActive(page);
  152. list_add(&(page)->lru, &active_list);
  153. nr_active_pages++;
  154. } while (0)
  155. #define add_page_to_inactive_list(page)
  156. do {
  157. DEBUG_LRU_PAGE(page);
  158. list_add(&(page)->lru, &inactive_list);
  159. nr_inactive_pages++;
  160. } while (0)
  161. #define del_page_from_active_list(page)
  162. do {
  163. list_del(&(page)->lru);
  164. ClearPageActive(page);
  165. nr_active_pages--;
  166. } while (0)
  167. #define del_page_from_inactive_list(page)
  168. do {
  169. list_del(&(page)->lru);
  170. nr_inactive_pages--;
  171. } while (0)
  172. extern spinlock_t swaplock;
  173. #define swap_list_lock() spin_lock(&swaplock)
  174. #define swap_list_unlock() spin_unlock(&swaplock)
  175. #define swap_device_lock(p) spin_lock(&p->sdev_lock)
  176. #define swap_device_unlock(p) spin_unlock(&p->sdev_lock)
  177. extern void shmem_unuse(swp_entry_t entry, struct page *page);
  178. #endif /* __KERNEL__*/
  179. #endif /* _LINUX_SWAP_H */