Blame view
include/linux/swap.h
11.6 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 |
#ifndef _LINUX_SWAP_H #define _LINUX_SWAP_H |
1da177e4c Linux-2.6.12-rc2 |
3 4 5 6 |
#include <linux/spinlock.h> #include <linux/linkage.h> #include <linux/mmzone.h> #include <linux/list.h> |
66e1707bc Memory controller... |
7 |
#include <linux/memcontrol.h> |
1da177e4c Linux-2.6.12-rc2 |
8 |
#include <linux/sched.h> |
af936a160 vmscan: unevictab... |
9 |
#include <linux/node.h> |
542d1c88b [PATCH] tlb.h war... |
10 |
|
1da177e4c Linux-2.6.12-rc2 |
11 12 |
#include <asm/atomic.h> #include <asm/page.h> |
8bc719d3c [PATCH] out of me... |
13 |
struct notifier_block; |
ab9541603 [PATCH] swsusp: w... |
14 |
struct bio; |
1da177e4c Linux-2.6.12-rc2 |
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */ #define SWAP_FLAG_PRIO_MASK 0x7fff #define SWAP_FLAG_PRIO_SHIFT 0 static inline int current_is_kswapd(void) { return current->flags & PF_KSWAPD; } /* * MAX_SWAPFILES defines the maximum number of swaptypes: things which can * be swapped to. The swap type and the offset into that swap type are * encoded into pte's and into pgoff_t's in the swapcache. Using five bits * for the type means that the maximum number of swapcache pages is 27 bits * on 32-bit-pgoff_t architectures. And that assumes that the architecture packs * the type/offset into the pte as 5/27 as well. */ #define MAX_SWAPFILES_SHIFT 5 |
0697212a4 [PATCH] Swapless ... |
33 |
#ifndef CONFIG_MIGRATION |
1da177e4c Linux-2.6.12-rc2 |
34 |
#define MAX_SWAPFILES (1 << MAX_SWAPFILES_SHIFT) |
0697212a4 [PATCH] Swapless ... |
35 36 37 38 39 40 |
#else /* Use last two entries for page migration swap entries */ #define MAX_SWAPFILES ((1 << MAX_SWAPFILES_SHIFT)-2) #define SWP_MIGRATION_READ MAX_SWAPFILES #define SWP_MIGRATION_WRITE (MAX_SWAPFILES + 1) #endif |
1da177e4c Linux-2.6.12-rc2 |
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
/* * Magic header for a swap area. The first part of the union is * what the swap magic looks like for the old (limited to 128MB) * swap area format, the second part of the union adds - in the * old reserved area - some extra information. Note that the first * kilobyte is reserved for boot loader or disk label stuff... * * Having the magic at the end of the PAGE_SIZE makes detecting swap * areas somewhat tricky on machines that support multiple page sizes. * For 2.5 we'll probably want to move the magic to just beyond the * bootbits... */ union swap_header { struct { char reserved[PAGE_SIZE - 10]; char magic[10]; /* SWAP-SPACE or SWAPSPACE2 */ } magic; struct { |
e8f03d020 [PATCH] reserve s... |
60 61 62 63 64 65 66 67 |
char bootbits[1024]; /* Space for disklabel etc. */ __u32 version; __u32 last_page; __u32 nr_badpages; unsigned char sws_uuid[16]; unsigned char sws_volume[16]; __u32 padding[117]; __u32 badpages[1]; |
1da177e4c Linux-2.6.12-rc2 |
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
} info; }; /* A swap entry has to fit into a "unsigned long", as * the entry is hidden in the "index" field of the * swapper address space. */ typedef struct { unsigned long val; } swp_entry_t; /* * current->reclaim_state points to one of these when a task is running * memory reclaim */ struct reclaim_state { unsigned long reclaimed_slab; }; #ifdef __KERNEL__ struct address_space; struct sysinfo; struct writeback_control; struct zone; /* * A swap extent maps a range of a swapfile's PAGE_SIZE pages onto a range of * disk blocks. A list of swap extents maps the entire swapfile. (Where the * term `swapfile' refers to either a blockdevice or an IS_REG file. Apart * from setup, they're handled identically. * * We always assume that blocks are of size PAGE_SIZE. */ struct swap_extent { struct list_head list; pgoff_t start_page; pgoff_t nr_pages; sector_t start_block; }; /* * Max bad pages in the new format.. */ #define __swapoffset(x) ((unsigned long)&((union swap_header *)0)->x) #define MAX_SWAP_BADPAGES \ ((__swapoffset(magic.magic) - __swapoffset(info.badpages)) / sizeof(int)) enum { SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ |
6a6ba8317 swapfile: swapon ... |
119 |
SWP_DISCARDABLE = (1 << 2), /* blkdev supports discard */ |
7992fde72 swapfile: swap al... |
120 |
SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */ |
20137a490 swapfile: swapon ... |
121 |
SWP_SOLIDSTATE = (1 << 4), /* blkdev seeks are cheap */ |
52b7efdbe [PATCH] swap: sca... |
122 123 |
/* add others here before... */ SWP_SCANNING = (1 << 8), /* refcount in scan_swap_map */ |
1da177e4c Linux-2.6.12-rc2 |
124 125 126 127 128 129 130 131 132 |
}; #define SWAP_CLUSTER_MAX 32 #define SWAP_MAP_MAX 0x7fff #define SWAP_MAP_BAD 0x8000 /* * The in-memory structure used to track swap areas. |
1da177e4c Linux-2.6.12-rc2 |
133 134 |
*/ struct swap_info_struct { |
ebebbbe90 swapfile: rearran... |
135 |
unsigned long flags; |
5d337b919 [PATCH] swap: swa... |
136 |
int prio; /* swap priority */ |
ebebbbe90 swapfile: rearran... |
137 |
int next; /* next entry on swap list */ |
1da177e4c Linux-2.6.12-rc2 |
138 139 140 |
struct file *swap_file; struct block_device *bdev; struct list_head extent_list; |
1da177e4c Linux-2.6.12-rc2 |
141 |
struct swap_extent *curr_swap_extent; |
ebebbbe90 swapfile: rearran... |
142 |
unsigned short *swap_map; |
1da177e4c Linux-2.6.12-rc2 |
143 144 |
unsigned int lowest_bit; unsigned int highest_bit; |
7992fde72 swapfile: swap al... |
145 146 |
unsigned int lowest_alloc; /* while preparing discard cluster */ unsigned int highest_alloc; /* while preparing discard cluster */ |
1da177e4c Linux-2.6.12-rc2 |
147 148 |
unsigned int cluster_next; unsigned int cluster_nr; |
6eb396dc4 [PATCH] swap: swa... |
149 150 151 |
unsigned int pages; unsigned int max; unsigned int inuse_pages; |
ebebbbe90 swapfile: rearran... |
152 |
unsigned int old_block_size; |
1da177e4c Linux-2.6.12-rc2 |
153 154 155 156 157 158 159 160 161 |
}; struct swap_list_t { int head; /* head of priority-ordered swapfile list */ int next; /* swapfile to be used next */ }; /* Swap 50% full? Release swapcache more aggressively.. */ #define vm_swap_full() (nr_swap_pages*2 < total_swap_pages) |
1da177e4c Linux-2.6.12-rc2 |
162 163 |
/* linux/mm/page_alloc.c */ extern unsigned long totalram_pages; |
cb45b0e96 [PATCH] overcommi... |
164 |
extern unsigned long totalreserve_pages; |
1da177e4c Linux-2.6.12-rc2 |
165 166 |
extern unsigned int nr_free_buffer_pages(void); extern unsigned int nr_free_pagecache_pages(void); |
961772994 [PATCH] Drop free... |
167 168 |
/* Definition of global_page_state not available yet */ #define nr_free_pages() global_page_state(NR_FREE_PAGES) |
1da177e4c Linux-2.6.12-rc2 |
169 |
/* linux/mm/swap.c */ |
f04e9ebbe swap: use an arra... |
170 171 |
extern void __lru_cache_add(struct page *, enum lru_list lru); extern void lru_cache_add_lru(struct page *, enum lru_list lru); |
b3c975286 include/linux: Re... |
172 173 |
extern void activate_page(struct page *); extern void mark_page_accessed(struct page *); |
1da177e4c Linux-2.6.12-rc2 |
174 |
extern void lru_add_drain(void); |
053837fce [PATCH] mm: migra... |
175 |
extern int lru_add_drain_all(void); |
ac6aadb24 mm: rotate_reclai... |
176 |
extern void rotate_reclaimable_page(struct page *page); |
1da177e4c Linux-2.6.12-rc2 |
177 |
extern void swap_setup(void); |
894bc3104 Unevictable LRU I... |
178 |
extern void add_page_to_unevictable_list(struct page *page); |
f04e9ebbe swap: use an arra... |
179 180 181 182 |
/** * lru_cache_add: add a page to the page lists * @page: the page to add */ |
4f98a2fee vmscan: split LRU... |
183 |
static inline void lru_cache_add_anon(struct page *page) |
f04e9ebbe swap: use an arra... |
184 |
{ |
4f98a2fee vmscan: split LRU... |
185 |
__lru_cache_add(page, LRU_INACTIVE_ANON); |
f04e9ebbe swap: use an arra... |
186 |
} |
4f98a2fee vmscan: split LRU... |
187 |
static inline void lru_cache_add_active_anon(struct page *page) |
f04e9ebbe swap: use an arra... |
188 |
{ |
4f98a2fee vmscan: split LRU... |
189 190 191 192 193 194 195 196 197 198 199 |
__lru_cache_add(page, LRU_ACTIVE_ANON); } static inline void lru_cache_add_file(struct page *page) { __lru_cache_add(page, LRU_INACTIVE_FILE); } static inline void lru_cache_add_active_file(struct page *page) { __lru_cache_add(page, LRU_ACTIVE_FILE); |
f04e9ebbe swap: use an arra... |
200 |
} |
1da177e4c Linux-2.6.12-rc2 |
201 |
/* linux/mm/vmscan.c */ |
dac1d27bc mm: use zonelists... |
202 |
extern unsigned long try_to_free_pages(struct zonelist *zonelist, int order, |
5ad333eb6 Lumpy Reclaim V4 |
203 |
gfp_t gfp_mask); |
e1a1cd590 Memory controller... |
204 205 |
extern unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *mem, gfp_t gfp_mask); |
4f98a2fee vmscan: split LRU... |
206 |
extern int __isolate_lru_page(struct page *page, int mode, int file); |
69e05944a [PATCH] vmscan: u... |
207 |
extern unsigned long shrink_all_memory(unsigned long nr_pages); |
1da177e4c Linux-2.6.12-rc2 |
208 |
extern int vm_swappiness; |
b20a35035 [PATCH] page migr... |
209 |
extern int remove_mapping(struct address_space *mapping, struct page *page); |
bd1e22b8e [PATCH] initialis... |
210 |
extern long vm_total_pages; |
b20a35035 [PATCH] page migr... |
211 |
|
9eeff2395 [PATCH] Zone recl... |
212 213 |
#ifdef CONFIG_NUMA extern int zone_reclaim_mode; |
9614634fe [PATCH] ZVC/zone_... |
214 |
extern int sysctl_min_unmapped_ratio; |
0ff38490c [PATCH] zone_recl... |
215 |
extern int sysctl_min_slab_ratio; |
9eeff2395 [PATCH] Zone recl... |
216 217 218 219 220 221 222 223 |
extern int zone_reclaim(struct zone *, gfp_t, unsigned int); #else #define zone_reclaim_mode 0 static inline int zone_reclaim(struct zone *z, gfp_t mask, unsigned int order) { return 0; } #endif |
894bc3104 Unevictable LRU I... |
224 225 |
#ifdef CONFIG_UNEVICTABLE_LRU extern int page_evictable(struct page *page, struct vm_area_struct *vma); |
89e004ea5 SHM_LOCKED pages ... |
226 |
extern void scan_mapping_unevictable_pages(struct address_space *); |
af936a160 vmscan: unevictab... |
227 228 229 230 231 232 |
extern unsigned long scan_unevictable_pages; extern int scan_unevictable_handler(struct ctl_table *, int, struct file *, void __user *, size_t *, loff_t *); extern int scan_unevictable_register_node(struct node *node); extern void scan_unevictable_unregister_node(struct node *node); |
894bc3104 Unevictable LRU I... |
233 234 235 236 237 238 |
#else static inline int page_evictable(struct page *page, struct vm_area_struct *vma) { return 1; } |
af936a160 vmscan: unevictab... |
239 |
|
89e004ea5 SHM_LOCKED pages ... |
240 241 242 |
static inline void scan_mapping_unevictable_pages(struct address_space *mapping) { } |
af936a160 vmscan: unevictab... |
243 244 245 246 247 248 249 |
static inline int scan_unevictable_register_node(struct node *node) { return 0; } static inline void scan_unevictable_unregister_node(struct node *node) { } |
894bc3104 Unevictable LRU I... |
250 |
#endif |
3218ae14b [PATCH] pgdat all... |
251 |
extern int kswapd_run(int nid); |
1da177e4c Linux-2.6.12-rc2 |
252 253 254 255 256 257 258 259 260 261 262 |
#ifdef CONFIG_MMU /* linux/mm/shmem.c */ extern int shmem_unuse(swp_entry_t entry, struct page *page); #endif /* CONFIG_MMU */ extern void swap_unplug_io_fn(struct backing_dev_info *, struct page *); #ifdef CONFIG_SWAP /* linux/mm/page_io.c */ extern int swap_readpage(struct file *, struct page *); extern int swap_writepage(struct page *page, struct writeback_control *wbc); |
6712ecf8f Drop 'size' argum... |
263 |
extern void end_swap_bio_read(struct bio *bio, int err); |
1da177e4c Linux-2.6.12-rc2 |
264 265 266 267 268 |
/* linux/mm/swap_state.c */ extern struct address_space swapper_space; #define total_swapcache_pages swapper_space.nrpages extern void show_swap_cache_info(void); |
ac47b003d mm: remove gfp_ma... |
269 |
extern int add_to_swap(struct page *); |
73b1262fa tmpfs: move swap ... |
270 |
extern int add_to_swap_cache(struct page *, swp_entry_t, gfp_t); |
1da177e4c Linux-2.6.12-rc2 |
271 272 |
extern void __delete_from_swap_cache(struct page *); extern void delete_from_swap_cache(struct page *); |
1da177e4c Linux-2.6.12-rc2 |
273 274 |
extern void free_page_and_swap_cache(struct page *); extern void free_pages_and_swap_cache(struct page **, int); |
46017e954 swapin_readahead:... |
275 |
extern struct page *lookup_swap_cache(swp_entry_t); |
02098feaa swapin needs gfp_... |
276 |
extern struct page *read_swap_cache_async(swp_entry_t, gfp_t, |
46017e954 swapin_readahead:... |
277 |
struct vm_area_struct *vma, unsigned long addr); |
02098feaa swapin needs gfp_... |
278 |
extern struct page *swapin_readahead(swp_entry_t, gfp_t, |
46017e954 swapin_readahead:... |
279 |
struct vm_area_struct *vma, unsigned long addr); |
1da177e4c Linux-2.6.12-rc2 |
280 |
/* linux/mm/swapfile.c */ |
b962716b4 mm: optimize get_... |
281 |
extern long nr_swap_pages; |
1da177e4c Linux-2.6.12-rc2 |
282 |
extern long total_swap_pages; |
1da177e4c Linux-2.6.12-rc2 |
283 284 |
extern void si_swapinfo(struct sysinfo *); extern swp_entry_t get_swap_page(void); |
f577eb30a [PATCH] swsusp: l... |
285 |
extern swp_entry_t get_swap_page_of_type(int); |
1da177e4c Linux-2.6.12-rc2 |
286 287 288 |
extern int swap_duplicate(swp_entry_t); extern int valid_swaphandles(swp_entry_t, unsigned long *); extern void swap_free(swp_entry_t); |
2509ef26d badpage: zap prin... |
289 |
extern int free_swap_and_cache(swp_entry_t); |
7bf236874 [PATCH] swsusp: D... |
290 |
extern int swap_type_of(dev_t, sector_t, struct block_device **); |
f577eb30a [PATCH] swsusp: l... |
291 |
extern unsigned int count_swap_pages(int, int); |
1da177e4c Linux-2.6.12-rc2 |
292 |
extern sector_t map_swap_page(struct swap_info_struct *, pgoff_t); |
3aef83e0e [PATCH] swsusp: u... |
293 |
extern sector_t swapdev_block(int, pgoff_t); |
1da177e4c Linux-2.6.12-rc2 |
294 |
extern struct swap_info_struct *get_swap_info_struct(unsigned); |
7b1fe5979 mm: reuse_swap_pa... |
295 |
extern int reuse_swap_page(struct page *); |
a2c43eed8 mm: try_to_free_s... |
296 |
extern int try_to_free_swap(struct page *); |
1da177e4c Linux-2.6.12-rc2 |
297 |
struct backing_dev_info; |
1da177e4c Linux-2.6.12-rc2 |
298 299 |
/* linux/mm/thrash.c */ extern struct mm_struct * swap_token_mm; |
1da177e4c Linux-2.6.12-rc2 |
300 301 302 303 304 305 306 307 308 309 310 311 312 |
extern void grab_swap_token(void); extern void __put_swap_token(struct mm_struct *); static inline int has_swap_token(struct mm_struct *mm) { return (mm == swap_token_mm); } static inline void put_swap_token(struct mm_struct *mm) { if (has_swap_token(mm)) __put_swap_token(mm); } |
f7b7fd8f3 [PATCH] temporari... |
313 314 315 316 |
static inline void disable_swap_token(void) { put_swap_token(swap_token_mm); } |
1da177e4c Linux-2.6.12-rc2 |
317 |
#else /* CONFIG_SWAP */ |
b962716b4 mm: optimize get_... |
318 319 |
#define nr_swap_pages 0L #define total_swap_pages 0L |
1da177e4c Linux-2.6.12-rc2 |
320 321 322 323 |
#define total_swapcache_pages 0UL #define si_swapinfo(val) \ do { (val)->freeswap = (val)->totalswap = 0; } while (0) |
9ae5b3c70 [PATCH] remove li... |
324 325 |
/* only sparc can not include linux/pagemap.h in this file * so leave page_cache_release and release_pages undeclared... */ |
1da177e4c Linux-2.6.12-rc2 |
326 327 328 329 |
#define free_page_and_swap_cache(page) \ page_cache_release(page) #define free_pages_and_swap_cache(pages, nr) \ release_pages((pages), (nr), 0); |
bd96b9eb7 [PATCH] mm: fix s... |
330 331 332 |
static inline void show_swap_cache_info(void) { } |
2509ef26d badpage: zap prin... |
333 334 |
#define free_swap_and_cache(swp) is_migration_entry(swp) #define swap_duplicate(swp) is_migration_entry(swp) |
bd96b9eb7 [PATCH] mm: fix s... |
335 336 337 338 |
static inline void swap_free(swp_entry_t swp) { } |
02098feaa swapin needs gfp_... |
339 |
static inline struct page *swapin_readahead(swp_entry_t swp, gfp_t gfp_mask, |
bd96b9eb7 [PATCH] mm: fix s... |
340 341 342 343 344 345 346 347 348 |
struct vm_area_struct *vma, unsigned long addr) { return NULL; } static inline struct page *lookup_swap_cache(swp_entry_t swp) { return NULL; } |
60371d971 mm: add add_to_sw... |
349 350 351 352 |
static inline int add_to_swap(struct page *page) { return 0; } |
73b1262fa tmpfs: move swap ... |
353 354 |
static inline int add_to_swap_cache(struct page *page, swp_entry_t entry, gfp_t gfp_mask) |
bd96b9eb7 [PATCH] mm: fix s... |
355 |
{ |
73b1262fa tmpfs: move swap ... |
356 |
return -1; |
bd96b9eb7 [PATCH] mm: fix s... |
357 358 359 360 361 362 363 364 365 |
} static inline void __delete_from_swap_cache(struct page *page) { } static inline void delete_from_swap_cache(struct page *page) { } |
7b1fe5979 mm: reuse_swap_pa... |
366 |
#define reuse_swap_page(page) (page_mapcount(page) == 1) |
1da177e4c Linux-2.6.12-rc2 |
367 |
|
a2c43eed8 mm: try_to_free_s... |
368 |
static inline int try_to_free_swap(struct page *page) |
68a22394c vmscan: free swap... |
369 370 371 |
{ return 0; } |
1da177e4c Linux-2.6.12-rc2 |
372 373 374 375 376 377 378 379 380 381 382 |
static inline swp_entry_t get_swap_page(void) { swp_entry_t entry; entry.val = 0; return entry; } /* linux/mm/thrash.c */ #define put_swap_token(x) do { } while(0) #define grab_swap_token() do { } while(0) #define has_swap_token(x) 0 |
f7b7fd8f3 [PATCH] temporari... |
383 |
#define disable_swap_token() do { } while(0) |
1da177e4c Linux-2.6.12-rc2 |
384 385 386 387 |
#endif /* CONFIG_SWAP */ #endif /* __KERNEL__*/ #endif /* _LINUX_SWAP_H */ |