1
2
3
4
5#ifndef PAGE_FLAGS_H
6#define PAGE_FLAGS_H
7
8#include <linux/percpu.h>
9#include <linux/cache.h>
10#include <asm/pgtable.h>
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66#define PG_locked 0
67#define PG_error 1
68#define PG_referenced 2
69#define PG_uptodate 3
70
71#define PG_dirty 4
72#define PG_lru 5
73#define PG_active 6
74#define PG_slab 7
75
76#define PG_checked 8
77#define PG_arch_1 9
78#define PG_reserved 10
79#define PG_private 11
80
81#define PG_writeback 12
82#define PG_nosave 13
83#define PG_compound 14
84#define PG_swapcache 15
85
86#define PG_mappedtodisk 16
87#define PG_reclaim 17
88#define PG_nosave_free 18
89#define PG_buddy 19
90
91#define PG_uncached 20
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107struct page_state {
108 unsigned long nr_dirty;
109 unsigned long nr_writeback;
110 unsigned long nr_unstable;
111 unsigned long nr_page_table_pages;
112 unsigned long nr_mapped;
113
114 unsigned long nr_slab;
115#define GET_PAGE_STATE_LAST nr_slab
116
117
118
119
120
121 unsigned long pgpgin;
122 unsigned long pgpgout;
123 unsigned long pswpin;
124 unsigned long pswpout;
125
126 unsigned long pgalloc_high;
127 unsigned long pgalloc_normal;
128 unsigned long pgalloc_dma32;
129 unsigned long pgalloc_dma;
130
131 unsigned long pgfree;
132 unsigned long pgactivate;
133 unsigned long pgdeactivate;
134
135 unsigned long pgfault;
136 unsigned long pgmajfault;
137
138 unsigned long pgrefill_high;
139 unsigned long pgrefill_normal;
140 unsigned long pgrefill_dma32;
141 unsigned long pgrefill_dma;
142
143 unsigned long pgsteal_high;
144 unsigned long pgsteal_normal;
145 unsigned long pgsteal_dma32;
146 unsigned long pgsteal_dma;
147
148 unsigned long pgscan_kswapd_high;
149 unsigned long pgscan_kswapd_normal;
150 unsigned long pgscan_kswapd_dma32;
151 unsigned long pgscan_kswapd_dma;
152
153 unsigned long pgscan_direct_high;
154 unsigned long pgscan_direct_normal;
155 unsigned long pgscan_direct_dma32;
156 unsigned long pgscan_direct_dma;
157
158 unsigned long pginodesteal;
159 unsigned long slabs_scanned;
160 unsigned long kswapd_steal;
161 unsigned long kswapd_inodesteal;
162 unsigned long pageoutrun;
163 unsigned long allocstall;
164
165 unsigned long pgrotated;
166 unsigned long nr_bounce;
167};
168
169extern void get_page_state(struct page_state *ret);
170extern void get_page_state_node(struct page_state *ret, int node);
171extern void get_full_page_state(struct page_state *ret);
172extern unsigned long read_page_state_offset(unsigned long offset);
173extern void mod_page_state_offset(unsigned long offset, unsigned long delta);
174extern void __mod_page_state_offset(unsigned long offset, unsigned long delta);
175
176#define read_page_state(member) \
177 read_page_state_offset(offsetof(struct page_state, member))
178
179#define mod_page_state(member, delta) \
180 mod_page_state_offset(offsetof(struct page_state, member), (delta))
181
182#define __mod_page_state(member, delta) \
183 __mod_page_state_offset(offsetof(struct page_state, member), (delta))
184
185#define inc_page_state(member) mod_page_state(member, 1UL)
186#define dec_page_state(member) mod_page_state(member, 0UL - 1)
187#define add_page_state(member,delta) mod_page_state(member, (delta))
188#define sub_page_state(member,delta) mod_page_state(member, 0UL - (delta))
189
190#define __inc_page_state(member) __mod_page_state(member, 1UL)
191#define __dec_page_state(member) __mod_page_state(member, 0UL - 1)
192#define __add_page_state(member,delta) __mod_page_state(member, (delta))
193#define __sub_page_state(member,delta) __mod_page_state(member, 0UL - (delta))
194
195#define page_state(member) (*__page_state(offsetof(struct page_state, member)))
196
197#define state_zone_offset(zone, member) \
198({ \
199 unsigned offset; \
200 if (is_highmem(zone)) \
201 offset = offsetof(struct page_state, member##_high); \
202 else if (is_normal(zone)) \
203 offset = offsetof(struct page_state, member##_normal); \
204 else if (is_dma32(zone)) \
205 offset = offsetof(struct page_state, member##_dma32); \
206 else \
207 offset = offsetof(struct page_state, member##_dma); \
208 offset; \
209})
210
211#define __mod_page_state_zone(zone, member, delta) \
212 do { \
213 __mod_page_state_offset(state_zone_offset(zone, member), (delta)); \
214 } while (0)
215
216#define mod_page_state_zone(zone, member, delta) \
217 do { \
218 mod_page_state_offset(state_zone_offset(zone, member), (delta)); \
219 } while (0)
220
221
222
223
224#define PageLocked(page) \
225 test_bit(PG_locked, &(page)->flags)
226#define SetPageLocked(page) \
227 set_bit(PG_locked, &(page)->flags)
228#define TestSetPageLocked(page) \
229 test_and_set_bit(PG_locked, &(page)->flags)
230#define ClearPageLocked(page) \
231 clear_bit(PG_locked, &(page)->flags)
232#define TestClearPageLocked(page) \
233 test_and_clear_bit(PG_locked, &(page)->flags)
234
235#define PageError(page) test_bit(PG_error, &(page)->flags)
236#define SetPageError(page) set_bit(PG_error, &(page)->flags)
237#define ClearPageError(page) clear_bit(PG_error, &(page)->flags)
238
239#define PageReferenced(page) test_bit(PG_referenced, &(page)->flags)
240#define SetPageReferenced(page) set_bit(PG_referenced, &(page)->flags)
241#define ClearPageReferenced(page) clear_bit(PG_referenced, &(page)->flags)
242#define TestClearPageReferenced(page) test_and_clear_bit(PG_referenced, &(page)->flags)
243
244#define PageUptodate(page) test_bit(PG_uptodate, &(page)->flags)
245#ifndef SetPageUptodate
246#define SetPageUptodate(page) set_bit(PG_uptodate, &(page)->flags)
247#endif
248#define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags)
249
250#define PageDirty(page) test_bit(PG_dirty, &(page)->flags)
251#define SetPageDirty(page) set_bit(PG_dirty, &(page)->flags)
252#define TestSetPageDirty(page) test_and_set_bit(PG_dirty, &(page)->flags)
253#define ClearPageDirty(page) clear_bit(PG_dirty, &(page)->flags)
254#define __ClearPageDirty(page) __clear_bit(PG_dirty, &(page)->flags)
255#define TestClearPageDirty(page) test_and_clear_bit(PG_dirty, &(page)->flags)
256
257#define PageLRU(page) test_bit(PG_lru, &(page)->flags)
258#define SetPageLRU(page) set_bit(PG_lru, &(page)->flags)
259#define ClearPageLRU(page) clear_bit(PG_lru, &(page)->flags)
260#define __ClearPageLRU(page) __clear_bit(PG_lru, &(page)->flags)
261
262#define PageActive(page) test_bit(PG_active, &(page)->flags)
263#define SetPageActive(page) set_bit(PG_active, &(page)->flags)
264#define ClearPageActive(page) clear_bit(PG_active, &(page)->flags)
265#define __ClearPageActive(page) __clear_bit(PG_active, &(page)->flags)
266
267#define PageSlab(page) test_bit(PG_slab, &(page)->flags)
268#define __SetPageSlab(page) __set_bit(PG_slab, &(page)->flags)
269#define __ClearPageSlab(page) __clear_bit(PG_slab, &(page)->flags)
270
271#ifdef CONFIG_HIGHMEM
272#define PageHighMem(page) is_highmem(page_zone(page))
273#else
274#define PageHighMem(page) 0
275#endif
276
277#define PageChecked(page) test_bit(PG_checked, &(page)->flags)
278#define SetPageChecked(page) set_bit(PG_checked, &(page)->flags)
279#define ClearPageChecked(page) clear_bit(PG_checked, &(page)->flags)
280
281#define PageReserved(page) test_bit(PG_reserved, &(page)->flags)
282#define SetPageReserved(page) set_bit(PG_reserved, &(page)->flags)
283#define ClearPageReserved(page) clear_bit(PG_reserved, &(page)->flags)
284#define __ClearPageReserved(page) __clear_bit(PG_reserved, &(page)->flags)
285
286#define SetPagePrivate(page) set_bit(PG_private, &(page)->flags)
287#define ClearPagePrivate(page) clear_bit(PG_private, &(page)->flags)
288#define PagePrivate(page) test_bit(PG_private, &(page)->flags)
289#define __SetPagePrivate(page) __set_bit(PG_private, &(page)->flags)
290#define __ClearPagePrivate(page) __clear_bit(PG_private, &(page)->flags)
291
292#define PageWriteback(page) test_bit(PG_writeback, &(page)->flags)
293#define SetPageWriteback(page) \
294 do { \
295 if (!test_and_set_bit(PG_writeback, \
296 &(page)->flags)) \
297 inc_page_state(nr_writeback); \
298 } while (0)
299#define TestSetPageWriteback(page) \
300 ({ \
301 int ret; \
302 ret = test_and_set_bit(PG_writeback, \
303 &(page)->flags); \
304 if (!ret) \
305 inc_page_state(nr_writeback); \
306 ret; \
307 })
308#define ClearPageWriteback(page) \
309 do { \
310 if (test_and_clear_bit(PG_writeback, \
311 &(page)->flags)) \
312 dec_page_state(nr_writeback); \
313 } while (0)
314#define TestClearPageWriteback(page) \
315 ({ \
316 int ret; \
317 ret = test_and_clear_bit(PG_writeback, \
318 &(page)->flags); \
319 if (ret) \
320 dec_page_state(nr_writeback); \
321 ret; \
322 })
323
324#define PageNosave(page) test_bit(PG_nosave, &(page)->flags)
325#define SetPageNosave(page) set_bit(PG_nosave, &(page)->flags)
326#define TestSetPageNosave(page) test_and_set_bit(PG_nosave, &(page)->flags)
327#define ClearPageNosave(page) clear_bit(PG_nosave, &(page)->flags)
328#define TestClearPageNosave(page) test_and_clear_bit(PG_nosave, &(page)->flags)
329
330#define PageNosaveFree(page) test_bit(PG_nosave_free, &(page)->flags)
331#define SetPageNosaveFree(page) set_bit(PG_nosave_free, &(page)->flags)
332#define ClearPageNosaveFree(page) clear_bit(PG_nosave_free, &(page)->flags)
333
334#define PageBuddy(page) test_bit(PG_buddy, &(page)->flags)
335#define __SetPageBuddy(page) __set_bit(PG_buddy, &(page)->flags)
336#define __ClearPageBuddy(page) __clear_bit(PG_buddy, &(page)->flags)
337
338#define PageMappedToDisk(page) test_bit(PG_mappedtodisk, &(page)->flags)
339#define SetPageMappedToDisk(page) set_bit(PG_mappedtodisk, &(page)->flags)
340#define ClearPageMappedToDisk(page) clear_bit(PG_mappedtodisk, &(page)->flags)
341
342#define PageReclaim(page) test_bit(PG_reclaim, &(page)->flags)
343#define SetPageReclaim(page) set_bit(PG_reclaim, &(page)->flags)
344#define ClearPageReclaim(page) clear_bit(PG_reclaim, &(page)->flags)
345#define TestClearPageReclaim(page) test_and_clear_bit(PG_reclaim, &(page)->flags)
346
347#define PageCompound(page) test_bit(PG_compound, &(page)->flags)
348#define __SetPageCompound(page) __set_bit(PG_compound, &(page)->flags)
349#define __ClearPageCompound(page) __clear_bit(PG_compound, &(page)->flags)
350
351#ifdef CONFIG_SWAP
352#define PageSwapCache(page) test_bit(PG_swapcache, &(page)->flags)
353#define SetPageSwapCache(page) set_bit(PG_swapcache, &(page)->flags)
354#define ClearPageSwapCache(page) clear_bit(PG_swapcache, &(page)->flags)
355#else
356#define PageSwapCache(page) 0
357#endif
358
359#define PageUncached(page) test_bit(PG_uncached, &(page)->flags)
360#define SetPageUncached(page) set_bit(PG_uncached, &(page)->flags)
361#define ClearPageUncached(page) clear_bit(PG_uncached, &(page)->flags)
362
363struct page;
364
365int test_clear_page_dirty(struct page *page);
366int test_clear_page_writeback(struct page *page);
367int test_set_page_writeback(struct page *page);
368
369static inline void clear_page_dirty(struct page *page)
370{
371 test_clear_page_dirty(page);
372}
373
374static inline void set_page_writeback(struct page *page)
375{
376 test_set_page_writeback(page);
377}
378
379#endif
380