On Mon, 2013-04-08 at 20:34 +0800, Fengguang Wu wrote: > Hi Ben, > > On Sun, Apr 07, 2013 at 08:01:38PM +0100, Ben Hutchings wrote: > > This is missing from 3.0.y and 3.2.y; should we have it? > > It would help 3.2.y, however not as much for 3.0.y. > > The background is, when the IO-less dirty throttling patches > go upstream, there were concerns that the change set is too complex. > So it end up being merged in two stages: v3.2 includes the core bits > and v3.3 includes the improvement/optimization bits. > > This patch falls into the latter category. It looked like a bug fix to me. The reason I ask is because commit 4adaa611020f 'Btrfs: fix race between mmap writes and compression' adds a call to account_page_redirty() which doesn't exist in 3.2.y. I've added these both to the patch queue now. Ben. > As for pre-3.2 kernels, they run the old threshold based > balance_dirty_pages() and are not sensible to dirty accounting errors. > > Thanks, > Fengguang > > > --- > > From: Wu Fengguang <fengguang.wu@xxxxxxxxx> > > Date: Mon, 8 Aug 2011 15:22:00 -0600 > > Subject: writeback: fix dirtied pages accounting on redirty > > > > commit 2f800fbd777b792de54187088df19a7df0251254 upstream. > > > > De-account the accumulative dirty counters on page redirty. > > > > Page redirties (very common in ext4) will introduce mismatch between > > counters (a) and (b) > > > > a) NR_DIRTIED, BDI_DIRTIED, tsk->nr_dirtied > > b) NR_WRITTEN, BDI_WRITTEN > > > > This will introduce systematic errors in balanced_rate and result in > > dirty page position errors (ie. the dirty pages are no longer balanced > > around the global/bdi setpoints). > > > > Acked-by: Jan Kara <jack@xxxxxxx> > > Acked-by: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx> > > Signed-off-by: Wu Fengguang <fengguang.wu@xxxxxxxxx> > > --- > > include/linux/writeback.h | 2 ++ > > mm/page-writeback.c | 19 +++++++++++++++++++ > > 2 files changed, 21 insertions(+) > > > > diff --git a/include/linux/writeback.h b/include/linux/writeback.h > > index 05eaf5e..b30419c 100644 > > --- a/include/linux/writeback.h > > +++ b/include/linux/writeback.h > > @@ -197,6 +197,8 @@ void writeback_set_ratelimit(void); > > void tag_pages_for_writeback(struct address_space *mapping, > > pgoff_t start, pgoff_t end); > > > > +void account_page_redirty(struct page *page); > > + > > /* pdflush.c */ > > extern int nr_pdflush_threads; /* Global so it can be exported to sysctl > > read-only. */ > > diff --git a/mm/page-writeback.c b/mm/page-writeback.c > > index 5d1ef5d..96b3e7a 100644 > > --- a/mm/page-writeback.c > > +++ b/mm/page-writeback.c > > @@ -1825,6 +1825,24 @@ int __set_page_dirty_nobuffers(struct page *page) > > EXPORT_SYMBOL(__set_page_dirty_nobuffers); > > > > /* > > + * Call this whenever redirtying a page, to de-account the dirty counters > > + * (NR_DIRTIED, BDI_DIRTIED, tsk->nr_dirtied), so that they match the written > > + * counters (NR_WRITTEN, BDI_WRITTEN) in long term. The mismatches will lead to > > + * systematic errors in balanced_dirty_ratelimit and the dirty pages position > > + * control. > > + */ > > +void account_page_redirty(struct page *page) > > +{ > > + struct address_space *mapping = page->mapping; > > + if (mapping && mapping_cap_account_dirty(mapping)) { > > + current->nr_dirtied--; > > + dec_zone_page_state(page, NR_DIRTIED); > > + dec_bdi_stat(mapping->backing_dev_info, BDI_DIRTIED); > > + } > > +} > > +EXPORT_SYMBOL(account_page_redirty); > > + > > +/* > > * When a writepage implementation decides that it doesn't want to write this > > * page for some reason, it should redirty the locked page via > > * redirty_page_for_writepage() and it should then unlock the page and return 0 > > @@ -1832,6 +1850,7 @@ EXPORT_SYMBOL(__set_page_dirty_nobuffers); > > int redirty_page_for_writepage(struct writeback_control *wbc, struct page *page) > > { > > wbc->pages_skipped++; > > + account_page_redirty(page); > > return __set_page_dirty_nobuffers(page); > > } > > EXPORT_SYMBOL(redirty_page_for_writepage); > > > > > > -- > > Ben Hutchings > > I'm not a reverse psychological virus. Please don't copy me into your sig. > > > -- Ben Hutchings Klipstein's 4th Law of Prototyping and Production: A fail-safe circuit will destroy others.
Attachment:
signature.asc
Description: This is a digitally signed message part