1#ifndef _LINUX_SWAP_H
2#define _LINUX_SWAP_H
3
4#include <linux/spinlock.h>
5#include <asm/page.h>
6
7#define SWAP_FLAG_PREFER 0x8000
8#define SWAP_FLAG_PRIO_MASK 0x7fff
9#define SWAP_FLAG_PRIO_SHIFT 0
10
11#define MAX_SWAPFILES 32
12
13
14
15
16
17
18
19
20
21
22
23
24
25union swap_header {
26 struct
27 {
28 char reserved[PAGE_SIZE - 10];
29 char magic[10];
30 } magic;
31 struct
32 {
33 char bootbits[1024];
34 unsigned int version;
35 unsigned int last_page;
36 unsigned int nr_badpages;
37 unsigned int padding[125];
38 unsigned int badpages[1];
39 } info;
40};
41
42#ifdef __KERNEL__
43
44
45
46
47#define __swapoffset(x) ((unsigned long)&((union swap_header *)0)->x)
48#define MAX_SWAP_BADPAGES \
49 ((__swapoffset(magic.magic) - __swapoffset(info.badpages)) / sizeof(int))
50
51#include <asm/atomic.h>
52
53#define SWP_USED 1
54#define SWP_WRITEOK 3
55
56#define SWAP_CLUSTER_MAX 32
57
58#define SWAP_MAP_MAX 0x7fff
59#define SWAP_MAP_BAD 0x8000
60
61
62
63
64struct swap_info_struct {
65 unsigned int flags;
66 kdev_t swap_device;
67 spinlock_t sdev_lock;
68 struct dentry * swap_file;
69 struct vfsmount *swap_vfsmnt;
70 unsigned short * swap_map;
71 unsigned int lowest_bit;
72 unsigned int highest_bit;
73 unsigned int cluster_next;
74 unsigned int cluster_nr;
75 int prio;
76 int pages;
77 unsigned long max;
78 int next;
79};
80
81extern int nr_swap_pages;
82
83
84#define vm_swap_full() (nr_swap_pages*2 < total_swap_pages)
85
86extern unsigned int nr_free_pages(void);
87extern unsigned int nr_free_buffer_pages(void);
88extern int nr_active_pages;
89extern int nr_inactive_pages;
90extern atomic_t nr_async_pages;
91extern atomic_t page_cache_size;
92extern atomic_t buffermem_pages;
93extern spinlock_t pagecache_lock;
94extern void __remove_inode_page(struct page *);
95
96
97struct task_struct;
98struct vm_area_struct;
99struct sysinfo;
100
101struct zone_t;
102
103
104extern void FASTCALL(lru_cache_add(struct page *));
105extern void FASTCALL(__lru_cache_del(struct page *));
106extern void FASTCALL(lru_cache_del(struct page *));
107
108extern void FASTCALL(activate_page(struct page *));
109
110extern void swap_setup(void);
111
112
113extern wait_queue_head_t kswapd_wait;
114extern int FASTCALL(try_to_free_pages(zone_t *, unsigned int, unsigned int));
115
116
117extern void rw_swap_page(int, struct page *);
118extern void rw_swap_page_nolock(int, swp_entry_t, char *);
119
120
121
122
123#define SWAP_CACHE_INFO
124#ifdef SWAP_CACHE_INFO
125extern void show_swap_cache_info(void);
126#endif
127extern int add_to_swap_cache(struct page *, swp_entry_t);
128extern void __delete_from_swap_cache(struct page *page);
129extern void delete_from_swap_cache(struct page *page);
130extern void free_page_and_swap_cache(struct page *page);
131extern struct page * lookup_swap_cache(swp_entry_t);
132extern struct page * read_swap_cache_async(swp_entry_t);
133
134
135extern void out_of_memory(void);
136
137
138extern int total_swap_pages;
139extern unsigned int nr_swapfiles;
140extern struct swap_info_struct swap_info[];
141extern int is_swap_partition(kdev_t);
142extern void si_swapinfo(struct sysinfo *);
143extern swp_entry_t get_swap_page(void);
144extern void get_swaphandle_info(swp_entry_t, unsigned long *, kdev_t *,
145 struct inode **);
146extern int swap_duplicate(swp_entry_t);
147extern int swap_count(struct page *);
148extern int valid_swaphandles(swp_entry_t, unsigned long *);
149extern void swap_free(swp_entry_t);
150extern void free_swap_and_cache(swp_entry_t);
151struct swap_list_t {
152 int head;
153 int next;
154};
155extern struct swap_list_t swap_list;
156asmlinkage long sys_swapoff(const char *);
157asmlinkage long sys_swapon(const char *, int);
158
159extern spinlock_t pagemap_lru_lock;
160
161extern void FASTCALL(mark_page_accessed(struct page *));
162
163
164
165
166
167#define DEBUG_LRU_PAGE(page) \
168do { \
169 if (!PageLRU(page)) \
170 BUG(); \
171 if (PageActive(page)) \
172 BUG(); \
173} while (0)
174
175#define add_page_to_active_list(page) \
176do { \
177 DEBUG_LRU_PAGE(page); \
178 SetPageActive(page); \
179 list_add(&(page)->lru, &active_list); \
180 nr_active_pages++; \
181} while (0)
182
183#define add_page_to_inactive_list(page) \
184do { \
185 DEBUG_LRU_PAGE(page); \
186 list_add(&(page)->lru, &inactive_list); \
187 nr_inactive_pages++; \
188} while (0)
189
190#define del_page_from_active_list(page) \
191do { \
192 list_del(&(page)->lru); \
193 ClearPageActive(page); \
194 nr_active_pages--; \
195} while (0)
196
197#define del_page_from_inactive_list(page) \
198do { \
199 list_del(&(page)->lru); \
200 nr_inactive_pages--; \
201} while (0)
202
203extern spinlock_t swaplock;
204
205#define swap_list_lock() spin_lock(&swaplock)
206#define swap_list_unlock() spin_unlock(&swaplock)
207#define swap_device_lock(p) spin_lock(&p->sdev_lock)
208#define swap_device_unlock(p) spin_unlock(&p->sdev_lock)
209
210extern void shmem_unuse(swp_entry_t entry, struct page *page);
211
212#endif
213
214#endif
215