at v2.6.26 360 lines 10 kB view raw
1#ifndef _LINUX_SWAP_H 2#define _LINUX_SWAP_H 3 4#include <linux/spinlock.h> 5#include <linux/linkage.h> 6#include <linux/mmzone.h> 7#include <linux/list.h> 8#include <linux/memcontrol.h> 9#include <linux/sched.h> 10 11#include <asm/atomic.h> 12#include <asm/page.h> 13 14struct notifier_block; 15 16struct bio; 17 18#define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */ 19#define SWAP_FLAG_PRIO_MASK 0x7fff 20#define SWAP_FLAG_PRIO_SHIFT 0 21 22static inline int current_is_kswapd(void) 23{ 24 return current->flags & PF_KSWAPD; 25} 26 27/* 28 * MAX_SWAPFILES defines the maximum number of swaptypes: things which can 29 * be swapped to. The swap type and the offset into that swap type are 30 * encoded into pte's and into pgoff_t's in the swapcache. Using five bits 31 * for the type means that the maximum number of swapcache pages is 27 bits 32 * on 32-bit-pgoff_t architectures. And that assumes that the architecture packs 33 * the type/offset into the pte as 5/27 as well. 34 */ 35#define MAX_SWAPFILES_SHIFT 5 36#ifndef CONFIG_MIGRATION 37#define MAX_SWAPFILES (1 << MAX_SWAPFILES_SHIFT) 38#else 39/* Use last two entries for page migration swap entries */ 40#define MAX_SWAPFILES ((1 << MAX_SWAPFILES_SHIFT)-2) 41#define SWP_MIGRATION_READ MAX_SWAPFILES 42#define SWP_MIGRATION_WRITE (MAX_SWAPFILES + 1) 43#endif 44 45/* 46 * Magic header for a swap area. The first part of the union is 47 * what the swap magic looks like for the old (limited to 128MB) 48 * swap area format, the second part of the union adds - in the 49 * old reserved area - some extra information. Note that the first 50 * kilobyte is reserved for boot loader or disk label stuff... 51 * 52 * Having the magic at the end of the PAGE_SIZE makes detecting swap 53 * areas somewhat tricky on machines that support multiple page sizes. 54 * For 2.5 we'll probably want to move the magic to just beyond the 55 * bootbits... 56 */ 57union swap_header { 58 struct { 59 char reserved[PAGE_SIZE - 10]; 60 char magic[10]; /* SWAP-SPACE or SWAPSPACE2 */ 61 } magic; 62 struct { 63 char bootbits[1024]; /* Space for disklabel etc. */ 64 __u32 version; 65 __u32 last_page; 66 __u32 nr_badpages; 67 unsigned char sws_uuid[16]; 68 unsigned char sws_volume[16]; 69 __u32 padding[117]; 70 __u32 badpages[1]; 71 } info; 72}; 73 74 /* A swap entry has to fit into a "unsigned long", as 75 * the entry is hidden in the "index" field of the 76 * swapper address space. 77 */ 78typedef struct { 79 unsigned long val; 80} swp_entry_t; 81 82/* 83 * current->reclaim_state points to one of these when a task is running 84 * memory reclaim 85 */ 86struct reclaim_state { 87 unsigned long reclaimed_slab; 88}; 89 90#ifdef __KERNEL__ 91 92struct address_space; 93struct sysinfo; 94struct writeback_control; 95struct zone; 96 97/* 98 * A swap extent maps a range of a swapfile's PAGE_SIZE pages onto a range of 99 * disk blocks. A list of swap extents maps the entire swapfile. (Where the 100 * term `swapfile' refers to either a blockdevice or an IS_REG file. Apart 101 * from setup, they're handled identically. 102 * 103 * We always assume that blocks are of size PAGE_SIZE. 104 */ 105struct swap_extent { 106 struct list_head list; 107 pgoff_t start_page; 108 pgoff_t nr_pages; 109 sector_t start_block; 110}; 111 112/* 113 * Max bad pages in the new format.. 114 */ 115#define __swapoffset(x) ((unsigned long)&((union swap_header *)0)->x) 116#define MAX_SWAP_BADPAGES \ 117 ((__swapoffset(magic.magic) - __swapoffset(info.badpages)) / sizeof(int)) 118 119enum { 120 SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ 121 SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ 122 SWP_ACTIVE = (SWP_USED | SWP_WRITEOK), 123 /* add others here before... */ 124 SWP_SCANNING = (1 << 8), /* refcount in scan_swap_map */ 125}; 126 127#define SWAP_CLUSTER_MAX 32 128 129#define SWAP_MAP_MAX 0x7fff 130#define SWAP_MAP_BAD 0x8000 131 132/* 133 * The in-memory structure used to track swap areas. 134 */ 135struct swap_info_struct { 136 unsigned int flags; 137 int prio; /* swap priority */ 138 struct file *swap_file; 139 struct block_device *bdev; 140 struct list_head extent_list; 141 struct swap_extent *curr_swap_extent; 142 unsigned old_block_size; 143 unsigned short * swap_map; 144 unsigned int lowest_bit; 145 unsigned int highest_bit; 146 unsigned int cluster_next; 147 unsigned int cluster_nr; 148 unsigned int pages; 149 unsigned int max; 150 unsigned int inuse_pages; 151 int next; /* next entry on swap list */ 152}; 153 154struct swap_list_t { 155 int head; /* head of priority-ordered swapfile list */ 156 int next; /* swapfile to be used next */ 157}; 158 159/* Swap 50% full? Release swapcache more aggressively.. */ 160#define vm_swap_full() (nr_swap_pages*2 < total_swap_pages) 161 162/* linux/mm/page_alloc.c */ 163extern unsigned long totalram_pages; 164extern unsigned long totalreserve_pages; 165extern long nr_swap_pages; 166extern unsigned int nr_free_buffer_pages(void); 167extern unsigned int nr_free_pagecache_pages(void); 168 169/* Definition of global_page_state not available yet */ 170#define nr_free_pages() global_page_state(NR_FREE_PAGES) 171 172 173/* linux/mm/swap.c */ 174extern void lru_cache_add(struct page *); 175extern void lru_cache_add_active(struct page *); 176extern void activate_page(struct page *); 177extern void mark_page_accessed(struct page *); 178extern void lru_add_drain(void); 179extern int lru_add_drain_all(void); 180extern void rotate_reclaimable_page(struct page *page); 181extern void swap_setup(void); 182 183/* linux/mm/vmscan.c */ 184extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order, 185 gfp_t gfp_mask); 186extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem, 187 gfp_t gfp_mask); 188extern int __isolate_lru_page(struct page *page, int mode); 189extern unsigned long shrink_all_memory(unsigned long nr_pages); 190extern int vm_swappiness; 191extern int remove_mapping(struct address_space *mapping, struct page *page); 192extern long vm_total_pages; 193 194#ifdef CONFIG_NUMA 195extern int zone_reclaim_mode; 196extern int sysctl_min_unmapped_ratio; 197extern int sysctl_min_slab_ratio; 198extern int zone_reclaim(struct zone *, gfp_t, unsigned int); 199#else 200#define zone_reclaim_mode 0 201static inline int zone_reclaim(struct zone *z, gfp_t mask, unsigned int order) 202{ 203 return 0; 204} 205#endif 206 207extern int kswapd_run(int nid); 208 209#ifdef CONFIG_MMU 210/* linux/mm/shmem.c */ 211extern int shmem_unuse(swp_entry_t entry, struct page *page); 212#endif /* CONFIG_MMU */ 213 214extern void swap_unplug_io_fn(struct backing_dev_info *, struct page *); 215 216#ifdef CONFIG_SWAP 217/* linux/mm/page_io.c */ 218extern int swap_readpage(struct file *, struct page *); 219extern int swap_writepage(struct page *page, struct writeback_control *wbc); 220extern void end_swap_bio_read(struct bio *bio, int err); 221 222/* linux/mm/swap_state.c */ 223extern struct address_space swapper_space; 224#define total_swapcache_pages swapper_space.nrpages 225extern void show_swap_cache_info(void); 226extern int add_to_swap(struct page *, gfp_t); 227extern int add_to_swap_cache(struct page *, swp_entry_t, gfp_t); 228extern void __delete_from_swap_cache(struct page *); 229extern void delete_from_swap_cache(struct page *); 230extern void free_page_and_swap_cache(struct page *); 231extern void free_pages_and_swap_cache(struct page **, int); 232extern struct page *lookup_swap_cache(swp_entry_t); 233extern struct page *read_swap_cache_async(swp_entry_t, gfp_t, 234 struct vm_area_struct *vma, unsigned long addr); 235extern struct page *swapin_readahead(swp_entry_t, gfp_t, 236 struct vm_area_struct *vma, unsigned long addr); 237 238/* linux/mm/swapfile.c */ 239extern long total_swap_pages; 240extern unsigned int nr_swapfiles; 241extern void si_swapinfo(struct sysinfo *); 242extern swp_entry_t get_swap_page(void); 243extern swp_entry_t get_swap_page_of_type(int); 244extern int swap_duplicate(swp_entry_t); 245extern int valid_swaphandles(swp_entry_t, unsigned long *); 246extern void swap_free(swp_entry_t); 247extern void free_swap_and_cache(swp_entry_t); 248extern int swap_type_of(dev_t, sector_t, struct block_device **); 249extern unsigned int count_swap_pages(int, int); 250extern sector_t map_swap_page(struct swap_info_struct *, pgoff_t); 251extern sector_t swapdev_block(int, pgoff_t); 252extern struct swap_info_struct *get_swap_info_struct(unsigned); 253extern int can_share_swap_page(struct page *); 254extern int remove_exclusive_swap_page(struct page *); 255struct backing_dev_info; 256 257extern spinlock_t swap_lock; 258 259/* linux/mm/thrash.c */ 260extern struct mm_struct * swap_token_mm; 261extern void grab_swap_token(void); 262extern void __put_swap_token(struct mm_struct *); 263 264static inline int has_swap_token(struct mm_struct *mm) 265{ 266 return (mm == swap_token_mm); 267} 268 269static inline void put_swap_token(struct mm_struct *mm) 270{ 271 if (has_swap_token(mm)) 272 __put_swap_token(mm); 273} 274 275static inline void disable_swap_token(void) 276{ 277 put_swap_token(swap_token_mm); 278} 279 280#else /* CONFIG_SWAP */ 281 282#define total_swap_pages 0 283#define total_swapcache_pages 0UL 284 285#define si_swapinfo(val) \ 286 do { (val)->freeswap = (val)->totalswap = 0; } while (0) 287/* only sparc can not include linux/pagemap.h in this file 288 * so leave page_cache_release and release_pages undeclared... */ 289#define free_page_and_swap_cache(page) \ 290 page_cache_release(page) 291#define free_pages_and_swap_cache(pages, nr) \ 292 release_pages((pages), (nr), 0); 293 294static inline void show_swap_cache_info(void) 295{ 296} 297 298static inline void free_swap_and_cache(swp_entry_t swp) 299{ 300} 301 302static inline int swap_duplicate(swp_entry_t swp) 303{ 304 return 0; 305} 306 307static inline void swap_free(swp_entry_t swp) 308{ 309} 310 311static inline struct page *swapin_readahead(swp_entry_t swp, gfp_t gfp_mask, 312 struct vm_area_struct *vma, unsigned long addr) 313{ 314 return NULL; 315} 316 317static inline struct page *lookup_swap_cache(swp_entry_t swp) 318{ 319 return NULL; 320} 321 322#define can_share_swap_page(p) (page_mapcount(p) == 1) 323 324static inline int add_to_swap_cache(struct page *page, swp_entry_t entry, 325 gfp_t gfp_mask) 326{ 327 return -1; 328} 329 330static inline void __delete_from_swap_cache(struct page *page) 331{ 332} 333 334static inline void delete_from_swap_cache(struct page *page) 335{ 336} 337 338#define swap_token_default_timeout 0 339 340static inline int remove_exclusive_swap_page(struct page *p) 341{ 342 return 0; 343} 344 345static inline swp_entry_t get_swap_page(void) 346{ 347 swp_entry_t entry; 348 entry.val = 0; 349 return entry; 350} 351 352/* linux/mm/thrash.c */ 353#define put_swap_token(x) do { } while(0) 354#define grab_swap_token() do { } while(0) 355#define has_swap_token(x) 0 356#define disable_swap_token() do { } while(0) 357 358#endif /* CONFIG_SWAP */ 359#endif /* __KERNEL__*/ 360#endif /* _LINUX_SWAP_H */