On Wed, Aug 23, 2023 at 03:38:13PM +0800, Yin Fengwei wrote: > On 8/22/23 04:20, Matthew Wilcox (Oracle) wrote: > > - get_page(vmf->page); > > - vmf->page->mapping = vmf->vma->vm_file->f_mapping; > > - vmf->page->index = vmf->pgoff; > > + folio_get(folio); > > + rcu_read_unlock(); > > + folio_lock(folio); > > + if (!folio->mapping) > > + folio->mapping = vmf->vma->vm_file->f_mapping; > > > > - ret = 0; > > + return VM_FAULT_LOCKED; > In __do_fault(): > > if (unlikely(!(ret & VM_FAULT_LOCKED))) > lock_page(vmf->page); > else > VM_BUG_ON_PAGE(!PageLocked(vmf->page), vmf->page); > > As we lock folio, not sure whether !PageLocked(vmf->page) can be true > here. My understanding is yes if vmf->pgoff belongs to tail pages. Did > I can miss something here? There's only one lock bit per folio; there's no lock bit for individual pages. When we check PageLocked() on a tail page, it redirects to the head page. __PAGEFLAG(Locked, locked, PF_NO_TAIL) #define PF_NO_TAIL(page, enforce) ({ \ VM_BUG_ON_PGFLAGS(enforce && PageTail(page), page); \ PF_POISONED_CHECK(compound_head(page)); }) #define TESTPAGEFLAG(uname, lname, policy) \ static __always_inline int Page##uname(struct page *page) \ { return test_bit(PG_##lname, &policy(page, 0)->flags); } and that expands out to: static __always_inline int PageLocked(struct page *page) { return test_bit(PG_##locked, &compound_head(page)->flags); }