1
2
3
4
5#ifndef PAGE_FLAGS_H
6#define PAGE_FLAGS_H
7
8#include <linux/types.h>
9#include <linux/bug.h>
10#include <linux/mmdebug.h>
11#ifndef __GENERATING_BOUNDS_H
12#include <linux/mm_types.h>
13#include <generated/bounds.h>
14#endif
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
74enum pageflags {
75 PG_locked,
76 PG_error,
77 PG_referenced,
78 PG_uptodate,
79 PG_dirty,
80 PG_lru,
81 PG_active,
82 PG_slab,
83 PG_owner_priv_1,
84 PG_arch_1,
85 PG_reserved,
86 PG_private,
87 PG_private_2,
88 PG_writeback,
89#ifdef CONFIG_PAGEFLAGS_EXTENDED
90 PG_head,
91 PG_tail,
92#else
93 PG_compound,
94#endif
95 PG_swapcache,
96 PG_mappedtodisk,
97 PG_reclaim,
98 PG_swapbacked,
99 PG_unevictable,
100#ifdef CONFIG_MMU
101 PG_mlocked,
102#endif
103#ifdef CONFIG_ARCH_USES_PG_UNCACHED
104 PG_uncached,
105#endif
106#ifdef CONFIG_MEMORY_FAILURE
107 PG_hwpoison,
108#endif
109#ifdef CONFIG_TRANSPARENT_HUGEPAGE
110 PG_compound_lock,
111#endif
112 __NR_PAGEFLAGS,
113
114
115 PG_checked = PG_owner_priv_1,
116
117
118
119
120
121 PG_fscache = PG_private_2,
122
123
124
125 PG_pinned = PG_owner_priv_1,
126
127 PG_savepinned = PG_dirty,
128
129 PG_foreign = PG_owner_priv_1,
130
131
132 PG_slob_free = PG_private,
133};
134
135#ifndef __GENERATING_BOUNDS_H
136
137
138
139
140#define TESTPAGEFLAG(uname, lname) \
141static inline int Page##uname(const struct page *page) \
142 { return test_bit(PG_##lname, &page->flags); }
143
144#define SETPAGEFLAG(uname, lname) \
145static inline void SetPage##uname(struct page *page) \
146 { set_bit(PG_##lname, &page->flags); }
147
148#define CLEARPAGEFLAG(uname, lname) \
149static inline void ClearPage##uname(struct page *page) \
150 { clear_bit(PG_##lname, &page->flags); }
151
152#define __SETPAGEFLAG(uname, lname) \
153static inline void __SetPage##uname(struct page *page) \
154 { __set_bit(PG_##lname, &page->flags); }
155
156#define __CLEARPAGEFLAG(uname, lname) \
157static inline void __ClearPage##uname(struct page *page) \
158 { __clear_bit(PG_##lname, &page->flags); }
159
160#define TESTSETFLAG(uname, lname) \
161static inline int TestSetPage##uname(struct page *page) \
162 { return test_and_set_bit(PG_##lname, &page->flags); }
163
164#define TESTCLEARFLAG(uname, lname) \
165static inline int TestClearPage##uname(struct page *page) \
166 { return test_and_clear_bit(PG_##lname, &page->flags); }
167
168#define __TESTCLEARFLAG(uname, lname) \
169static inline int __TestClearPage##uname(struct page *page) \
170 { return __test_and_clear_bit(PG_##lname, &page->flags); }
171
172#define PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname) \
173 SETPAGEFLAG(uname, lname) CLEARPAGEFLAG(uname, lname)
174
175#define __PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname) \
176 __SETPAGEFLAG(uname, lname) __CLEARPAGEFLAG(uname, lname)
177
178#define TESTSCFLAG(uname, lname) \
179 TESTSETFLAG(uname, lname) TESTCLEARFLAG(uname, lname)
180
181#define TESTPAGEFLAG_FALSE(uname) \
182static inline int Page##uname(const struct page *page) { return 0; }
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 TESTSETFLAG_FALSE(uname) \
194static inline int TestSetPage##uname(struct page *page) { return 0; }
195
196#define TESTCLEARFLAG_FALSE(uname) \
197static inline int TestClearPage##uname(struct page *page) { return 0; }
198
199#define __TESTCLEARFLAG_FALSE(uname) \
200static inline int __TestClearPage##uname(struct page *page) { return 0; }
201
202#define PAGEFLAG_FALSE(uname) TESTPAGEFLAG_FALSE(uname) \
203 SETPAGEFLAG_NOOP(uname) CLEARPAGEFLAG_NOOP(uname)
204
205#define TESTSCFLAG_FALSE(uname) \
206 TESTSETFLAG_FALSE(uname) TESTCLEARFLAG_FALSE(uname)
207
208struct page;
209
210TESTPAGEFLAG(Locked, locked)
211PAGEFLAG(Error, error) TESTCLEARFLAG(Error, error)
212PAGEFLAG(Referenced, referenced) TESTCLEARFLAG(Referenced, referenced)
213 __SETPAGEFLAG(Referenced, referenced)
214PAGEFLAG(Dirty, dirty) TESTSCFLAG(Dirty, dirty) __CLEARPAGEFLAG(Dirty, dirty)
215PAGEFLAG(LRU, lru) __CLEARPAGEFLAG(LRU, lru)
216PAGEFLAG(Active, active) __CLEARPAGEFLAG(Active, active)
217 TESTCLEARFLAG(Active, active)
218__PAGEFLAG(Slab, slab)
219PAGEFLAG(Checked, checked)
220PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned)
221PAGEFLAG(SavePinned, savepinned);
222PAGEFLAG(Foreign, foreign);
223PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
224PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked)
225 __SETPAGEFLAG(SwapBacked, swapbacked)
226
227__PAGEFLAG(SlobFree, slob_free)
228
229
230
231
232
233
234PAGEFLAG(Private, private) __SETPAGEFLAG(Private, private)
235 __CLEARPAGEFLAG(Private, private)
236PAGEFLAG(Private2, private_2) TESTSCFLAG(Private2, private_2)
237PAGEFLAG(OwnerPriv1, owner_priv_1) TESTCLEARFLAG(OwnerPriv1, owner_priv_1)
238
239
240
241
242
243TESTPAGEFLAG(Writeback, writeback) TESTSCFLAG(Writeback, writeback)
244PAGEFLAG(MappedToDisk, mappedtodisk)
245
246
247PAGEFLAG(Reclaim, reclaim) TESTCLEARFLAG(Reclaim, reclaim)
248PAGEFLAG(Readahead, reclaim) TESTCLEARFLAG(Readahead, reclaim)
249
250#ifdef CONFIG_HIGHMEM
251
252
253
254
255#define PageHighMem(__p) is_highmem(page_zone(__p))
256#else
257PAGEFLAG_FALSE(HighMem)
258#endif
259
260#ifdef CONFIG_SWAP
261PAGEFLAG(SwapCache, swapcache)
262#else
263PAGEFLAG_FALSE(SwapCache)
264#endif
265
266PAGEFLAG(Unevictable, unevictable) __CLEARPAGEFLAG(Unevictable, unevictable)
267 TESTCLEARFLAG(Unevictable, unevictable)
268
269#ifdef CONFIG_MMU
270PAGEFLAG(Mlocked, mlocked) __CLEARPAGEFLAG(Mlocked, mlocked)
271 TESTSCFLAG(Mlocked, mlocked) __TESTCLEARFLAG(Mlocked, mlocked)
272#else
273PAGEFLAG_FALSE(Mlocked) __CLEARPAGEFLAG_NOOP(Mlocked)
274 TESTSCFLAG_FALSE(Mlocked) __TESTCLEARFLAG_FALSE(Mlocked)
275#endif
276
277#ifdef CONFIG_ARCH_USES_PG_UNCACHED
278PAGEFLAG(Uncached, uncached)
279#else
280PAGEFLAG_FALSE(Uncached)
281#endif
282
283#ifdef CONFIG_MEMORY_FAILURE
284PAGEFLAG(HWPoison, hwpoison)
285TESTSCFLAG(HWPoison, hwpoison)
286#define __PG_HWPOISON (1UL << PG_hwpoison)
287#else
288PAGEFLAG_FALSE(HWPoison)
289#define __PG_HWPOISON 0
290#endif
291
292u64 stable_page_flags(struct page *page);
293
294static inline int PageUptodate(struct page *page)
295{
296 int ret = test_bit(PG_uptodate, &(page)->flags);
297
298
299
300
301
302
303
304
305
306 if (ret)
307 smp_rmb();
308
309 return ret;
310}
311
312static inline void __SetPageUptodate(struct page *page)
313{
314 smp_wmb();
315 __set_bit(PG_uptodate, &(page)->flags);
316}
317
318static inline void SetPageUptodate(struct page *page)
319{
320
321
322
323
324
325 smp_wmb();
326 set_bit(PG_uptodate, &(page)->flags);
327}
328
329CLEARPAGEFLAG(Uptodate, uptodate)
330
331extern void cancel_dirty_page(struct page *page, unsigned int account_size);
332
333int test_clear_page_writeback(struct page *page);
334int __test_set_page_writeback(struct page *page, bool keep_write);
335
336#define test_set_page_writeback(page) \
337 __test_set_page_writeback(page, false)
338#define test_set_page_writeback_keepwrite(page) \
339 __test_set_page_writeback(page, true)
340
341static inline void set_page_writeback(struct page *page)
342{
343 test_set_page_writeback(page);
344}
345
346static inline void set_page_writeback_keepwrite(struct page *page)
347{
348 test_set_page_writeback_keepwrite(page);
349}
350
351#ifdef CONFIG_PAGEFLAGS_EXTENDED
352
353
354
355
356
357
358
359
360__PAGEFLAG(Head, head) CLEARPAGEFLAG(Head, head)
361__PAGEFLAG(Tail, tail)
362
363static inline int PageCompound(struct page *page)
364{
365 return page->flags & ((1L << PG_head) | (1L << PG_tail));
366
367}
368#ifdef CONFIG_TRANSPARENT_HUGEPAGE
369static inline void ClearPageCompound(struct page *page)
370{
371 BUG_ON(!PageHead(page));
372 ClearPageHead(page);
373}
374#endif
375
376#define PG_head_mask ((1L << PG_head))
377
378#else
379
380
381
382
383
384
385TESTPAGEFLAG(Compound, compound)
386__SETPAGEFLAG(Head, compound) __CLEARPAGEFLAG(Head, compound)
387
388
389
390
391
392
393
394
395
396
397
398#define PG_head_mask ((1L << PG_compound))
399#define PG_head_tail_mask ((1L << PG_compound) | (1L << PG_reclaim))
400
401static inline int PageHead(struct page *page)
402{
403 return ((page->flags & PG_head_tail_mask) == PG_head_mask);
404}
405
406static inline int PageTail(struct page *page)
407{
408 return ((page->flags & PG_head_tail_mask) == PG_head_tail_mask);
409}
410
411static inline void __SetPageTail(struct page *page)
412{
413 page->flags |= PG_head_tail_mask;
414}
415
416static inline void __ClearPageTail(struct page *page)
417{
418 page->flags &= ~PG_head_tail_mask;
419}
420
421#ifdef CONFIG_TRANSPARENT_HUGEPAGE
422static inline void ClearPageCompound(struct page *page)
423{
424 BUG_ON((page->flags & PG_head_tail_mask) != (1 << PG_compound));
425 clear_bit(PG_compound, &page->flags);
426}
427#endif
428
429#endif
430
431#ifdef CONFIG_TRANSPARENT_HUGEPAGE
432
433
434
435
436
437
438
439
440static inline int PageTransHuge(struct page *page)
441{
442 VM_BUG_ON_PAGE(PageTail(page), page);
443 return PageHead(page);
444}
445
446
447
448
449
450
451static inline int PageTransCompound(struct page *page)
452{
453 return PageCompound(page);
454}
455
456
457
458
459
460
461static inline int PageTransTail(struct page *page)
462{
463 return PageTail(page);
464}
465
466#else
467
468static inline int PageTransHuge(struct page *page)
469{
470 return 0;
471}
472
473static inline int PageTransCompound(struct page *page)
474{
475 return 0;
476}
477
478static inline int PageTransTail(struct page *page)
479{
480 return 0;
481}
482#endif
483
484
485
486
487
488static inline int PageSlabPfmemalloc(struct page *page)
489{
490 VM_BUG_ON_PAGE(!PageSlab(page), page);
491 return PageActive(page);
492}
493
494static inline void SetPageSlabPfmemalloc(struct page *page)
495{
496 VM_BUG_ON_PAGE(!PageSlab(page), page);
497 SetPageActive(page);
498}
499
500static inline void __ClearPageSlabPfmemalloc(struct page *page)
501{
502 VM_BUG_ON_PAGE(!PageSlab(page), page);
503 __ClearPageActive(page);
504}
505
506static inline void ClearPageSlabPfmemalloc(struct page *page)
507{
508 VM_BUG_ON_PAGE(!PageSlab(page), page);
509 ClearPageActive(page);
510}
511
512#ifdef CONFIG_MMU
513#define __PG_MLOCKED (1 << PG_mlocked)
514#else
515#define __PG_MLOCKED 0
516#endif
517
518#ifdef CONFIG_TRANSPARENT_HUGEPAGE
519#define __PG_COMPOUND_LOCK (1 << PG_compound_lock)
520#else
521#define __PG_COMPOUND_LOCK 0
522#endif
523
524
525
526
527
528#define PAGE_FLAGS_CHECK_AT_FREE \
529 (1 << PG_lru | 1 << PG_locked | \
530 1 << PG_private | 1 << PG_private_2 | \
531 1 << PG_writeback | 1 << PG_reserved | \
532 1 << PG_slab | 1 << PG_swapcache | 1 << PG_active | \
533 1 << PG_unevictable | __PG_MLOCKED | __PG_HWPOISON | \
534 __PG_COMPOUND_LOCK)
535
536
537
538
539
540
541#define PAGE_FLAGS_CHECK_AT_PREP ((1 << NR_PAGEFLAGS) - 1)
542
543#define PAGE_FLAGS_PRIVATE \
544 (1 << PG_private | 1 << PG_private_2)
545
546
547
548
549
550
551
552static inline int page_has_private(struct page *page)
553{
554 return !!(page->flags & PAGE_FLAGS_PRIVATE);
555}
556
557#endif
558
559#endif
560