On 2019-12-13 at 00:55 Kirill A. Shutemov wrote: >On Thu, Dec 12, 2019 at 11:21:18PM +0800, Li Xinhai wrote: >> When vm_ops->page_mkwrite is defined, and called from wp_page_shared and >> do_shared_fault, the set_page_dirty must already called by page_mkwrite. > >Must? Do all ->page_mkwrite implementation do this? My understanding is that set_page_dirty need be called before PTE is set to allow writing. If not in this sequence, other thread will see a writable PTE and dirty the page before current thread set_page_dirty. In ->page_mkwrite, FS can decide if set_page_dirty should be called or not. I checked a few FS, ext4/xfs/btrsfs/ceph and generic filemap_page_mkwrite, they called it. If FS provide ->page_mkwrite and decide don't call set_page_dirty, why fault_dirty_shared_page call this function unconditionally? or, I missed something? In case no ->page_mkwrite provided, call set_page_dirty looks reasonable for default action. >> @@ -3645,7 +3646,7 @@ static vm_fault_t do_shared_fault(struct vm_fault *vmf) >> * Check if the backing address space wants to know that the page is >> * about to become writable >> */ >> - if (vma->vm_ops->page_mkwrite) { >> + if (vma->vm_ops && vma->vm_ops->page_mkwrite) { > >vma->vm_ops is always non-NULL here. yes, thanks point out. > >-- > Kirill A. Shutemov