[PATCH] mm/memory.c: avoid repeated set_page_dirty in fault_dirty_shared_page

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux