1
2
3
4
5#ifndef PAGE_FLAGS_H
6#define PAGE_FLAGS_H
7
8
9
10
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#define PG_locked 0
51#define PG_error 1
52#define PG_referenced 2
53#define PG_uptodate 3
54
55#define PG_dirty_dontuse 4
56#define PG_lru 5
57#define PG_active 6
58#define PG_slab 7
59
60#define PG_highmem 8
61#define PG_checked 9
62#define PG_arch_1 10
63#define PG_reserved 11
64
65#define PG_private 12
66#define PG_writeback 13
67#define PG_nosave 14
68#define PG_chainlock 15
69
70#define PG_direct 16
71
72
73
74
75extern struct page_state {
76 unsigned long nr_dirty;
77 unsigned long nr_writeback;
78 unsigned long nr_pagecache;
79 unsigned long nr_active;
80 unsigned long nr_inactive;
81 unsigned long nr_page_table_pages;
82 unsigned long nr_pte_chain_pages;
83 unsigned long used_pte_chains_bytes;
84} ____cacheline_aligned_in_smp page_states[NR_CPUS];
85
86extern void get_page_state(struct page_state *ret);
87
88#define mod_page_state(member, delta) \
89 do { \
90 preempt_disable(); \
91 page_states[smp_processor_id()].member += (delta); \
92 preempt_enable(); \
93 } while (0)
94
95#define inc_page_state(member) mod_page_state(member, 1UL)
96#define dec_page_state(member) mod_page_state(member, 0UL - 1)
97
98
99
100
101
102#define PageLocked(page) \
103 test_bit(PG_locked, &(page)->flags)
104#define SetPageLocked(page) \
105 set_bit(PG_locked, &(page)->flags)
106#define TestSetPageLocked(page) \
107 test_and_set_bit(PG_locked, &(page)->flags)
108#define ClearPageLocked(page) \
109 clear_bit(PG_locked, &(page)->flags)
110#define TestClearPageLocked(page) \
111 test_and_clear_bit(PG_locked, &(page)->flags)
112
113#define PageError(page) test_bit(PG_error, &(page)->flags)
114#define SetPageError(page) set_bit(PG_error, &(page)->flags)
115#define ClearPageError(page) clear_bit(PG_error, &(page)->flags)
116
117#define PageReferenced(page) test_bit(PG_referenced, &(page)->flags)
118#define SetPageReferenced(page) set_bit(PG_referenced, &(page)->flags)
119#define ClearPageReferenced(page) clear_bit(PG_referenced, &(page)->flags)
120#define TestClearPageReferenced(page) test_and_clear_bit(PG_referenced, &(page)->flags)
121
122#define PageUptodate(page) test_bit(PG_uptodate, &(page)->flags)
123#define SetPageUptodate(page) set_bit(PG_uptodate, &(page)->flags)
124#define ClearPageUptodate(page) clear_bit(PG_uptodate, &(page)->flags)
125
126#define PageDirty(page) test_bit(PG_dirty_dontuse, &(page)->flags)
127#define SetPageDirty(page) \
128 do { \
129 if (!test_and_set_bit(PG_dirty_dontuse, \
130 &(page)->flags)) \
131 inc_page_state(nr_dirty); \
132 } while (0)
133#define TestSetPageDirty(page) \
134 ({ \
135 int ret; \
136 ret = test_and_set_bit(PG_dirty_dontuse, \
137 &(page)->flags); \
138 if (!ret) \
139 inc_page_state(nr_dirty); \
140 ret; \
141 })
142#define ClearPageDirty(page) \
143 do { \
144 if (test_and_clear_bit(PG_dirty_dontuse, \
145 &(page)->flags)) \
146 dec_page_state(nr_dirty); \
147 } while (0)
148#define TestClearPageDirty(page) \
149 ({ \
150 int ret; \
151 ret = test_and_clear_bit(PG_dirty_dontuse, \
152 &(page)->flags); \
153 if (ret) \
154 dec_page_state(nr_dirty); \
155 ret; \
156 })
157
158#define PageLRU(page) test_bit(PG_lru, &(page)->flags)
159#define TestSetPageLRU(page) test_and_set_bit(PG_lru, &(page)->flags)
160#define TestClearPageLRU(page) test_and_clear_bit(PG_lru, &(page)->flags)
161
162#define PageActive(page) test_bit(PG_active, &(page)->flags)
163#define SetPageActive(page) set_bit(PG_active, &(page)->flags)
164#define ClearPageActive(page) clear_bit(PG_active, &(page)->flags)
165
166#define PageSlab(page) test_bit(PG_slab, &(page)->flags)
167#define SetPageSlab(page) set_bit(PG_slab, &(page)->flags)
168#define ClearPageSlab(page) clear_bit(PG_slab, &(page)->flags)
169
170#ifdef CONFIG_HIGHMEM
171#define PageHighMem(page) test_bit(PG_highmem, &(page)->flags)
172#else
173#define PageHighMem(page) 0
174#endif
175
176#define PageChecked(page) test_bit(PG_checked, &(page)->flags)
177#define SetPageChecked(page) set_bit(PG_checked, &(page)->flags)
178
179#define PageReserved(page) test_bit(PG_reserved, &(page)->flags)
180#define SetPageReserved(page) set_bit(PG_reserved, &(page)->flags)
181#define ClearPageReserved(page) clear_bit(PG_reserved, &(page)->flags)
182
183#define SetPagePrivate(page) set_bit(PG_private, &(page)->flags)
184#define ClearPagePrivate(page) clear_bit(PG_private, &(page)->flags)
185#define PagePrivate(page) test_bit(PG_private, &(page)->flags)
186
187#define PageWriteback(page) test_bit(PG_writeback, &(page)->flags)
188#define SetPageWriteback(page) \
189 do { \
190 if (!test_and_set_bit(PG_writeback, \
191 &(page)->flags)) \
192 inc_page_state(nr_writeback); \
193 } while (0)
194#define TestSetPageWriteback(page) \
195 ({ \
196 int ret; \
197 ret = test_and_set_bit(PG_writeback, \
198 &(page)->flags); \
199 if (!ret) \
200 inc_page_state(nr_writeback); \
201 ret; \
202 })
203#define ClearPageWriteback(page) \
204 do { \
205 if (test_and_clear_bit(PG_writeback, \
206 &(page)->flags)) \
207 dec_page_state(nr_writeback); \
208 } while (0)
209#define TestClearPageWriteback(page) \
210 ({ \
211 int ret; \
212 ret = test_and_clear_bit(PG_writeback, \
213 &(page)->flags); \
214 if (ret) \
215 dec_page_state(nr_writeback); \
216 ret; \
217 })
218
219#define PageNosave(page) test_bit(PG_nosave, &(page)->flags)
220#define SetPageNosave(page) set_bit(PG_nosave, &(page)->flags)
221#define TestSetPageNosave(page) test_and_set_bit(PG_nosave, &(page)->flags)
222#define ClearPageNosave(page) clear_bit(PG_nosave, &(page)->flags)
223#define TestClearPageNosave(page) test_and_clear_bit(PG_nosave, &(page)->flags)
224
225#define PageDirect(page) test_bit(PG_direct, &(page)->flags)
226#define SetPageDirect(page) set_bit(PG_direct, &(page)->flags)
227#define TestSetPageDirect(page) test_and_set_bit(PG_direct, &(page)->flags)
228#define ClearPageDirect(page) clear_bit(PG_direct, &(page)->flags)
229#define TestClearPageDirect(page) test_and_clear_bit(PG_direct, &(page)->flags)
230
231
232
233
234static inline void pte_chain_lock(struct page *page)
235{
236
237
238
239
240
241
242
243 preempt_disable();
244 while (test_and_set_bit(PG_chainlock, &page->flags)) {
245 while (test_bit(PG_chainlock, &page->flags))
246 cpu_relax();
247 }
248}
249
250static inline void pte_chain_unlock(struct page *page)
251{
252 clear_bit(PG_chainlock, &page->flags);
253 preempt_enable();
254}
255
256
257
258
259
260extern struct address_space swapper_space;
261#define PageSwapCache(page) ((page)->mapping == &swapper_space)
262
263#endif
264