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