Messages in this thread | | | Date | Wed, 20 Jul 2022 21:33:35 +0200 | From | David Hildenbrand <> | Subject | Re: [RFC PATCH 01/14] userfaultfd: set dirty and young on writeprotect |
| |
On 20.07.22 21:15, Peter Xu wrote: > On Wed, Jul 20, 2022 at 05:10:37PM +0200, David Hildenbrand wrote: >> For pagecache pages it may as well be *plain wrong* to bypass the write >> fault handler and simply mark pages dirty+map them writable. > > Could you elaborate?
Write-fault handling for some filesystems (that even require this "slow path") is a bit special.
For example, do_shared_fault() might have to call page_mkwrite().
AFAIK file systems use that for lazy allocation of disk blocks. If you simply go ahead and map a !dirty pagecache page writable and mark it dirty, it will not trigger page_mkwrite() and you might end up corrupting data.
That's why we the old change_pte_range() code never touched anything if the pte wasn't already dirty. Because as long as it's not writable, the FS might have to be informed about the write-unprotect.
And we end up in the case here for VM_SHARED with vma_wants_writenotify(). Where we, for example, check
/* The backer wishes to know when pages are first written to? * if (vm_ops && (vm_ops->page_mkwrite || vm_ops->pfn_mkwrite))$ return 1;
Long story short, we should be really careful with write-fault handler bypasses, especially when deciding to set dirty bits. For pagecache pages, we have to be especially careful.
For exclusive anon pages it's mostly ok, because wp_page_reuse() doesn't really contain that much magic. The only thing to consider for ordinary mprotect() is that there is -- IMHO -- absolutely no guarantee that someone will write to a specific write-unprotected page soon. For uffd-wp-unprotect it might be easier to guess, especially, if we un-protect only a single page.
-- Thanks,
David / dhildenb
| |