Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754425AbYGYIFY (ORCPT ); Fri, 25 Jul 2008 04:05:24 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752251AbYGYIE5 (ORCPT ); Fri, 25 Jul 2008 04:04:57 -0400 Received: from fms-01.valinux.co.jp ([210.128.90.1]:43756 "EHLO mail.valinux.co.jp" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751885AbYGYIEz (ORCPT ); Fri, 25 Jul 2008 04:04:55 -0400 To: nickpiggin@yahoo.com.au Cc: a.p.zijlstra@chello.nl, kamezawa.hiroyu@jp.fujitsu.com, linux-kernel@vger.kernel.org, akpm@linux-foundation.org, linux-fsdevel@vger.kernel.org Subject: Re: [PATCH] fix task dirty balancing In-Reply-To: Your message of "Fri, 25 Jul 2008 01:08:50 +1000" <200807250108.50824.nickpiggin@yahoo.com.au> References: <200807250108.50824.nickpiggin@yahoo.com.au> X-Mailer: Cue version 0.8 (080625-0732/takashi) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Message-Id: <20080725080454.C76EB5A53@siro.lan> Date: Fri, 25 Jul 2008 17:04:54 +0900 (JST) From: yamamoto@valinux.co.jp (YAMAMOTO Takashi) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4475 Lines: 157 hi, > Hi, > > On Thursday 24 July 2008 10:27, YAMAMOTO Takashi wrote: > > > ok, i removed the cleanup part because i don't want to participate in > > this kind of discussion. > > is the following patch ok for you? > > Thanks, it looks good. I don't think we need to export task_dirty_inc, > as buffer.c cannot be built as a module. But otherwise, > > Acked-by: Nick Piggin > > It would be nice to get this into 2.6.27. thanks for your review. i removed the unnecessary export. YAMAMOTO Takashi Signed-off-by: YAMAMOTO Takashi --- diff --git a/fs/buffer.c b/fs/buffer.c index 4ffb5bb..3a89d58 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -708,27 +708,29 @@ EXPORT_SYMBOL(mark_buffer_dirty_inode); static int __set_page_dirty(struct page *page, struct address_space *mapping, int warn) { - if (unlikely(!mapping)) - return !TestSetPageDirty(page); if (TestSetPageDirty(page)) return 0; - spin_lock_irq(&mapping->tree_lock); - if (page->mapping) { /* Race with truncate? */ - WARN_ON_ONCE(warn && !PageUptodate(page)); + if (likely(mapping)) { + spin_lock_irq(&mapping->tree_lock); + if (page->mapping) { /* Race with truncate? */ + WARN_ON_ONCE(warn && !PageUptodate(page)); - if (mapping_cap_account_dirty(mapping)) { - __inc_zone_page_state(page, NR_FILE_DIRTY); - __inc_bdi_stat(mapping->backing_dev_info, - BDI_RECLAIMABLE); - task_io_account_write(PAGE_CACHE_SIZE); + if (mapping_cap_account_dirty(mapping)) { + __inc_zone_page_state(page, NR_FILE_DIRTY); + __inc_bdi_stat(mapping->backing_dev_info, + BDI_RECLAIMABLE); + task_io_account_write(PAGE_CACHE_SIZE); + } + radix_tree_tag_set(&mapping->page_tree, + page_index(page), PAGECACHE_TAG_DIRTY); } - radix_tree_tag_set(&mapping->page_tree, - page_index(page), PAGECACHE_TAG_DIRTY); + spin_unlock_irq(&mapping->tree_lock); + __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); } - spin_unlock_irq(&mapping->tree_lock); - __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); + + task_dirty_inc(current); return 1; } diff --git a/include/linux/mm.h b/include/linux/mm.h index a4eeb3c..33fd91a 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -1167,6 +1167,7 @@ extern int filemap_fault(struct vm_area_struct *, struct vm_fault *); /* mm/page-writeback.c */ int write_one_page(struct page *page, int wait); +void task_dirty_inc(struct task_struct *tsk); /* readahead.c */ #define VM_MAX_READAHEAD 128 /* kbytes */ diff --git a/mm/page-writeback.c b/mm/page-writeback.c index 29b1d1e..e710481 100644 --- a/mm/page-writeback.c +++ b/mm/page-writeback.c @@ -176,7 +176,7 @@ void bdi_writeout_inc(struct backing_dev_info *bdi) } EXPORT_SYMBOL_GPL(bdi_writeout_inc); -static inline void task_dirty_inc(struct task_struct *tsk) +void task_dirty_inc(struct task_struct *tsk) { prop_inc_single(&vm_dirties, &tsk->dirties); } @@ -1074,8 +1074,13 @@ int __set_page_dirty_no_writeback(struct page *page) */ int __set_page_dirty_nobuffers(struct page *page) { - if (!TestSetPageDirty(page)) { - struct address_space *mapping = page_mapping(page); + struct address_space *mapping; + + if (TestSetPageDirty(page)) + return 0; + + mapping = page_mapping(page); + if (likely(mapping)) { struct address_space *mapping2; if (!mapping) @@ -1100,9 +1105,11 @@ int __set_page_dirty_nobuffers(struct page *page) /* !PageAnon && !swapper_space */ __mark_inode_dirty(mapping->host, I_DIRTY_PAGES); } - return 1; } - return 0; + + task_dirty_inc(current); + + return 1; } EXPORT_SYMBOL(__set_page_dirty_nobuffers); @@ -1122,7 +1129,7 @@ EXPORT_SYMBOL(redirty_page_for_writepage); * If the mapping doesn't provide a set_page_dirty a_op, then * just fall through and assume that it wants buffer_heads. */ -static int __set_page_dirty(struct page *page) +int set_page_dirty(struct page *page) { struct address_space *mapping = page_mapping(page); @@ -1140,14 +1147,6 @@ static int __set_page_dirty(struct page *page) } return 0; } - -int set_page_dirty(struct page *page) -{ - int ret = __set_page_dirty(page); - if (ret) - task_dirty_inc(current); - return ret; -} EXPORT_SYMBOL(set_page_dirty); /* -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/