vma_flags_is_cow_mapping(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’… vma_flags_is_cow_mapping β€” like, does this VMA even CoW tho?? πŸ„

okay so bestie, welcome to the Kernel API Manual ✨ this one's a tiny little helper called vma_flags_is_cow_mapping and honestly? it's giving "one job, does it well" energy πŸ‘‘


🌸 SYNOPSIS 🌸

bool vma_flags_is_cow_mapping (const vma_flags_t *flags );

πŸŽ€ ARGUMENTS πŸŽ€

  • flags β€” the VMA flags you're asking about. the vibe check subject, basically 🫢

✨ DESCRIPTION ✨

so real talk: mappings that could get CoW'd (aka get hit with Copy-On-Write faults) are literally called CoW mappings. that's the whole terminology, no cap πŸ’…

all mappings backed by anonymous folios are CoW mappings β€” that's every anonymous mapping plus most MAP_PRIVATE-file backed ranges. periodt ✨

everything else (and yes, that includes all the MAP_SHARED mappings) is non-CoW. not one CoW. tragic for them honestly 😭

the criteria are literally just:

!VMA_SHARED_BIT, VMA_MAYWRITE_BIT

and why check VMA_MAYWRITE_BIT instead of VMA_WRITE_BIT?? such a good question bestie, the manpage explains: it's to account for both future mprotect calls (which can flip a read-only mapping into a writable one) and GUP with FOLL_FORCE (hi ptrace πŸ‘‹) which can totally CoW a read-only mapping. love that for us πŸ”₯

  • No anonymous mapping can ever clear VMA_MAYWRITE_BIT. like, ever. it's just not happening 🚫
  • Writes to anonymous mappings don't immediately cause CoW faults β€” but they may later, after the process forks, or if a read is followed by a write. sneaky 😏
  • Writes to MAP_PRIVATE file-backed mappings do result in CoW faults, and may do so again after fork. iconic, consistent πŸ„
  • MAP_SHARED mappings of a file opened read-only get transformed into VMA_MAYSHARE_BIT, !VMA_SHARED_BIT, !VMA_MAYWRITE_BIT mappings β€” so they stay non-CoW. the glow-up didn't change their CoW status, sorry babe πŸ’€
  • Drivers may clear VMA_MAYWRITE_BIT, but they gotta do it at mmap time and they can't mark themselves anonymous. and once they've cleared this flag, it is not valid for them to leave the VMA_WRITE_BIT flag set πŸ™ˆ like please don't
and as a consequence of all that: the anonymous reverse mapping only tracks CoW mappings. that's just how it is bestie 🫢

πŸ‘‘ RETURN πŸ‘‘

true if the flags indicate a CoW mapping, otherwise false. cut and dry, we love a binary πŸ’–


πŸ¦‹ SEE ALSO πŸ¦‹

Kernel file ./include/linux/mm.h plus the whole squad:

folio_page_idx(9), vma_flag_t(9), fault_flag_allow_retry_first(9), vma_kernel_pagesize(9), folio_order(9), folio_reset_order(9), folio_mapcount(9), folio_mapped(9), thp_order(9), thp_size(9), folio_get(9), folio_put(9), folio_put_refs(9), folios_put(9), vma_is_cow_mapping(9), vma_desc_is_cow_mapping(9), folio_pfn(9), folio_mk_pte(9), folio_mk_pmd(9), folio_mk_pud(9), folio_maybe_dma_pinned(9), is_zero_page(9), is_zero_folio(9), folio_nr_pages(9), folio_next(9), folio_shift(9), folio_size(9), folio_maybe_mapped_shared(9), folio_expected_ref_count(9), zap_vma(9), ptdesc_address(9), ptdesc_set_kernel(9), ptdesc_clear_kernel(9), ptdesc_test_kernel(9), pagetable_alloc(9), pagetable_free(9), vma_lookup(9), vma_start_pgoff(9), vma_end_pgoff(9), vma_last_pgoff(9), vma_start_anon_pgoff(9), vma_end_anon_pgoff(9), vma_last_anon_pgoff(9), mmap_action_remap(9), mmap_action_remap_full(9), mmap_action_ioremap(9), mmap_action_ioremap_full(9), mmap_action_simple_ioremap(9), mmap_action_map_kernel_pages(9), mmap_action_map_kernel_pages_full(9), range_is_subset(9), range_in_vma(9), range_in_vma_desc(9), clear_pages(9)


🌈 that's the whole page bestie, mwah πŸ’‹ it lives in ./include/linux, dated October 2026 β€” go forth and correctly identify your CoW mappings, iykyk πŸ§šβ€β™€οΈπŸ’œ

πŸ“¦ where this page comes from