This source file includes following definitions.
- compound_head
- PageTail
- PageCompound
- PagePoisoned
- page_init_poison
- PAGEFLAG_FALSE
- PAGEFLAG_FALSE
- PageMappingFlags
- PageAnon
- __PageMovable
- PageKsm
- TESTPAGEFLAG_FALSE
- __SetPageUptodate
- SetPageUptodate
- set_page_writeback
- set_page_writeback_keepwrite
- __PAGEFLAG
- clear_compound_head
- ClearPageCompound
- TESTPAGEFLAG_FALSE
- PageTransHuge
- PageTransCompound
- PageTransCompoundMap
- PageTransTail
- PageDoubleMap
- SetPageDoubleMap
- ClearPageDoubleMap
- TestSetPageDoubleMap
- TestClearPageDoubleMap
- page_has_type
- PAGE_TYPE_OPS
- SetPageSlabPfmemalloc
- __ClearPageSlabPfmemalloc
- ClearPageSlabPfmemalloc
- page_has_private
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 enum 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
170 struct page;
171
172 static 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
181 static __always_inline int PageTail(struct page *page)
182 {
183 return READ_ONCE(page->compound_head) & 1;
184 }
185
186 static __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
192 static inline int PagePoisoned(const struct page *page)
193 {
194 return page->flags == PAGE_POISON_PATTERN;
195 }
196
197 #ifdef CONFIG_DEBUG_VM
198 void page_init_poison(struct page *page, size_t size);
199 #else
200 static 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) \
247 static __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) \
251 static __always_inline void SetPage##uname(struct page *page) \
252 { set_bit(PG_##lname, &policy(page, 1)->flags); }
253
254 #define CLEARPAGEFLAG(uname, lname, policy) \
255 static __always_inline void ClearPage##uname(struct page *page) \
256 { clear_bit(PG_##lname, &policy(page, 1)->flags); }
257
258 #define __SETPAGEFLAG(uname, lname, policy) \
259 static __always_inline void __SetPage##uname(struct page *page) \
260 { __set_bit(PG_##lname, &policy(page, 1)->flags); }
261
262 #define __CLEARPAGEFLAG(uname, lname, policy) \
263 static __always_inline void __ClearPage##uname(struct page *page) \
264 { __clear_bit(PG_##lname, &policy(page, 1)->flags); }
265
266 #define TESTSETFLAG(uname, lname, policy) \
267 static __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) \
271 static __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) \
289 static inline int Page##uname(const struct page *page) { return 0; }
290
291 #define SETPAGEFLAG_NOOP(uname) \
292 static inline void SetPage##uname(struct page *page) { }
293
294 #define CLEARPAGEFLAG_NOOP(uname) \
295 static inline void ClearPage##uname(struct page *page) { }
296
297 #define __CLEARPAGEFLAG_NOOP(uname) \
298 static inline void __ClearPage##uname(struct page *page) { }
299
300 #define TESTSETFLAG_FALSE(uname) \
301 static inline int TestSetPage##uname(struct page *page) { return 0; }
302
303 #define TESTCLEARFLAG_FALSE(uname) \
304 static 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)
313 PAGEFLAG(Waiters, waiters, PF_ONLY_HEAD) __CLEARPAGEFLAG(Waiters, waiters, PF_ONLY_HEAD)
314 PAGEFLAG(Error, error, PF_NO_TAIL) TESTCLEARFLAG(Error, error, PF_NO_TAIL)
315 PAGEFLAG(Referenced, referenced, PF_HEAD)
316 TESTCLEARFLAG(Referenced, referenced, PF_HEAD)
317 __SETPAGEFLAG(Referenced, referenced, PF_HEAD)
318 PAGEFLAG(Dirty, dirty, PF_HEAD) TESTSCFLAG(Dirty, dirty, PF_HEAD)
319 __CLEARPAGEFLAG(Dirty, dirty, PF_HEAD)
320 PAGEFLAG(LRU, lru, PF_HEAD) __CLEARPAGEFLAG(LRU, lru, PF_HEAD)
321 PAGEFLAG(Active, active, PF_HEAD) __CLEARPAGEFLAG(Active, active, PF_HEAD)
322 TESTCLEARFLAG(Active, active, PF_HEAD)
323 PAGEFLAG(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)
327 PAGEFLAG(Checked, checked, PF_NO_COMPOUND)
328
329
330 PAGEFLAG(Pinned, pinned, PF_NO_COMPOUND)
331 TESTSCFLAG(Pinned, pinned, PF_NO_COMPOUND)
332 PAGEFLAG(SavePinned, savepinned, PF_NO_COMPOUND);
333 PAGEFLAG(Foreign, foreign, PF_NO_COMPOUND);
334 PAGEFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND)
335 TESTCLEARFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND)
336
337 PAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
338 __CLEARPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
339 __SETPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
340 PAGEFLAG(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
349 PAGEFLAG(Private, private, PF_ANY) __SETPAGEFLAG(Private, private, PF_ANY)
350 __CLEARPAGEFLAG(Private, private, PF_ANY)
351 PAGEFLAG(Private2, private_2, PF_ANY) TESTSCFLAG(Private2, private_2, PF_ANY)
352 PAGEFLAG(OwnerPriv1, owner_priv_1, PF_ANY)
353 TESTCLEARFLAG(OwnerPriv1, owner_priv_1, PF_ANY)
354
355
356
357
358
359 TESTPAGEFLAG(Writeback, writeback, PF_NO_TAIL)
360 TESTSCFLAG(Writeback, writeback, PF_NO_TAIL)
361 PAGEFLAG(MappedToDisk, mappedtodisk, PF_NO_TAIL)
362
363
364 PAGEFLAG(Reclaim, reclaim, PF_NO_TAIL)
365 TESTCLEARFLAG(Reclaim, reclaim, PF_NO_TAIL)
366 PAGEFLAG(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
376 PAGEFLAG_FALSE(HighMem)
377 #endif
378
379 #ifdef CONFIG_SWAP
380 static __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 }
388 SETPAGEFLAG(SwapCache, swapcache, PF_NO_TAIL)
389 CLEARPAGEFLAG(SwapCache, swapcache, PF_NO_TAIL)
390 #else
391 PAGEFLAG_FALSE(SwapCache)
392 #endif
393
394 PAGEFLAG(Unevictable, unevictable, PF_HEAD)
395 __CLEARPAGEFLAG(Unevictable, unevictable, PF_HEAD)
396 TESTCLEARFLAG(Unevictable, unevictable, PF_HEAD)
397
398 #ifdef CONFIG_MMU
399 PAGEFLAG(Mlocked, mlocked, PF_NO_TAIL)
400 __CLEARPAGEFLAG(Mlocked, mlocked, PF_NO_TAIL)
401 TESTSCFLAG(Mlocked, mlocked, PF_NO_TAIL)
402 #else
403 PAGEFLAG_FALSE(Mlocked) __CLEARPAGEFLAG_NOOP(Mlocked)
404 TESTSCFLAG_FALSE(Mlocked)
405 #endif
406
407 #ifdef CONFIG_ARCH_USES_PG_UNCACHED
408 PAGEFLAG(Uncached, uncached, PF_NO_COMPOUND)
409 #else
410 PAGEFLAG_FALSE(Uncached)
411 #endif
412
413 #ifdef CONFIG_MEMORY_FAILURE
414 PAGEFLAG(HWPoison, hwpoison, PF_ANY)
415 TESTSCFLAG(HWPoison, hwpoison, PF_ANY)
416 #define __PG_HWPOISON (1UL << PG_hwpoison)
417 extern bool set_hwpoison_free_buddy_page(struct page *page);
418 #else
419 PAGEFLAG_FALSE(HWPoison)
420 static 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)
428 TESTPAGEFLAG(Young, young, PF_ANY)
429 SETPAGEFLAG(Young, young, PF_ANY)
430 TESTCLEARFLAG(Young, young, PF_ANY)
431 PAGEFLAG(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
456 static __always_inline int PageMappingFlags(struct page *page)
457 {
458 return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) != 0;
459 }
460
461 static __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
467 static __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
480 static __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
487 TESTPAGEFLAG_FALSE(Ksm)
488 #endif
489
490 u64 stable_page_flags(struct page *page);
491
492 static 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
511 static __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
518 static __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
530 CLEARPAGEFLAG(Uptodate, uptodate, PF_NO_TAIL)
531
532 int test_clear_page_writeback(struct page *page);
533 int __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
540 static inline void set_page_writeback(struct page *page)
541 {
542 test_set_page_writeback(page);
543 }
544
545 static 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
552 static __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
557 static __always_inline void clear_compound_head(struct page *page)
558 {
559 WRITE_ONCE(page->compound_head, 0);
560 }
561
562 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
563 static 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
573 int PageHuge(struct page *page);
574 int PageHeadHuge(struct page *page);
575 bool page_huge_active(struct page *page);
576 #else
577 TESTPAGEFLAG_FALSE(Huge)
578 TESTPAGEFLAG_FALSE(HeadHuge)
579
580 static 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
596 static 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
607 static 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
633 static 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
654 static 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
672 static inline int PageDoubleMap(struct page *page)
673 {
674 return PageHead(page) && test_bit(PG_double_map, &page[1].flags);
675 }
676
677 static 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
683 static 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 }
688 static 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
694 static 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
701 TESTPAGEFLAG_FALSE(TransHuge)
702 TESTPAGEFLAG_FALSE(TransCompound)
703 TESTPAGEFLAG_FALSE(TransCompoundMap)
704 TESTPAGEFLAG_FALSE(TransTail)
705 PAGEFLAG_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
731 static 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) \
737 static __always_inline int Page##uname(struct page *page) \
738 { \
739 return PageType(page, PG_##lname); \
740 } \
741 static __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 } \
746 static __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
756 PAGE_TYPE_OPS(Buddy, buddy)
757
758
759
760
761
762
763
764
765 PAGE_TYPE_OPS(Offline, offline)
766
767
768
769
770
771 PAGE_TYPE_OPS(Kmemcg, kmemcg)
772
773
774
775
776 PAGE_TYPE_OPS(Table, table)
777
778
779
780
781 PAGE_TYPE_OPS(Guard, guard)
782
783 extern bool is_free_buddy_page(struct page *page);
784
785 __PAGEFLAG(Isolated, isolated, PF_ANY);
786
787
788
789
790
791 static inline int PageSlabPfmemalloc(struct page *page)
792 {
793 VM_BUG_ON_PAGE(!PageSlab(page), page);
794 return PageActive(page);
795 }
796
797 static inline void SetPageSlabPfmemalloc(struct page *page)
798 {
799 VM_BUG_ON_PAGE(!PageSlab(page), page);
800 SetPageActive(page);
801 }
802
803 static inline void __ClearPageSlabPfmemalloc(struct page *page)
804 {
805 VM_BUG_ON_PAGE(!PageSlab(page), page);
806 __ClearPageActive(page);
807 }
808
809 static 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
852 static 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