1
2
3
4
5
6#ifndef PAGE_FLAGS_H
7#define PAGE_FLAGS_H
8
9#include <linux/types.h>
10#include <linux/bug.h>
11#include <linux/mmdebug.h>
12#ifndef __GENERATING_BOUNDS_H
13#include <linux/mm_types.h>
14#include <generated/bounds.h>
15#endif
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103enum pageflags {
104 PG_locked,
105 PG_referenced,
106 PG_uptodate,
107 PG_dirty,
108 PG_lru,
109 PG_active,
110 PG_workingset,
111 PG_waiters,
112 PG_error,
113 PG_slab,
114 PG_owner_priv_1,
115 PG_arch_1,
116 PG_reserved,
117 PG_private,
118 PG_private_2,
119 PG_writeback,
120 PG_head,
121 PG_mappedtodisk,
122 PG_reclaim,
123 PG_swapbacked,
124 PG_unevictable,
125#ifdef CONFIG_MMU
126 PG_mlocked,
127#endif
128#ifdef CONFIG_ARCH_USES_PG_UNCACHED
129 PG_uncached,
130#endif
131#ifdef CONFIG_MEMORY_FAILURE
132 PG_hwpoison,
133#endif
134#if defined(CONFIG_IDLE_PAGE_TRACKING) && defined(CONFIG_64BIT)
135 PG_young,
136 PG_idle,
137#endif
138#ifdef CONFIG_64BIT
139 PG_arch_2,
140#endif
141 __NR_PAGEFLAGS,
142
143
144 PG_checked = PG_owner_priv_1,
145
146
147 PG_swapcache = PG_owner_priv_1,
148
149
150
151
152
153 PG_fscache = PG_private_2,
154
155
156
157 PG_pinned = PG_owner_priv_1,
158
159 PG_savepinned = PG_dirty,
160
161 PG_foreign = PG_owner_priv_1,
162
163 PG_xen_remapped = PG_owner_priv_1,
164
165
166 PG_slob_free = PG_private,
167
168
169 PG_double_map = PG_workingset,
170
171
172 PG_isolated = PG_reclaim,
173
174
175 PG_reported = PG_uptodate,
176};
177
178#ifndef __GENERATING_BOUNDS_H
179
180struct page;
181
182static inline struct page *compound_head(struct page *page)
183{
184 unsigned long head = READ_ONCE(page->compound_head);
185
186 if (unlikely(head & 1))
187 return (struct page *) (head - 1);
188 return page;
189}
190
191static __always_inline int PageTail(struct page *page)
192{
193 return READ_ONCE(page->compound_head) & 1;
194}
195
196static __always_inline int PageCompound(struct page *page)
197{
198 return test_bit(PG_head, &page->flags) || PageTail(page);
199}
200
201#define PAGE_POISON_PATTERN -1l
202static inline int PagePoisoned(const struct page *page)
203{
204 return page->flags == PAGE_POISON_PATTERN;
205}
206
207#ifdef CONFIG_DEBUG_VM
208void page_init_poison(struct page *page, size_t size);
209#else
210static inline void page_init_poison(struct page *page, size_t size)
211{
212}
213#endif
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241#define PF_POISONED_CHECK(page) ({ \
242 VM_BUG_ON_PGFLAGS(PagePoisoned(page), page); \
243 page; })
244#define PF_ANY(page, enforce) PF_POISONED_CHECK(page)
245#define PF_HEAD(page, enforce) PF_POISONED_CHECK(compound_head(page))
246#define PF_ONLY_HEAD(page, enforce) ({ \
247 VM_BUG_ON_PGFLAGS(PageTail(page), page); \
248 PF_POISONED_CHECK(page); })
249#define PF_NO_TAIL(page, enforce) ({ \
250 VM_BUG_ON_PGFLAGS(enforce && PageTail(page), page); \
251 PF_POISONED_CHECK(compound_head(page)); })
252#define PF_NO_COMPOUND(page, enforce) ({ \
253 VM_BUG_ON_PGFLAGS(enforce && PageCompound(page), page); \
254 PF_POISONED_CHECK(page); })
255#define PF_SECOND(page, enforce) ({ \
256 VM_BUG_ON_PGFLAGS(!PageHead(page), page); \
257 PF_POISONED_CHECK(&page[1]); })
258
259
260
261
262#define TESTPAGEFLAG(uname, lname, policy) \
263static __always_inline int Page##uname(struct page *page) \
264 { return test_bit(PG_##lname, &policy(page, 0)->flags); }
265
266#define SETPAGEFLAG(uname, lname, policy) \
267static __always_inline void SetPage##uname(struct page *page) \
268 { set_bit(PG_##lname, &policy(page, 1)->flags); }
269
270#define CLEARPAGEFLAG(uname, lname, policy) \
271static __always_inline void ClearPage##uname(struct page *page) \
272 { clear_bit(PG_##lname, &policy(page, 1)->flags); }
273
274#define __SETPAGEFLAG(uname, lname, policy) \
275static __always_inline void __SetPage##uname(struct page *page) \
276 { __set_bit(PG_##lname, &policy(page, 1)->flags); }
277
278#define __CLEARPAGEFLAG(uname, lname, policy) \
279static __always_inline void __ClearPage##uname(struct page *page) \
280 { __clear_bit(PG_##lname, &policy(page, 1)->flags); }
281
282#define TESTSETFLAG(uname, lname, policy) \
283static __always_inline int TestSetPage##uname(struct page *page) \
284 { return test_and_set_bit(PG_##lname, &policy(page, 1)->flags); }
285
286#define TESTCLEARFLAG(uname, lname, policy) \
287static __always_inline int TestClearPage##uname(struct page *page) \
288 { return test_and_clear_bit(PG_##lname, &policy(page, 1)->flags); }
289
290#define PAGEFLAG(uname, lname, policy) \
291 TESTPAGEFLAG(uname, lname, policy) \
292 SETPAGEFLAG(uname, lname, policy) \
293 CLEARPAGEFLAG(uname, lname, policy)
294
295#define __PAGEFLAG(uname, lname, policy) \
296 TESTPAGEFLAG(uname, lname, policy) \
297 __SETPAGEFLAG(uname, lname, policy) \
298 __CLEARPAGEFLAG(uname, lname, policy)
299
300#define TESTSCFLAG(uname, lname, policy) \
301 TESTSETFLAG(uname, lname, policy) \
302 TESTCLEARFLAG(uname, lname, policy)
303
304#define TESTPAGEFLAG_FALSE(uname) \
305static inline int Page##uname(const struct page *page) { return 0; }
306
307#define SETPAGEFLAG_NOOP(uname) \
308static inline void SetPage##uname(struct page *page) { }
309
310#define CLEARPAGEFLAG_NOOP(uname) \
311static inline void ClearPage##uname(struct page *page) { }
312
313#define __CLEARPAGEFLAG_NOOP(uname) \
314static inline void __ClearPage##uname(struct page *page) { }
315
316#define TESTSETFLAG_FALSE(uname) \
317static inline int TestSetPage##uname(struct page *page) { return 0; }
318
319#define TESTCLEARFLAG_FALSE(uname) \
320static inline int TestClearPage##uname(struct page *page) { return 0; }
321
322#define PAGEFLAG_FALSE(uname) TESTPAGEFLAG_FALSE(uname) \
323 SETPAGEFLAG_NOOP(uname) CLEARPAGEFLAG_NOOP(uname)
324
325#define TESTSCFLAG_FALSE(uname) \
326 TESTSETFLAG_FALSE(uname) TESTCLEARFLAG_FALSE(uname)
327
328__PAGEFLAG(Locked, locked, PF_NO_TAIL)
329PAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) __CLEARPAGEFLAG(Waiters, waiters, PF_ONLY_HEAD)
330PAGEFLAG(Error, error, PF_NO_TAIL) TESTCLEARFLAG(Error, error, PF_NO_TAIL)
331PAGEFLAG(Referenced, referenced, PF_HEAD)
332 TESTCLEARFLAG(Referenced, referenced, PF_HEAD)
333 __SETPAGEFLAG(Referenced, referenced, PF_HEAD)
334PAGEFLAG(Dirty, dirty, PF_HEAD) TESTSCFLAG(Dirty, dirty, PF_HEAD)
335 __CLEARPAGEFLAG(Dirty, dirty, PF_HEAD)
336PAGEFLAG(LRU, lru, PF_HEAD) __CLEARPAGEFLAG(LRU, lru, PF_HEAD)
337 TESTCLEARFLAG(LRU, lru, PF_HEAD)
338PAGEFLAG(Active, active, PF_HEAD) __CLEARPAGEFLAG(Active, active, PF_HEAD)
339 TESTCLEARFLAG(Active, active, PF_HEAD)
340PAGEFLAG(Workingset, workingset, PF_HEAD)
341 TESTCLEARFLAG(Workingset, workingset, PF_HEAD)
342__PAGEFLAG(Slab, slab, PF_NO_TAIL)
343__PAGEFLAG(SlobFree, slob_free, PF_NO_TAIL)
344PAGEFLAG(Checked, checked, PF_NO_COMPOUND)
345
346
347PAGEFLAG(Pinned, pinned, PF_NO_COMPOUND)
348 TESTSCFLAG(Pinned, pinned, PF_NO_COMPOUND)
349PAGEFLAG(SavePinned, savepinned, PF_NO_COMPOUND);
350PAGEFLAG(Foreign, foreign, PF_NO_COMPOUND);
351PAGEFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND)
352 TESTCLEARFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND)
353
354PAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
355 __CLEARPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
356 __SETPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
357PAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL)
358 __CLEARPAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL)
359 __SETPAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL)
360
361
362
363
364
365
366PAGEFLAG(Private, private, PF_ANY)
367PAGEFLAG(Private2, private_2, PF_ANY) TESTSCFLAG(Private2, private_2, PF_ANY)
368PAGEFLAG(OwnerPriv1, owner_priv_1, PF_ANY)
369 TESTCLEARFLAG(OwnerPriv1, owner_priv_1, PF_ANY)
370
371
372
373
374
375TESTPAGEFLAG(Writeback, writeback, PF_NO_TAIL)
376 TESTSCFLAG(Writeback, writeback, PF_NO_TAIL)
377PAGEFLAG(MappedToDisk, mappedtodisk, PF_NO_TAIL)
378
379
380PAGEFLAG(Reclaim, reclaim, PF_NO_TAIL)
381 TESTCLEARFLAG(Reclaim, reclaim, PF_NO_TAIL)
382PAGEFLAG(Readahead, reclaim, PF_NO_COMPOUND)
383 TESTCLEARFLAG(Readahead, reclaim, PF_NO_COMPOUND)
384
385#ifdef CONFIG_HIGHMEM
386
387
388
389
390#define PageHighMem(__p) is_highmem_idx(page_zonenum(__p))
391#else
392PAGEFLAG_FALSE(HighMem)
393#endif
394
395#ifdef CONFIG_SWAP
396static __always_inline int PageSwapCache(struct page *page)
397{
398#ifdef CONFIG_THP_SWAP
399 page = compound_head(page);
400#endif
401 return PageSwapBacked(page) && test_bit(PG_swapcache, &page->flags);
402
403}
404SETPAGEFLAG(SwapCache, swapcache, PF_NO_TAIL)
405CLEARPAGEFLAG(SwapCache, swapcache, PF_NO_TAIL)
406#else
407PAGEFLAG_FALSE(SwapCache)
408#endif
409
410PAGEFLAG(Unevictable, unevictable, PF_HEAD)
411 __CLEARPAGEFLAG(Unevictable, unevictable, PF_HEAD)
412 TESTCLEARFLAG(Unevictable, unevictable, PF_HEAD)
413
414#ifdef CONFIG_MMU
415PAGEFLAG(Mlocked, mlocked, PF_NO_TAIL)
416 __CLEARPAGEFLAG(Mlocked, mlocked, PF_NO_TAIL)
417 TESTSCFLAG(Mlocked, mlocked, PF_NO_TAIL)
418#else
419PAGEFLAG_FALSE(Mlocked) __CLEARPAGEFLAG_NOOP(Mlocked)
420 TESTSCFLAG_FALSE(Mlocked)
421#endif
422
423#ifdef CONFIG_ARCH_USES_PG_UNCACHED
424PAGEFLAG(Uncached, uncached, PF_NO_COMPOUND)
425#else
426PAGEFLAG_FALSE(Uncached)
427#endif
428
429#ifdef CONFIG_MEMORY_FAILURE
430PAGEFLAG(HWPoison, hwpoison, PF_ANY)
431TESTSCFLAG(HWPoison, hwpoison, PF_ANY)
432#define __PG_HWPOISON (1UL << PG_hwpoison)
433extern bool take_page_off_buddy(struct page *page);
434#else
435PAGEFLAG_FALSE(HWPoison)
436#define __PG_HWPOISON 0
437#endif
438
439#if defined(CONFIG_IDLE_PAGE_TRACKING) && defined(CONFIG_64BIT)
440TESTPAGEFLAG(Young, young, PF_ANY)
441SETPAGEFLAG(Young, young, PF_ANY)
442TESTCLEARFLAG(Young, young, PF_ANY)
443PAGEFLAG(Idle, idle, PF_ANY)
444#endif
445
446
447
448
449
450
451
452__PAGEFLAG(Reported, reported, PF_NO_COMPOUND)
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471#define PAGE_MAPPING_ANON 0x1
472#define PAGE_MAPPING_MOVABLE 0x2
473#define PAGE_MAPPING_KSM (PAGE_MAPPING_ANON | PAGE_MAPPING_MOVABLE)
474#define PAGE_MAPPING_FLAGS (PAGE_MAPPING_ANON | PAGE_MAPPING_MOVABLE)
475
476static __always_inline int PageMappingFlags(struct page *page)
477{
478 return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) != 0;
479}
480
481static __always_inline int PageAnon(struct page *page)
482{
483 page = compound_head(page);
484 return ((unsigned long)page->mapping & PAGE_MAPPING_ANON) != 0;
485}
486
487static __always_inline int __PageMovable(struct page *page)
488{
489 return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) ==
490 PAGE_MAPPING_MOVABLE;
491}
492
493#ifdef CONFIG_KSM
494
495
496
497
498
499
500static __always_inline int PageKsm(struct page *page)
501{
502 page = compound_head(page);
503 return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) ==
504 PAGE_MAPPING_KSM;
505}
506#else
507TESTPAGEFLAG_FALSE(Ksm)
508#endif
509
510u64 stable_page_flags(struct page *page);
511
512static inline int PageUptodate(struct page *page)
513{
514 int ret;
515 page = compound_head(page);
516 ret = test_bit(PG_uptodate, &(page)->flags);
517
518
519
520
521
522
523
524
525 if (ret)
526 smp_rmb();
527
528 return ret;
529}
530
531static __always_inline void __SetPageUptodate(struct page *page)
532{
533 VM_BUG_ON_PAGE(PageTail(page), page);
534 smp_wmb();
535 __set_bit(PG_uptodate, &page->flags);
536}
537
538static __always_inline void SetPageUptodate(struct page *page)
539{
540 VM_BUG_ON_PAGE(PageTail(page), page);
541
542
543
544
545
546 smp_wmb();
547 set_bit(PG_uptodate, &page->flags);
548}
549
550CLEARPAGEFLAG(Uptodate, uptodate, PF_NO_TAIL)
551
552int test_clear_page_writeback(struct page *page);
553int __test_set_page_writeback(struct page *page, bool keep_write);
554
555#define test_set_page_writeback(page) \
556 __test_set_page_writeback(page, false)
557#define test_set_page_writeback_keepwrite(page) \
558 __test_set_page_writeback(page, true)
559
560static inline void set_page_writeback(struct page *page)
561{
562 test_set_page_writeback(page);
563}
564
565static inline void set_page_writeback_keepwrite(struct page *page)
566{
567 test_set_page_writeback_keepwrite(page);
568}
569
570__PAGEFLAG(Head, head, PF_ANY) CLEARPAGEFLAG(Head, head, PF_ANY)
571
572static __always_inline void set_compound_head(struct page *page, struct page *head)
573{
574 WRITE_ONCE(page->compound_head, (unsigned long)head + 1);
575}
576
577static __always_inline void clear_compound_head(struct page *page)
578{
579 WRITE_ONCE(page->compound_head, 0);
580}
581
582#ifdef CONFIG_TRANSPARENT_HUGEPAGE
583static inline void ClearPageCompound(struct page *page)
584{
585 BUG_ON(!PageHead(page));
586 ClearPageHead(page);
587}
588#endif
589
590#define PG_head_mask ((1UL << PG_head))
591
592#ifdef CONFIG_HUGETLB_PAGE
593int PageHuge(struct page *page);
594int PageHeadHuge(struct page *page);
595#else
596TESTPAGEFLAG_FALSE(Huge)
597TESTPAGEFLAG_FALSE(HeadHuge)
598#endif
599
600
601#ifdef CONFIG_TRANSPARENT_HUGEPAGE
602
603
604
605
606
607
608
609
610static inline int PageTransHuge(struct page *page)
611{
612 VM_BUG_ON_PAGE(PageTail(page), page);
613 return PageHead(page);
614}
615
616
617
618
619
620
621static inline int PageTransCompound(struct page *page)
622{
623 return PageCompound(page);
624}
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647static inline int PageTransCompoundMap(struct page *page)
648{
649 struct page *head;
650
651 if (!PageTransCompound(page))
652 return 0;
653
654 if (PageAnon(page))
655 return atomic_read(&page->_mapcount) < 0;
656
657 head = compound_head(page);
658
659 return atomic_read(&page->_mapcount) ==
660 atomic_read(compound_mapcount_ptr(head));
661}
662
663
664
665
666
667
668static inline int PageTransTail(struct page *page)
669{
670 return PageTail(page);
671}
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686PAGEFLAG(DoubleMap, double_map, PF_SECOND)
687 TESTSCFLAG(DoubleMap, double_map, PF_SECOND)
688#else
689TESTPAGEFLAG_FALSE(TransHuge)
690TESTPAGEFLAG_FALSE(TransCompound)
691TESTPAGEFLAG_FALSE(TransCompoundMap)
692TESTPAGEFLAG_FALSE(TransTail)
693PAGEFLAG_FALSE(DoubleMap)
694 TESTSCFLAG_FALSE(DoubleMap)
695#endif
696
697
698
699
700
701
702
703
704
705
706#define PAGE_TYPE_BASE 0xf0000000
707
708#define PAGE_MAPCOUNT_RESERVE -128
709#define PG_buddy 0x00000080
710#define PG_offline 0x00000100
711#define PG_table 0x00000200
712#define PG_guard 0x00000400
713
714#define PageType(page, flag) \
715 ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
716
717static inline int page_has_type(struct page *page)
718{
719 return (int)page->page_type < PAGE_MAPCOUNT_RESERVE;
720}
721
722#define PAGE_TYPE_OPS(uname, lname) \
723static __always_inline int Page##uname(struct page *page) \
724{ \
725 return PageType(page, PG_##lname); \
726} \
727static __always_inline void __SetPage##uname(struct page *page) \
728{ \
729 VM_BUG_ON_PAGE(!PageType(page, 0), page); \
730 page->page_type &= ~PG_##lname; \
731} \
732static __always_inline void __ClearPage##uname(struct page *page) \
733{ \
734 VM_BUG_ON_PAGE(!Page##uname(page), page); \
735 page->page_type |= PG_##lname; \
736}
737
738
739
740
741
742PAGE_TYPE_OPS(Buddy, buddy)
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761PAGE_TYPE_OPS(Offline, offline)
762
763
764
765
766PAGE_TYPE_OPS(Table, table)
767
768
769
770
771PAGE_TYPE_OPS(Guard, guard)
772
773extern bool is_free_buddy_page(struct page *page);
774
775__PAGEFLAG(Isolated, isolated, PF_ANY);
776
777
778
779
780
781static inline int PageSlabPfmemalloc(struct page *page)
782{
783 VM_BUG_ON_PAGE(!PageSlab(page), page);
784 return PageActive(page);
785}
786
787static inline void SetPageSlabPfmemalloc(struct page *page)
788{
789 VM_BUG_ON_PAGE(!PageSlab(page), page);
790 SetPageActive(page);
791}
792
793static inline void __ClearPageSlabPfmemalloc(struct page *page)
794{
795 VM_BUG_ON_PAGE(!PageSlab(page), page);
796 __ClearPageActive(page);
797}
798
799static inline void ClearPageSlabPfmemalloc(struct page *page)
800{
801 VM_BUG_ON_PAGE(!PageSlab(page), page);
802 ClearPageActive(page);
803}
804
805#ifdef CONFIG_MMU
806#define __PG_MLOCKED (1UL << PG_mlocked)
807#else
808#define __PG_MLOCKED 0
809#endif
810
811
812
813
814
815#define PAGE_FLAGS_CHECK_AT_FREE \
816 (1UL << PG_lru | 1UL << PG_locked | \
817 1UL << PG_private | 1UL << PG_private_2 | \
818 1UL << PG_writeback | 1UL << PG_reserved | \
819 1UL << PG_slab | 1UL << PG_active | \
820 1UL << PG_unevictable | __PG_MLOCKED)
821
822
823
824
825
826
827
828
829
830#define PAGE_FLAGS_CHECK_AT_PREP \
831 (((1UL << NR_PAGEFLAGS) - 1) & ~__PG_HWPOISON)
832
833#define PAGE_FLAGS_PRIVATE \
834 (1UL << PG_private | 1UL << PG_private_2)
835
836
837
838
839
840
841
842static inline int page_has_private(struct page *page)
843{
844 return !!(page->flags & PAGE_FLAGS_PRIVATE);
845}
846
847#undef PF_ANY
848#undef PF_HEAD
849#undef PF_ONLY_HEAD
850#undef PF_NO_TAIL
851#undef PF_NO_COMPOUND
852#undef PF_SECOND
853#endif
854
855#endif
856