filemap_fault
file = vmf->vma->vm_file
mapping = file->f_mapping
index = vmf->pgoff
folio = filemap_get_folio(mapping, index) // in pagecache?
// if in pagecache
do_async_mmap_readahead()
// if not in pagecache
fpin = do_sync_mmap_readahead() // sync readahead
fpin = maybe_unlock_mmap_for_io(vmf, )
page_cache_sync_ra(&ractl, ra->ra_pages)
folio = __filemap_get_folio(mapping, index, FGP_CREAT|FGP_FOR_MMAP, vmf->gfp_mask)
folio = filemap_get_entry(mapping, index) // search in mapping
// if not in pagecache, allocate one
folio = filemap_alloc_folio(alloc_gfp, order) // alloc and set refcount to 1
filemap_add_folio(mapping, folio, index, gfp) // add into pagecache
__folio_set_locked(folio)
__filemap_add_folio(mapping, folio, index, ...)
folio_ref_add(folio, nr_pages) // refcount = 1 + nr_pages
vmf->page = folio_file_page(folio, index)
finish_fault
folio_ref_add(folio, nr_pages - 1) // refcount = 2 * nr_pages
set_pte_range()
folio_add_file_rmap_ptes(folio, nr_pages) // mapcount = nr_pages