Folio
include/mem/folio.h View source View on GitHubStructs
Section titled “Structs” struct folio (8 fields) source
§
atomic(enum folio_flags) flags §
uint8_t order 2^order pages
§
refcount_t refcount §
mapcount_t mapcount §
void *mapping tagged, anon_vma or file_vma_range
folio_flags
Section titled “folio_flags” enum folio_flags : uint32_t (7 variants) source
folio_flags: 32-bit bitflags
┌────────────────────────────────────┐Bits │ 31..8 7..4 3..0 │Use │ (reserved) ..LU DMAO │ └────────────────────────────────────┘O - On an LRU / reclaim list A - Anon: mapping is an anon_vma (clear => file_vma_range) M - Mapped at least once (mapcount has been nonzero) D - Dirty: needs writeback U - Uptodate: contents valid L - Locked: I/O in flight
Reserved bits fill in as the pager arrives (writeback, referenced, reclaim, mlocked, swapbacked, …). Width is uint32_t for headroom.
§
FOLIO_FLAGS_NONE = 0 §
FOLIO_FLAG_ON_LRU = (1u << 0) §
FOLIO_FLAG_ANON = (1u << 1) §
FOLIO_FLAG_MAPPED = (1u << 2) §
FOLIO_FLAG_DIRTY = (1u << 3) §
FOLIO_FLAG_UPTODATE = (1u << 4) §
FOLIO_FLAG_LOCKED = (1u << 5) folio_tag
Section titled “folio_tag”Functions
Section titled “Functions”page_get_folio_index
Section titled “page_get_folio_index”page_is_folio_head
Section titled “page_is_folio_head”folio_alloc_folio_struct
Section titled “folio_alloc_folio_struct”folio_free_folio_struct
Section titled “folio_free_folio_struct”folio_alloc_full
Section titled “folio_alloc_full”struct folio * folio_alloc_full(
uint8_t order,
struct alloc_params params
) source folio_free
Section titled “folio_free”folio_bind_pages
Section titled “folio_bind_pages”page <-> folio backptrs, give every struct page folio at alloc, clear them at free
folio_unbind_pages
Section titled “folio_unbind_pages”folio_zero
Section titled “folio_zero”folio_copy
Section titled “folio_copy”LRU
folio_add_lru
Section titled “folio_add_lru”folio_del_lru
Section titled “folio_del_lru”page_set_folio
Section titled “page_set_folio”Some struct page functions here for folio
page_get_folio
Section titled “page_get_folio”page_clear_folio
Section titled “page_clear_folio”folio_mapped
Section titled “folio_mapped”folio_nr_pages
Section titled “folio_nr_pages”folio_set_tag
Section titled “folio_set_tag”folio_get_tag
Section titled “folio_get_tag”folio_test_flag
Section titled “folio_test_flag”bool folio_test_flag(const struct folio *f, enum folio_flags m) source folio_set_flag
Section titled “folio_set_flag”void folio_set_flag(struct folio *f, enum folio_flags m) source folio_clear_flag
Section titled “folio_clear_flag”void folio_clear_flag(struct folio *f, enum folio_flags m) source folio_test_set_flag
Section titled “folio_test_set_flag”bool folio_test_set_flag(struct folio *f, enum folio_flags m) source folio_getref
Section titled “folio_getref”folio_putref
Section titled “folio_putref”folio_get_page
Section titled “folio_get_page”folio_get_pfn
Section titled “folio_get_pfn”folio_from_page
Section titled “folio_from_page”reverse of folio_page(): a mapped frame -> its folio, via the page backpointer. The fault/rmap paths take a PTE’s phys and land back here.
folio_from_paddr
Section titled “folio_from_paddr”folio_get_paddr
Section titled “folio_get_paddr”folio_get_vaddr
Section titled “folio_get_vaddr”folio_get_paddr_for
Section titled “folio_get_paddr_for”folio_get_vaddr_for
Section titled “folio_get_vaddr_for”folio_mark_dirty
Section titled “folio_mark_dirty”folio_mark_uptodate
Section titled “folio_mark_uptodate”folio_set_anon
Section titled “folio_set_anon”folio_is_anon
Section titled “folio_is_anon”folio_is_file_vma_range
Section titled “folio_is_file_vma_range”folio_get_anon_vma
Section titled “folio_get_anon_vma”folio_get_file_vma_range
Section titled “folio_get_file_vma_range”struct file_vma_range * folio_get_file_vma_range(const struct folio *f) source folio_trylock
Section titled “folio_trylock”folio_lock
Section titled “folio_lock”folio_unlock
Section titled “folio_unlock”folio_mapcount_inc
Section titled “folio_mapcount_inc”folio_mapcount_dec
Section titled “folio_mapcount_dec”Macros
Section titled “Macros”FOLIO_TAG_BITS
Section titled “FOLIO_TAG_BITS”#define FOLIO_TAG_BITS 0x7 source folio_for_each_page_struct
Section titled “folio_for_each_page_struct”#define folio_for_each_page_struct(p_, f_) source Expansion
#define folio_for_each_page_struct(p_, f_) \
for (size_t __folio_page_idx = 0; \
__folio_page_idx < folio_nr_pages(f_) && \
(((p_) = folio_get_page((f_), __folio_page_idx)), true); \
__folio_page_idx++) folio_for_each_page_paddr
Section titled “folio_for_each_page_paddr”#define folio_for_each_page_paddr(p_, f_) source Expansion
#define folio_for_each_page_paddr(p_, f_) \
for (size_t __folio_paddr_idx = 0; \
__folio_paddr_idx < folio_nr_pages(f_) && \
(((p_) = folio_get_paddr_for((f_), __folio_paddr_idx)), true); \
__folio_paddr_idx++) folio_for_each_page_vaddr
Section titled “folio_for_each_page_vaddr”#define folio_for_each_page_vaddr(p_, f_) source Expansion
#define folio_for_each_page_vaddr(p_, f_) \
for (size_t __folio_vaddr_idx = 0; \
__folio_vaddr_idx < folio_nr_pages(f_) && \
(((p_) = folio_get_vaddr_for((f_), __folio_vaddr_idx)), true); \
__folio_vaddr_idx++) folio_alloc
Section titled “folio_alloc”#define folio_alloc(order, ...) source Expansion
#define folio_alloc(order, ...) \
folio_alloc_full((order), alloc_params_with_defaults( \
ALLOC_FLAGS_DEFAULT, ALLOC_BEHAVIOR_DEFAULT, \
##__VA_ARGS__))