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. Then in fault_dirty_shared_page, avoid this repeated call. Signed-off-by: Li Xinhai <lixinhai.lxh@xxxxxxxxx> Cc: Jan Kara <jack@xxxxxxx> --- mm/memory.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mm/memory.c b/mm/memory.c index 606da18..34a83d7 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2300,10 +2300,11 @@ static vm_fault_t fault_dirty_shared_page(struct vm_fault *vmf) struct vm_area_struct *vma = vmf->vma; struct address_space *mapping; struct page *page = vmf->page; - bool dirtied; + bool dirtied = false; bool page_mkwrite = vma->vm_ops && vma->vm_ops->page_mkwrite; - dirtied = set_page_dirty(page); + if(!page_mkwrite) + dirtied = set_page_dirty(page); VM_BUG_ON_PAGE(PageAnon(page), page); /* * Take a local copy of the address_space - page.mapping may be zeroed @@ -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) { unlock_page(vmf->page); tmp = do_page_mkwrite(vmf); if (unlikely(!tmp || -- 1.8.3.1