0001
0002
0003
0004
0005
0006 #ifndef PAGE_FLAGS_H
0007 #define PAGE_FLAGS_H
0008
0009 #include <linux/types.h>
0010 #include <linux/bug.h>
0011 #include <linux/mmdebug.h>
0012 #ifndef __GENERATING_BOUNDS_H
0013 #include <linux/mm_types.h>
0014 #include <generated/bounds.h>
0015 #endif
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100 enum pageflags {
0101 PG_locked,
0102 PG_referenced,
0103 PG_uptodate,
0104 PG_dirty,
0105 PG_lru,
0106 PG_active,
0107 PG_workingset,
0108 PG_waiters,
0109 PG_error,
0110 PG_slab,
0111 PG_owner_priv_1,
0112 PG_arch_1,
0113 PG_reserved,
0114 PG_private,
0115 PG_private_2,
0116 PG_writeback,
0117 PG_head,
0118 PG_mappedtodisk,
0119 PG_reclaim,
0120 PG_swapbacked,
0121 PG_unevictable,
0122 #ifdef CONFIG_MMU
0123 PG_mlocked,
0124 #endif
0125 #ifdef CONFIG_ARCH_USES_PG_UNCACHED
0126 PG_uncached,
0127 #endif
0128 #ifdef CONFIG_MEMORY_FAILURE
0129 PG_hwpoison,
0130 #endif
0131 #if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT)
0132 PG_young,
0133 PG_idle,
0134 #endif
0135 #ifdef CONFIG_64BIT
0136 PG_arch_2,
0137 #endif
0138 #ifdef CONFIG_KASAN_HW_TAGS
0139 PG_skip_kasan_poison,
0140 #endif
0141 __NR_PAGEFLAGS,
0142
0143 PG_readahead = PG_reclaim,
0144
0145
0146
0147
0148
0149
0150
0151
0152 PG_anon_exclusive = PG_mappedtodisk,
0153
0154
0155 PG_checked = PG_owner_priv_1,
0156
0157
0158 PG_swapcache = PG_owner_priv_1,
0159
0160
0161
0162
0163
0164 PG_fscache = PG_private_2,
0165
0166
0167
0168 PG_pinned = PG_owner_priv_1,
0169
0170 PG_savepinned = PG_dirty,
0171
0172 PG_foreign = PG_owner_priv_1,
0173
0174 PG_xen_remapped = PG_owner_priv_1,
0175
0176
0177 PG_slob_free = PG_private,
0178
0179
0180 PG_double_map = PG_workingset,
0181
0182 #ifdef CONFIG_MEMORY_FAILURE
0183
0184
0185
0186
0187
0188 PG_has_hwpoisoned = PG_error,
0189 #endif
0190
0191
0192 PG_isolated = PG_reclaim,
0193
0194
0195 PG_reported = PG_uptodate,
0196
0197 #ifdef CONFIG_MEMORY_HOTPLUG
0198
0199 PG_vmemmap_self_hosted = PG_owner_priv_1,
0200 #endif
0201 };
0202
0203 #define PAGEFLAGS_MASK ((1UL << NR_PAGEFLAGS) - 1)
0204
0205 #ifndef __GENERATING_BOUNDS_H
0206
0207 #ifdef CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
0208 DECLARE_STATIC_KEY_FALSE(hugetlb_optimize_vmemmap_key);
0209
0210
0211
0212
0213
0214 static __always_inline const struct page *page_fixed_fake_head(const struct page *page)
0215 {
0216 if (!static_branch_unlikely(&hugetlb_optimize_vmemmap_key))
0217 return page;
0218
0219
0220
0221
0222
0223
0224
0225 if (IS_ALIGNED((unsigned long)page, PAGE_SIZE) &&
0226 test_bit(PG_head, &page->flags)) {
0227
0228
0229
0230
0231
0232 unsigned long head = READ_ONCE(page[1].compound_head);
0233
0234 if (likely(head & 1))
0235 return (const struct page *)(head - 1);
0236 }
0237 return page;
0238 }
0239 #else
0240 static inline const struct page *page_fixed_fake_head(const struct page *page)
0241 {
0242 return page;
0243 }
0244 #endif
0245
0246 static __always_inline int page_is_fake_head(struct page *page)
0247 {
0248 return page_fixed_fake_head(page) != page;
0249 }
0250
0251 static inline unsigned long _compound_head(const struct page *page)
0252 {
0253 unsigned long head = READ_ONCE(page->compound_head);
0254
0255 if (unlikely(head & 1))
0256 return head - 1;
0257 return (unsigned long)page_fixed_fake_head(page);
0258 }
0259
0260 #define compound_head(page) ((typeof(page))_compound_head(page))
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275 #define page_folio(p) (_Generic((p), \
0276 const struct page *: (const struct folio *)_compound_head(p), \
0277 struct page *: (struct folio *)_compound_head(p)))
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288 #define folio_page(folio, n) nth_page(&(folio)->page, n)
0289
0290 static __always_inline int PageTail(struct page *page)
0291 {
0292 return READ_ONCE(page->compound_head) & 1 || page_is_fake_head(page);
0293 }
0294
0295 static __always_inline int PageCompound(struct page *page)
0296 {
0297 return test_bit(PG_head, &page->flags) ||
0298 READ_ONCE(page->compound_head) & 1;
0299 }
0300
0301 #define PAGE_POISON_PATTERN -1l
0302 static inline int PagePoisoned(const struct page *page)
0303 {
0304 return READ_ONCE(page->flags) == PAGE_POISON_PATTERN;
0305 }
0306
0307 #ifdef CONFIG_DEBUG_VM
0308 void page_init_poison(struct page *page, size_t size);
0309 #else
0310 static inline void page_init_poison(struct page *page, size_t size)
0311 {
0312 }
0313 #endif
0314
0315 static unsigned long *folio_flags(struct folio *folio, unsigned n)
0316 {
0317 struct page *page = &folio->page;
0318
0319 VM_BUG_ON_PGFLAGS(PageTail(page), page);
0320 VM_BUG_ON_PGFLAGS(n > 0 && !test_bit(PG_head, &page->flags), page);
0321 return &page[n].flags;
0322 }
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350 #define PF_POISONED_CHECK(page) ({ \
0351 VM_BUG_ON_PGFLAGS(PagePoisoned(page), page); \
0352 page; })
0353 #define PF_ANY(page, enforce) PF_POISONED_CHECK(page)
0354 #define PF_HEAD(page, enforce) PF_POISONED_CHECK(compound_head(page))
0355 #define PF_ONLY_HEAD(page, enforce) ({ \
0356 VM_BUG_ON_PGFLAGS(PageTail(page), page); \
0357 PF_POISONED_CHECK(page); })
0358 #define PF_NO_TAIL(page, enforce) ({ \
0359 VM_BUG_ON_PGFLAGS(enforce && PageTail(page), page); \
0360 PF_POISONED_CHECK(compound_head(page)); })
0361 #define PF_NO_COMPOUND(page, enforce) ({ \
0362 VM_BUG_ON_PGFLAGS(enforce && PageCompound(page), page); \
0363 PF_POISONED_CHECK(page); })
0364 #define PF_SECOND(page, enforce) ({ \
0365 VM_BUG_ON_PGFLAGS(!PageHead(page), page); \
0366 PF_POISONED_CHECK(&page[1]); })
0367
0368
0369 #define FOLIO_PF_ANY 0
0370 #define FOLIO_PF_HEAD 0
0371 #define FOLIO_PF_ONLY_HEAD 0
0372 #define FOLIO_PF_NO_TAIL 0
0373 #define FOLIO_PF_NO_COMPOUND 0
0374 #define FOLIO_PF_SECOND 1
0375
0376
0377
0378
0379 #define TESTPAGEFLAG(uname, lname, policy) \
0380 static __always_inline bool folio_test_##lname(struct folio *folio) \
0381 { return test_bit(PG_##lname, folio_flags(folio, FOLIO_##policy)); } \
0382 static __always_inline int Page##uname(struct page *page) \
0383 { return test_bit(PG_##lname, &policy(page, 0)->flags); }
0384
0385 #define SETPAGEFLAG(uname, lname, policy) \
0386 static __always_inline \
0387 void folio_set_##lname(struct folio *folio) \
0388 { set_bit(PG_##lname, folio_flags(folio, FOLIO_##policy)); } \
0389 static __always_inline void SetPage##uname(struct page *page) \
0390 { set_bit(PG_##lname, &policy(page, 1)->flags); }
0391
0392 #define CLEARPAGEFLAG(uname, lname, policy) \
0393 static __always_inline \
0394 void folio_clear_##lname(struct folio *folio) \
0395 { clear_bit(PG_##lname, folio_flags(folio, FOLIO_##policy)); } \
0396 static __always_inline void ClearPage##uname(struct page *page) \
0397 { clear_bit(PG_##lname, &policy(page, 1)->flags); }
0398
0399 #define __SETPAGEFLAG(uname, lname, policy) \
0400 static __always_inline \
0401 void __folio_set_##lname(struct folio *folio) \
0402 { __set_bit(PG_##lname, folio_flags(folio, FOLIO_##policy)); } \
0403 static __always_inline void __SetPage##uname(struct page *page) \
0404 { __set_bit(PG_##lname, &policy(page, 1)->flags); }
0405
0406 #define __CLEARPAGEFLAG(uname, lname, policy) \
0407 static __always_inline \
0408 void __folio_clear_##lname(struct folio *folio) \
0409 { __clear_bit(PG_##lname, folio_flags(folio, FOLIO_##policy)); } \
0410 static __always_inline void __ClearPage##uname(struct page *page) \
0411 { __clear_bit(PG_##lname, &policy(page, 1)->flags); }
0412
0413 #define TESTSETFLAG(uname, lname, policy) \
0414 static __always_inline \
0415 bool folio_test_set_##lname(struct folio *folio) \
0416 { return test_and_set_bit(PG_##lname, folio_flags(folio, FOLIO_##policy)); } \
0417 static __always_inline int TestSetPage##uname(struct page *page) \
0418 { return test_and_set_bit(PG_##lname, &policy(page, 1)->flags); }
0419
0420 #define TESTCLEARFLAG(uname, lname, policy) \
0421 static __always_inline \
0422 bool folio_test_clear_##lname(struct folio *folio) \
0423 { return test_and_clear_bit(PG_##lname, folio_flags(folio, FOLIO_##policy)); } \
0424 static __always_inline int TestClearPage##uname(struct page *page) \
0425 { return test_and_clear_bit(PG_##lname, &policy(page, 1)->flags); }
0426
0427 #define PAGEFLAG(uname, lname, policy) \
0428 TESTPAGEFLAG(uname, lname, policy) \
0429 SETPAGEFLAG(uname, lname, policy) \
0430 CLEARPAGEFLAG(uname, lname, policy)
0431
0432 #define __PAGEFLAG(uname, lname, policy) \
0433 TESTPAGEFLAG(uname, lname, policy) \
0434 __SETPAGEFLAG(uname, lname, policy) \
0435 __CLEARPAGEFLAG(uname, lname, policy)
0436
0437 #define TESTSCFLAG(uname, lname, policy) \
0438 TESTSETFLAG(uname, lname, policy) \
0439 TESTCLEARFLAG(uname, lname, policy)
0440
0441 #define TESTPAGEFLAG_FALSE(uname, lname) \
0442 static inline bool folio_test_##lname(const struct folio *folio) { return false; } \
0443 static inline int Page##uname(const struct page *page) { return 0; }
0444
0445 #define SETPAGEFLAG_NOOP(uname, lname) \
0446 static inline void folio_set_##lname(struct folio *folio) { } \
0447 static inline void SetPage##uname(struct page *page) { }
0448
0449 #define CLEARPAGEFLAG_NOOP(uname, lname) \
0450 static inline void folio_clear_##lname(struct folio *folio) { } \
0451 static inline void ClearPage##uname(struct page *page) { }
0452
0453 #define __CLEARPAGEFLAG_NOOP(uname, lname) \
0454 static inline void __folio_clear_##lname(struct folio *folio) { } \
0455 static inline void __ClearPage##uname(struct page *page) { }
0456
0457 #define TESTSETFLAG_FALSE(uname, lname) \
0458 static inline bool folio_test_set_##lname(struct folio *folio) \
0459 { return 0; } \
0460 static inline int TestSetPage##uname(struct page *page) { return 0; }
0461
0462 #define TESTCLEARFLAG_FALSE(uname, lname) \
0463 static inline bool folio_test_clear_##lname(struct folio *folio) \
0464 { return 0; } \
0465 static inline int TestClearPage##uname(struct page *page) { return 0; }
0466
0467 #define PAGEFLAG_FALSE(uname, lname) TESTPAGEFLAG_FALSE(uname, lname) \
0468 SETPAGEFLAG_NOOP(uname, lname) CLEARPAGEFLAG_NOOP(uname, lname)
0469
0470 #define TESTSCFLAG_FALSE(uname, lname) \
0471 TESTSETFLAG_FALSE(uname, lname) TESTCLEARFLAG_FALSE(uname, lname)
0472
0473 __PAGEFLAG(Locked, locked, PF_NO_TAIL)
0474 PAGEFLAG(Waiters, waiters, PF_ONLY_HEAD)
0475 PAGEFLAG(Error, error, PF_NO_TAIL) TESTCLEARFLAG(Error, error, PF_NO_TAIL)
0476 PAGEFLAG(Referenced, referenced, PF_HEAD)
0477 TESTCLEARFLAG(Referenced, referenced, PF_HEAD)
0478 __SETPAGEFLAG(Referenced, referenced, PF_HEAD)
0479 PAGEFLAG(Dirty, dirty, PF_HEAD) TESTSCFLAG(Dirty, dirty, PF_HEAD)
0480 __CLEARPAGEFLAG(Dirty, dirty, PF_HEAD)
0481 PAGEFLAG(LRU, lru, PF_HEAD) __CLEARPAGEFLAG(LRU, lru, PF_HEAD)
0482 TESTCLEARFLAG(LRU, lru, PF_HEAD)
0483 PAGEFLAG(Active, active, PF_HEAD) __CLEARPAGEFLAG(Active, active, PF_HEAD)
0484 TESTCLEARFLAG(Active, active, PF_HEAD)
0485 PAGEFLAG(Workingset, workingset, PF_HEAD)
0486 TESTCLEARFLAG(Workingset, workingset, PF_HEAD)
0487 __PAGEFLAG(Slab, slab, PF_NO_TAIL)
0488 __PAGEFLAG(SlobFree, slob_free, PF_NO_TAIL)
0489 PAGEFLAG(Checked, checked, PF_NO_COMPOUND)
0490
0491
0492 PAGEFLAG(Pinned, pinned, PF_NO_COMPOUND)
0493 TESTSCFLAG(Pinned, pinned, PF_NO_COMPOUND)
0494 PAGEFLAG(SavePinned, savepinned, PF_NO_COMPOUND);
0495 PAGEFLAG(Foreign, foreign, PF_NO_COMPOUND);
0496 PAGEFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND)
0497 TESTCLEARFLAG(XenRemapped, xen_remapped, PF_NO_COMPOUND)
0498
0499 PAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
0500 __CLEARPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
0501 __SETPAGEFLAG(Reserved, reserved, PF_NO_COMPOUND)
0502 PAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL)
0503 __CLEARPAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL)
0504 __SETPAGEFLAG(SwapBacked, swapbacked, PF_NO_TAIL)
0505
0506
0507
0508
0509
0510
0511 PAGEFLAG(Private, private, PF_ANY)
0512 PAGEFLAG(Private2, private_2, PF_ANY) TESTSCFLAG(Private2, private_2, PF_ANY)
0513 PAGEFLAG(OwnerPriv1, owner_priv_1, PF_ANY)
0514 TESTCLEARFLAG(OwnerPriv1, owner_priv_1, PF_ANY)
0515
0516
0517
0518
0519
0520 TESTPAGEFLAG(Writeback, writeback, PF_NO_TAIL)
0521 TESTSCFLAG(Writeback, writeback, PF_NO_TAIL)
0522 PAGEFLAG(MappedToDisk, mappedtodisk, PF_NO_TAIL)
0523
0524
0525 PAGEFLAG(Reclaim, reclaim, PF_NO_TAIL)
0526 TESTCLEARFLAG(Reclaim, reclaim, PF_NO_TAIL)
0527 PAGEFLAG(Readahead, readahead, PF_NO_COMPOUND)
0528 TESTCLEARFLAG(Readahead, readahead, PF_NO_COMPOUND)
0529
0530 #ifdef CONFIG_HIGHMEM
0531
0532
0533
0534
0535 #define PageHighMem(__p) is_highmem_idx(page_zonenum(__p))
0536 #else
0537 PAGEFLAG_FALSE(HighMem, highmem)
0538 #endif
0539
0540 #ifdef CONFIG_SWAP
0541 static __always_inline bool folio_test_swapcache(struct folio *folio)
0542 {
0543 return folio_test_swapbacked(folio) &&
0544 test_bit(PG_swapcache, folio_flags(folio, 0));
0545 }
0546
0547 static __always_inline bool PageSwapCache(struct page *page)
0548 {
0549 return folio_test_swapcache(page_folio(page));
0550 }
0551
0552 SETPAGEFLAG(SwapCache, swapcache, PF_NO_TAIL)
0553 CLEARPAGEFLAG(SwapCache, swapcache, PF_NO_TAIL)
0554 #else
0555 PAGEFLAG_FALSE(SwapCache, swapcache)
0556 #endif
0557
0558 PAGEFLAG(Unevictable, unevictable, PF_HEAD)
0559 __CLEARPAGEFLAG(Unevictable, unevictable, PF_HEAD)
0560 TESTCLEARFLAG(Unevictable, unevictable, PF_HEAD)
0561
0562 #ifdef CONFIG_MMU
0563 PAGEFLAG(Mlocked, mlocked, PF_NO_TAIL)
0564 __CLEARPAGEFLAG(Mlocked, mlocked, PF_NO_TAIL)
0565 TESTSCFLAG(Mlocked, mlocked, PF_NO_TAIL)
0566 #else
0567 PAGEFLAG_FALSE(Mlocked, mlocked) __CLEARPAGEFLAG_NOOP(Mlocked, mlocked)
0568 TESTSCFLAG_FALSE(Mlocked, mlocked)
0569 #endif
0570
0571 #ifdef CONFIG_ARCH_USES_PG_UNCACHED
0572 PAGEFLAG(Uncached, uncached, PF_NO_COMPOUND)
0573 #else
0574 PAGEFLAG_FALSE(Uncached, uncached)
0575 #endif
0576
0577 #ifdef CONFIG_MEMORY_FAILURE
0578 PAGEFLAG(HWPoison, hwpoison, PF_ANY)
0579 TESTSCFLAG(HWPoison, hwpoison, PF_ANY)
0580 #define __PG_HWPOISON (1UL << PG_hwpoison)
0581 #define MAGIC_HWPOISON 0x48575053U
0582 extern void SetPageHWPoisonTakenOff(struct page *page);
0583 extern void ClearPageHWPoisonTakenOff(struct page *page);
0584 extern bool take_page_off_buddy(struct page *page);
0585 extern bool put_page_back_buddy(struct page *page);
0586 #else
0587 PAGEFLAG_FALSE(HWPoison, hwpoison)
0588 #define __PG_HWPOISON 0
0589 #endif
0590
0591 #if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT)
0592 TESTPAGEFLAG(Young, young, PF_ANY)
0593 SETPAGEFLAG(Young, young, PF_ANY)
0594 TESTCLEARFLAG(Young, young, PF_ANY)
0595 PAGEFLAG(Idle, idle, PF_ANY)
0596 #endif
0597
0598 #ifdef CONFIG_KASAN_HW_TAGS
0599 PAGEFLAG(SkipKASanPoison, skip_kasan_poison, PF_HEAD)
0600 #else
0601 PAGEFLAG_FALSE(SkipKASanPoison, skip_kasan_poison)
0602 #endif
0603
0604
0605
0606
0607
0608
0609
0610 __PAGEFLAG(Reported, reported, PF_NO_COMPOUND)
0611
0612 #ifdef CONFIG_MEMORY_HOTPLUG
0613 PAGEFLAG(VmemmapSelfHosted, vmemmap_self_hosted, PF_ANY)
0614 #else
0615 PAGEFLAG_FALSE(VmemmapSelfHosted, vmemmap_self_hosted)
0616 #endif
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631
0632
0633
0634
0635 #define PAGE_MAPPING_ANON 0x1
0636 #define PAGE_MAPPING_MOVABLE 0x2
0637 #define PAGE_MAPPING_KSM (PAGE_MAPPING_ANON | PAGE_MAPPING_MOVABLE)
0638 #define PAGE_MAPPING_FLAGS (PAGE_MAPPING_ANON | PAGE_MAPPING_MOVABLE)
0639
0640
0641
0642
0643
0644 #define PAGE_MAPPING_DAX_COW 0x1
0645
0646 static __always_inline bool folio_mapping_flags(struct folio *folio)
0647 {
0648 return ((unsigned long)folio->mapping & PAGE_MAPPING_FLAGS) != 0;
0649 }
0650
0651 static __always_inline int PageMappingFlags(struct page *page)
0652 {
0653 return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) != 0;
0654 }
0655
0656 static __always_inline bool folio_test_anon(struct folio *folio)
0657 {
0658 return ((unsigned long)folio->mapping & PAGE_MAPPING_ANON) != 0;
0659 }
0660
0661 static __always_inline bool PageAnon(struct page *page)
0662 {
0663 return folio_test_anon(page_folio(page));
0664 }
0665
0666 static __always_inline bool __folio_test_movable(const struct folio *folio)
0667 {
0668 return ((unsigned long)folio->mapping & PAGE_MAPPING_FLAGS) ==
0669 PAGE_MAPPING_MOVABLE;
0670 }
0671
0672 static __always_inline int __PageMovable(struct page *page)
0673 {
0674 return ((unsigned long)page->mapping & PAGE_MAPPING_FLAGS) ==
0675 PAGE_MAPPING_MOVABLE;
0676 }
0677
0678 #ifdef CONFIG_KSM
0679
0680
0681
0682
0683
0684
0685 static __always_inline bool folio_test_ksm(struct folio *folio)
0686 {
0687 return ((unsigned long)folio->mapping & PAGE_MAPPING_FLAGS) ==
0688 PAGE_MAPPING_KSM;
0689 }
0690
0691 static __always_inline bool PageKsm(struct page *page)
0692 {
0693 return folio_test_ksm(page_folio(page));
0694 }
0695 #else
0696 TESTPAGEFLAG_FALSE(Ksm, ksm)
0697 #endif
0698
0699 u64 stable_page_flags(struct page *page);
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711 static inline bool folio_test_uptodate(struct folio *folio)
0712 {
0713 bool ret = test_bit(PG_uptodate, folio_flags(folio, 0));
0714
0715
0716
0717
0718
0719
0720
0721
0722 if (ret)
0723 smp_rmb();
0724
0725 return ret;
0726 }
0727
0728 static inline int PageUptodate(struct page *page)
0729 {
0730 return folio_test_uptodate(page_folio(page));
0731 }
0732
0733 static __always_inline void __folio_mark_uptodate(struct folio *folio)
0734 {
0735 smp_wmb();
0736 __set_bit(PG_uptodate, folio_flags(folio, 0));
0737 }
0738
0739 static __always_inline void folio_mark_uptodate(struct folio *folio)
0740 {
0741
0742
0743
0744
0745
0746 smp_wmb();
0747 set_bit(PG_uptodate, folio_flags(folio, 0));
0748 }
0749
0750 static __always_inline void __SetPageUptodate(struct page *page)
0751 {
0752 __folio_mark_uptodate((struct folio *)page);
0753 }
0754
0755 static __always_inline void SetPageUptodate(struct page *page)
0756 {
0757 folio_mark_uptodate((struct folio *)page);
0758 }
0759
0760 CLEARPAGEFLAG(Uptodate, uptodate, PF_NO_TAIL)
0761
0762 bool __folio_start_writeback(struct folio *folio, bool keep_write);
0763 bool set_page_writeback(struct page *page);
0764
0765 #define folio_start_writeback(folio) \
0766 __folio_start_writeback(folio, false)
0767 #define folio_start_writeback_keepwrite(folio) \
0768 __folio_start_writeback(folio, true)
0769
0770 static inline void set_page_writeback_keepwrite(struct page *page)
0771 {
0772 folio_start_writeback_keepwrite(page_folio(page));
0773 }
0774
0775 static inline bool test_set_page_writeback(struct page *page)
0776 {
0777 return set_page_writeback(page);
0778 }
0779
0780 static __always_inline bool folio_test_head(struct folio *folio)
0781 {
0782 return test_bit(PG_head, folio_flags(folio, FOLIO_PF_ANY));
0783 }
0784
0785 static __always_inline int PageHead(struct page *page)
0786 {
0787 PF_POISONED_CHECK(page);
0788 return test_bit(PG_head, &page->flags) && !page_is_fake_head(page);
0789 }
0790
0791 __SETPAGEFLAG(Head, head, PF_ANY)
0792 __CLEARPAGEFLAG(Head, head, PF_ANY)
0793 CLEARPAGEFLAG(Head, head, PF_ANY)
0794
0795
0796
0797
0798
0799
0800
0801 static inline bool folio_test_large(struct folio *folio)
0802 {
0803 return folio_test_head(folio);
0804 }
0805
0806 static __always_inline void set_compound_head(struct page *page, struct page *head)
0807 {
0808 WRITE_ONCE(page->compound_head, (unsigned long)head + 1);
0809 }
0810
0811 static __always_inline void clear_compound_head(struct page *page)
0812 {
0813 WRITE_ONCE(page->compound_head, 0);
0814 }
0815
0816 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
0817 static inline void ClearPageCompound(struct page *page)
0818 {
0819 BUG_ON(!PageHead(page));
0820 ClearPageHead(page);
0821 }
0822 #endif
0823
0824 #define PG_head_mask ((1UL << PG_head))
0825
0826 #ifdef CONFIG_HUGETLB_PAGE
0827 int PageHuge(struct page *page);
0828 int PageHeadHuge(struct page *page);
0829 static inline bool folio_test_hugetlb(struct folio *folio)
0830 {
0831 return PageHeadHuge(&folio->page);
0832 }
0833 #else
0834 TESTPAGEFLAG_FALSE(Huge, hugetlb)
0835 TESTPAGEFLAG_FALSE(HeadHuge, headhuge)
0836 #endif
0837
0838 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
0839
0840
0841
0842
0843
0844
0845
0846
0847 static inline int PageTransHuge(struct page *page)
0848 {
0849 VM_BUG_ON_PAGE(PageTail(page), page);
0850 return PageHead(page);
0851 }
0852
0853 static inline bool folio_test_transhuge(struct folio *folio)
0854 {
0855 return folio_test_head(folio);
0856 }
0857
0858
0859
0860
0861
0862
0863 static inline int PageTransCompound(struct page *page)
0864 {
0865 return PageCompound(page);
0866 }
0867
0868
0869
0870
0871
0872
0873 static inline int PageTransTail(struct page *page)
0874 {
0875 return PageTail(page);
0876 }
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891 PAGEFLAG(DoubleMap, double_map, PF_SECOND)
0892 TESTSCFLAG(DoubleMap, double_map, PF_SECOND)
0893 #else
0894 TESTPAGEFLAG_FALSE(TransHuge, transhuge)
0895 TESTPAGEFLAG_FALSE(TransCompound, transcompound)
0896 TESTPAGEFLAG_FALSE(TransCompoundMap, transcompoundmap)
0897 TESTPAGEFLAG_FALSE(TransTail, transtail)
0898 PAGEFLAG_FALSE(DoubleMap, double_map)
0899 TESTSCFLAG_FALSE(DoubleMap, double_map)
0900 #endif
0901
0902 #if defined(CONFIG_MEMORY_FAILURE) && defined(CONFIG_TRANSPARENT_HUGEPAGE)
0903
0904
0905
0906
0907
0908
0909 PAGEFLAG(HasHWPoisoned, has_hwpoisoned, PF_SECOND)
0910 TESTSCFLAG(HasHWPoisoned, has_hwpoisoned, PF_SECOND)
0911 #else
0912 PAGEFLAG_FALSE(HasHWPoisoned, has_hwpoisoned)
0913 TESTSCFLAG_FALSE(HasHWPoisoned, has_hwpoisoned)
0914 #endif
0915
0916
0917
0918
0919
0920
0921 static inline bool is_page_hwpoison(struct page *page)
0922 {
0923 if (PageHWPoison(page))
0924 return true;
0925 return PageHuge(page) && PageHWPoison(compound_head(page));
0926 }
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937 #define PAGE_TYPE_BASE 0xf0000000
0938
0939 #define PAGE_MAPCOUNT_RESERVE -128
0940 #define PG_buddy 0x00000080
0941 #define PG_offline 0x00000100
0942 #define PG_table 0x00000200
0943 #define PG_guard 0x00000400
0944
0945 #define PageType(page, flag) \
0946 ((page->page_type & (PAGE_TYPE_BASE | flag)) == PAGE_TYPE_BASE)
0947
0948 static inline int page_has_type(struct page *page)
0949 {
0950 return (int)page->page_type < PAGE_MAPCOUNT_RESERVE;
0951 }
0952
0953 #define PAGE_TYPE_OPS(uname, lname) \
0954 static __always_inline int Page##uname(struct page *page) \
0955 { \
0956 return PageType(page, PG_##lname); \
0957 } \
0958 static __always_inline void __SetPage##uname(struct page *page) \
0959 { \
0960 VM_BUG_ON_PAGE(!PageType(page, 0), page); \
0961 page->page_type &= ~PG_##lname; \
0962 } \
0963 static __always_inline void __ClearPage##uname(struct page *page) \
0964 { \
0965 VM_BUG_ON_PAGE(!Page##uname(page), page); \
0966 page->page_type |= PG_##lname; \
0967 }
0968
0969
0970
0971
0972
0973 PAGE_TYPE_OPS(Buddy, buddy)
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997 PAGE_TYPE_OPS(Offline, offline)
0998
0999 extern void page_offline_freeze(void);
1000 extern void page_offline_thaw(void);
1001 extern void page_offline_begin(void);
1002 extern void page_offline_end(void);
1003
1004
1005
1006
1007 PAGE_TYPE_OPS(Table, table)
1008
1009
1010
1011
1012 PAGE_TYPE_OPS(Guard, guard)
1013
1014 extern bool is_free_buddy_page(struct page *page);
1015
1016 PAGEFLAG(Isolated, isolated, PF_ANY);
1017
1018 static __always_inline int PageAnonExclusive(struct page *page)
1019 {
1020 VM_BUG_ON_PGFLAGS(!PageAnon(page), page);
1021 VM_BUG_ON_PGFLAGS(PageHuge(page) && !PageHead(page), page);
1022 return test_bit(PG_anon_exclusive, &PF_ANY(page, 1)->flags);
1023 }
1024
1025 static __always_inline void SetPageAnonExclusive(struct page *page)
1026 {
1027 VM_BUG_ON_PGFLAGS(!PageAnon(page) || PageKsm(page), page);
1028 VM_BUG_ON_PGFLAGS(PageHuge(page) && !PageHead(page), page);
1029 set_bit(PG_anon_exclusive, &PF_ANY(page, 1)->flags);
1030 }
1031
1032 static __always_inline void ClearPageAnonExclusive(struct page *page)
1033 {
1034 VM_BUG_ON_PGFLAGS(!PageAnon(page) || PageKsm(page), page);
1035 VM_BUG_ON_PGFLAGS(PageHuge(page) && !PageHead(page), page);
1036 clear_bit(PG_anon_exclusive, &PF_ANY(page, 1)->flags);
1037 }
1038
1039 static __always_inline void __ClearPageAnonExclusive(struct page *page)
1040 {
1041 VM_BUG_ON_PGFLAGS(!PageAnon(page), page);
1042 VM_BUG_ON_PGFLAGS(PageHuge(page) && !PageHead(page), page);
1043 __clear_bit(PG_anon_exclusive, &PF_ANY(page, 1)->flags);
1044 }
1045
1046 #ifdef CONFIG_MMU
1047 #define __PG_MLOCKED (1UL << PG_mlocked)
1048 #else
1049 #define __PG_MLOCKED 0
1050 #endif
1051
1052
1053
1054
1055
1056 #define PAGE_FLAGS_CHECK_AT_FREE \
1057 (1UL << PG_lru | 1UL << PG_locked | \
1058 1UL << PG_private | 1UL << PG_private_2 | \
1059 1UL << PG_writeback | 1UL << PG_reserved | \
1060 1UL << PG_slab | 1UL << PG_active | \
1061 1UL << PG_unevictable | __PG_MLOCKED)
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071 #define PAGE_FLAGS_CHECK_AT_PREP \
1072 (PAGEFLAGS_MASK & ~__PG_HWPOISON)
1073
1074 #define PAGE_FLAGS_PRIVATE \
1075 (1UL << PG_private | 1UL << PG_private_2)
1076
1077
1078
1079
1080
1081
1082
1083 static inline int page_has_private(struct page *page)
1084 {
1085 return !!(page->flags & PAGE_FLAGS_PRIVATE);
1086 }
1087
1088 static inline bool folio_has_private(struct folio *folio)
1089 {
1090 return page_has_private(&folio->page);
1091 }
1092
1093 #undef PF_ANY
1094 #undef PF_HEAD
1095 #undef PF_ONLY_HEAD
1096 #undef PF_NO_TAIL
1097 #undef PF_NO_COMPOUND
1098 #undef PF_SECOND
1099 #endif
1100
1101 #endif