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