Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753258Ab0LFOxz (ORCPT ); Mon, 6 Dec 2010 09:53:55 -0500 Received: from gir.skynet.ie ([193.1.99.77]:49903 "EHLO gir.skynet.ie" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751204Ab0LFOxy (ORCPT ); Mon, 6 Dec 2010 09:53:54 -0500 Date: Mon, 6 Dec 2010 14:53:36 +0000 From: Mel Gorman To: Minchan Kim Cc: Andrew Morton , Rik van Riel , KOSAKI Motohiro , linux-mm , LKML , Peter Zijlstra , Wu Fengguang , Johannes Weiner , Nick Piggin Subject: Re: [PATCH v4 2/7] deactivate invalidated pages Message-ID: <20101206145336.GF21406@csn.ul.ie> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.17+20080114 (2008-01-14) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4171 Lines: 107 On Mon, Dec 06, 2010 at 02:29:10AM +0900, Minchan Kim wrote: > Recently, there are reported problem about thrashing. > (http://marc.info/?l=rsync&m=128885034930933&w=2) > It happens by backup workloads(ex, nightly rsync). > That's because the workload makes just use-once pages > and touches pages twice. It promotes the page into > active list so that it results in working set page eviction. > > Some app developer want to support POSIX_FADV_NOREUSE. > But other OSes don't support it, either. > (http://marc.info/?l=linux-mm&m=128928979512086&w=2) > > By other approach, app developers use POSIX_FADV_DONTNEED. > But it has a problem. If kernel meets page is writing > during invalidate_mapping_pages, it can't work. > It is very hard for application programmer to use it. > Because they always have to sync data before calling > fadivse(..POSIX_FADV_DONTNEED) to make sure the pages could > be discardable. At last, they can't use deferred write of kernel > so that they could see performance loss. > (http://insights.oetiker.ch/linux/fadvise.html) > > In fact, invalidation is very big hint to reclaimer. > It means we don't use the page any more. So let's move > the writing page into inactive list's head. > > Why I need the page to head, Dirty/Writeback page would be flushed > sooner or later. It can prevent writeout of pageout which is less > effective than flusher's writeout. > > Originally, I reused lru_demote of Peter with some change so added > his Signed-off-by. > > Reported-by: Ben Gamari > Signed-off-by: Minchan Kim > Signed-off-by: Peter Zijlstra > Acked-by: Rik van Riel > Reviewed-by: KOSAKI Motohiro > Cc: Wu Fengguang > Cc: Johannes Weiner > Cc: Nick Piggin > Cc: Mel Gorman > > Andrew. Before applying this series, please drop below two patches. > mm-deactivate-invalidated-pages.patch > mm-deactivate-invalidated-pages-fix.patch > > Changelog since v3: > - Change function comments - suggested by Johannes > - Change function name - suggested by Johannes > - add only dirty/writeback pages to deactive pagevec > > Changelog since v2: > - mapped page leaves alone - suggested by Mel > - pass part related PG_reclaim in next patch. > > Changelog since v1: > - modify description > - correct typo > - add some comment > > Signed-off-by: Minchan Kim > --- > include/linux/swap.h | 1 + > mm/swap.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ > mm/truncate.c | 17 ++++++++-- > 3 files changed, 92 insertions(+), 4 deletions(-) > > diff --git a/include/linux/swap.h b/include/linux/swap.h > index eba53e7..605ab62 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -213,6 +213,7 @@ extern void mark_page_accessed(struct page *); > extern void lru_add_drain(void); > extern int lru_add_drain_all(void); > extern void rotate_reclaimable_page(struct page *page); > +extern void deactivate_page(struct page *page); > extern void swap_setup(void); > > extern void add_page_to_unevictable_list(struct page *page); > diff --git a/mm/swap.c b/mm/swap.c > index d5822b0..1f36f6f 100644 > --- a/mm/swap.c > +++ b/mm/swap.c > @@ -39,6 +39,8 @@ int page_cluster; > > static DEFINE_PER_CPU(struct pagevec[NR_LRU_LISTS], lru_add_pvecs); > static DEFINE_PER_CPU(struct pagevec, lru_rotate_pvecs); > +static DEFINE_PER_CPU(struct pagevec, lru_deactivate_pvecs); > + > > /* > * This path almost never happens for VM activity - pages are normally Unnecessary whitespace change there but otherwise; Acked-by: Mel Gorman -- Mel Gorman Part-time Phd Student Linux Technology Center University of Limerick IBM Dublin Software Lab -- 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/