From f34bf6c3074ffc5f33e82517e9d64db5958275d5 Mon Sep 17 00:00:00 2001 From: Peter Zijlstra Date: Mon, 8 Oct 2007 18:54:37 +0200 Subject: [PATCH] --- yaml --- r: 65316 b: refs/heads/master c: a200ee182a016752464a12cb2e8762e48254bb09 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/writeback.h | 2 +- trunk/mm/memory.c | 9 +++++++-- trunk/mm/page-writeback.c | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 85e10ed8a4ed..b028a041c5ef 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3eb215de26e6e94bf5fed9cb77230c383b30e53b +refs/heads/master: a200ee182a016752464a12cb2e8762e48254bb09 diff --git a/trunk/include/linux/writeback.h b/trunk/include/linux/writeback.h index 4ef4d22e5e43..b4af6bcb7b7a 100644 --- a/trunk/include/linux/writeback.h +++ b/trunk/include/linux/writeback.h @@ -127,7 +127,7 @@ int sync_page_range(struct inode *inode, struct address_space *mapping, loff_t pos, loff_t count); int sync_page_range_nolock(struct inode *inode, struct address_space *mapping, loff_t pos, loff_t count); -void set_page_dirty_balance(struct page *page); +void set_page_dirty_balance(struct page *page, int page_mkwrite); void writeback_set_ratelimit(void); /* pdflush.c */ diff --git a/trunk/mm/memory.c b/trunk/mm/memory.c index c0e7741a98de..f82b359b2745 100644 --- a/trunk/mm/memory.c +++ b/trunk/mm/memory.c @@ -1639,6 +1639,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, struct page *old_page, *new_page; pte_t entry; int reuse = 0, ret = 0; + int page_mkwrite = 0; struct page *dirty_page = NULL; old_page = vm_normal_page(vma, address, orig_pte); @@ -1687,6 +1688,8 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, page_cache_release(old_page); if (!pte_same(*page_table, orig_pte)) goto unlock; + + page_mkwrite = 1; } dirty_page = old_page; get_page(dirty_page); @@ -1774,7 +1777,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma, * do_no_page is protected similarly. */ wait_on_page_locked(dirty_page); - set_page_dirty_balance(dirty_page); + set_page_dirty_balance(dirty_page, page_mkwrite); put_page(dirty_page); } return ret; @@ -2322,6 +2325,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, struct page *dirty_page = NULL; struct vm_fault vmf; int ret; + int page_mkwrite = 0; vmf.virtual_address = (void __user *)(address & PAGE_MASK); vmf.pgoff = pgoff; @@ -2398,6 +2402,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, anon = 1; /* no anon but release vmf.page */ goto out; } + page_mkwrite = 1; } } @@ -2453,7 +2458,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, if (anon) page_cache_release(vmf.page); else if (dirty_page) { - set_page_dirty_balance(dirty_page); + set_page_dirty_balance(dirty_page, page_mkwrite); put_page(dirty_page); } diff --git a/trunk/mm/page-writeback.c b/trunk/mm/page-writeback.c index 63512a9ed57e..44720363374c 100644 --- a/trunk/mm/page-writeback.c +++ b/trunk/mm/page-writeback.c @@ -274,9 +274,9 @@ static void balance_dirty_pages(struct address_space *mapping) pdflush_operation(background_writeout, 0); } -void set_page_dirty_balance(struct page *page) +void set_page_dirty_balance(struct page *page, int page_mkwrite) { - if (set_page_dirty(page)) { + if (set_page_dirty(page) || page_mkwrite) { struct address_space *mapping = page_mapping(page); if (mapping)