1
2
3
4
5#ifndef PAGE_FLAGS_H
6#define PAGE_FLAGS_H
7
8#include <linux/types.h>
9#ifndef __GENERATING_BOUNDS_H
10#include <linux/mm_types.h>
11#include <linux/bounds.h>
12#endif
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
67
68
69
70
71
72
73
74
75enum pageflags {
76 PG_locked,
77 PG_error,
78 PG_referenced,
79 PG_uptodate,
80 PG_dirty,
81 PG_lru,
82 PG_active,
83 PG_slab,
84 PG_owner_priv_1,
85 PG_arch_1,
86 PG_reserved,
87 PG_private,
88 PG_private_2,
89 PG_writeback,
90#ifdef CONFIG_PAGEFLAGS_EXTENDED
91 PG_head,
92 PG_tail,
93#else
94 PG_compound,
95#endif
96 PG_swapcache,
97 PG_mappedtodisk,
98 PG_reclaim,
99 PG_buddy,
100 PG_swapbacked,
101 PG_unevictable,
102#ifdef CONFIG_HAVE_MLOCKED_PAGE_BIT
103 PG_mlocked,
104#endif
105#ifdef CONFIG_ARCH_USES_PG_UNCACHED
106 PG_uncached,
107#endif
108#ifdef CONFIG_MEMORY_FAILURE
109 PG_hwpoison,
110#endif
111 __NR_PAGEFLAGS,
112
113
114 PG_checked = PG_owner_priv_1,
115
116
117
118
119
120 PG_fscache = PG_private_2,
121
122
123 PG_pinned = PG_owner_priv_1,
124 PG_savepinned = PG_dirty,
125
126
127 PG_slob_free = PG_private,
128
129
130 PG_slub_frozen = PG_active,
131 PG_slub_debug = PG_error,
132};
133
134#ifndef __GENERATING_BOUNDS_H
135
136
137
138
139#define TESTPAGEFLAG(uname, lname) \
140static inline int Page##uname(struct page *page) \
141 { return test_bit(PG_##lname, &page->flags); }
142
143#define SETPAGEFLAG(uname, lname) \
144static inline void SetPage##uname(struct page *page) \
145 { set_bit(PG_##lname, &page->flags); }
146
147#define CLEARPAGEFLAG(uname, lname) \
148static inline void ClearPage##uname(struct page *page) \
149 { clear_bit(PG_##lname, &page->flags); }
150
151#define __SETPAGEFLAG(uname, lname) \
152static inline void __SetPage##uname(struct page *page) \
153 { __set_bit(PG_##lname, &page->flags); }
154
155#define __CLEARPAGEFLAG(uname, lname) \
156static inline void __ClearPage##uname(struct page *page) \
157 { __clear_bit(PG_##lname, &page->flags); }
158
159#define TESTSETFLAG(uname, lname) \
160static inline int TestSetPage##uname(struct page *page) \
161 { return test_and_set_bit(PG_##lname, &page->flags); }
162
163#define TESTCLEARFLAG(uname, lname) \
164static inline int TestClearPage##uname(struct page *page) \
165 { return test_and_clear_bit(PG_##lname, &page->flags); }
166
167#define __TESTCLEARFLAG(uname, lname) \
168static inline int __TestClearPage##uname(struct page *page) \
169 { return __test_and_clear_bit(PG_##lname, &page->flags); }
170
171#define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname) \
172 SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname)
173
174#define __PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname) \
175 __SETPAGEFLAG(uname, lname) __CLEARPAGEFLAG(uname, lname)
176
177#define PAGEFLAG_FALSE(uname) \
178static inline int Page##uname(struct page *page) \
179 { return 0; }
180
181#define TESTSCFLAG(uname, lname) \
182 TESTSETFLAG(uname, lname) TESTCLEARFLAG(uname, lname)
183
184#define SETPAGEFLAG_NOOP(uname) \
185static inline void SetPage##uname(struct page *page) { }
186
187#define CLEARPAGEFLAG_NOOP(uname) \
188static inline void ClearPage##uname(struct page *page) { }
189
190#define __CLEARPAGEFLAG_NOOP(uname) \
191static inline void __ClearPage##uname(struct page *page) { }
192
193#define TESTCLEARFLAG_FALSE(uname) \
194static inline int TestClearPage##uname(struct page *page) { return 0; }
195
196#define __TESTCLEARFLAG_FALSE(uname) \
197static inline int __TestClearPage##uname(struct page *page) { return 0; }
198
199struct page;
200
201TESTPAGEFLAG(Locked, locked) TESTSETFLAG(Locked, locked)
202PAGEFLAG(Error, error)
203PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced)
204PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty)
205PAGEFLAG(LRU, lru) __CLEARPAGEFLAG(LRU, lru)
206PAGEFLAG(Active, active) __CLEARPAGEFLAG(Active, active)
207 TESTCLEARFLAG(Active, active)
208__PAGEFLAG(Slab, slab)
209PAGEFLAG(Checked, checked)
210PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned)
211PAGEFLAG(SavePinned, savepinned);
212PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
213PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
214
215__PAGEFLAG(SlobFree, slob_free)
216
217__PAGEFLAG(SlubFrozen, slub_frozen)
218__PAGEFLAG(SlubDebug, slub_debug)
219
220
221
222
223
224
225PAGEFLAG(Private, private) __SETPAGEFLAG(Private, private)
226 __CLEARPAGEFLAG(Private, private)
227PAGEFLAG(Private2, private_2) TESTSCFLAG(Private2, private_2)
228PAGEFLAG(OwnerPriv1, owner_priv_1) TESTCLEARFLAG(OwnerPriv1, owner_priv_1)
229
230
231
232
233
234TESTPAGEFLAG(Writeback, writeback) TESTSCFLAG(Writeback, writeback)
235__PAGEFLAG(Buddy, buddy)
236PAGEFLAG(MappedToDisk, mappedtodisk)
237
238
239PAGEFLAG(Reclaim, reclaim) TESTCLEARFLAG(Reclaim, reclaim)
240PAGEFLAG(Readahead, reclaim)
241
242#ifdef CONFIG_HIGHMEM
243
244
245
246
247#define PageHighMem(__p) is_highmem(page_zone(__p))
248#else
249PAGEFLAG_FALSE(HighMem)
250#endif
251
252#ifdef CONFIG_SWAP
253PAGEFLAG(SwapCache, swapcache)
254#else
255PAGEFLAG_FALSE(SwapCache)
256 SETPAGEFLAG_NOOP(SwapCache) CLEARPAGEFLAG_NOOP(SwapCache)
257#endif
258
259PAGEFLAG(Unevictable, unevictable) __CLEARPAGEFLAG(Unevictable, unevictable)
260 TESTCLEARFLAG(Unevictable, unevictable)
261
262#ifdef CONFIG_HAVE_MLOCKED_PAGE_BIT
263#define MLOCK_PAGES 1
264PAGEFLAG(Mlocked, mlocked) __CLEARPAGEFLAG(Mlocked, mlocked)
265 TESTSCFLAG(Mlocked, mlocked) __TESTCLEARFLAG(Mlocked, mlocked)
266#else
267#define MLOCK_PAGES 0
268PAGEFLAG_FALSE(Mlocked) SETPAGEFLAG_NOOP(Mlocked)
269 TESTCLEARFLAG_FALSE(Mlocked) __TESTCLEARFLAG_FALSE(Mlocked)
270#endif
271
272#ifdef CONFIG_ARCH_USES_PG_UNCACHED
273PAGEFLAG(Uncached, uncached)
274#else
275PAGEFLAG_FALSE(Uncached)
276#endif
277
278#ifdef CONFIG_MEMORY_FAILURE
279PAGEFLAG(HWPoison, hwpoison)
280TESTSETFLAG(HWPoison, hwpoison)
281#define __PG_HWPOISON (1UL << PG_hwpoison)
282#else
283PAGEFLAG_FALSE(HWPoison)
284#define __PG_HWPOISON 0
285#endif
286
287static inline int PageUptodate(struct page *page)
288{
289 int ret = test_bit(PG_uptodate, &(page)->flags);
290
291
292
293
294
295
296
297
298
299 if (ret)
300 smp_rmb();
301
302 return ret;
303}
304
305static inline void __SetPageUptodate(struct page *page)
306{
307 smp_wmb();
308 __set_bit(PG_uptodate, &(page)->flags);
309}
310
311static inline void SetPageUptodate(struct page *page)
312{
313#ifdef CONFIG_S390
314 if (!test_and_set_bit(PG_uptodate, &page->flags))
315 page_clear_dirty(page);
316#else
317
318
319
320
321
322
323
324
325 smp_wmb();
326 set_bit(PG_uptodate, &(page)->flags);
327#endif
328}
329
330CLEARPAGEFLAG(Uptodate, uptodate)
331
332extern void cancel_dirty_page(struct page *page, unsigned int account_size);
333
334int test_clear_page_writeback(struct page *page);
335int test_set_page_writeback(struct page *page);
336
337static inline void set_page_writeback(struct page *page)
338{
339 test_set_page_writeback(page);
340}
341
342#ifdef CONFIG_PAGEFLAGS_EXTENDED
343
344
345
346
347
348
349__PAGEFLAG(Head, head)
350__PAGEFLAG(Tail, tail)
351
352static inline int PageCompound(struct page *page)
353{
354 return page->flags & ((1L << PG_head) | (1L << PG_tail));
355
356}
357#else
358
359
360
361
362
363
364TESTPAGEFLAG(Compound, compound)
365__PAGEFLAG(Head, compound)
366
367
368
369
370
371
372
373
374
375
376
377#define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim))
378
379static inline int PageTail(struct page *page)
380{
381 return ((page->flags & PG_head_tail_mask) == PG_head_tail_mask);
382}
383
384static inline void __SetPageTail(struct page *page)
385{
386 page->flags |= PG_head_tail_mask;
387}
388
389static inline void __ClearPageTail(struct page *page)
390{
391 page->flags &= ~PG_head_tail_mask;
392}
393
394#endif
395
396#ifdef CONFIG_HAVE_MLOCKED_PAGE_BIT
397#define __PG_MLOCKED (1 << PG_mlocked)
398#else
399#define __PG_MLOCKED 0
400#endif
401
402
403
404
405
406#define PAGE_FLAGS_CHECK_AT_FREE \
407 (1 << PG_lru | 1 << PG_locked | \
408 1 << PG_private | 1 << PG_private_2 | \
409 1 << PG_buddy | 1 << PG_writeback | 1 << PG_reserved | \
410 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \
411 1 << PG_unevictable | __PG_MLOCKED | __PG_HWPOISON)
412
413
414
415
416
417
418#define PAGE_FLAGS_CHECK_AT_PREP ((1 << NR_PAGEFLAGS) - 1)
419
420#define PAGE_FLAGS_PRIVATE \
421 (1 << PG_private | 1 << PG_private_2)
422
423
424
425
426
427
428
429static inline int page_has_private(struct page *page)
430{
431 return !!(page->flags & PAGE_FLAGS_PRIVATE);
432}
433
434#endif
435
436#endif
437