From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752084AbbCKCO7 (ORCPT ); Tue, 10 Mar 2015 22:14:59 -0400 Received: from cnbjrel01.sonyericsson.com ([219.141.167.165]:3304 "EHLO cnbjrel01.sonyericsson.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751480AbbCKCOz convert rfc822-to-8bit (ORCPT ); Tue, 10 Mar 2015 22:14:55 -0400 From: "Wang, Yalin" To: "'Minchan Kim'" , Andrew Morton CC: "linux-kernel@vger.kernel.org" , "linux-mm@kvack.org" , Michal Hocko , Johannes Weiner , Mel Gorman , Rik van Riel , Shaohua Li Date: Wed, 11 Mar 2015 10:14:51 +0800 Subject: RE: [PATCH 3/4] mm: move lazy free pages to inactive list Thread-Topic: [PATCH 3/4] mm: move lazy free pages to inactive list Thread-Index: AdBbmZ4/wzIpNB9rSCKUH/WvFhqq4AABuCeA Message-ID: <35FD53F367049845BC99AC72306C23D10458D6173C04@CNBJMBX05.corpusers.net> References: <1426036838-18154-1-git-send-email-minchan@kernel.org> <1426036838-18154-3-git-send-email-minchan@kernel.org> In-Reply-To: <1426036838-18154-3-git-send-email-minchan@kernel.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > -----Original Message----- > From: Minchan Kim [mailto:minchan@kernel.org] > Sent: Wednesday, March 11, 2015 9:21 AM > To: Andrew Morton > Cc: linux-kernel@vger.kernel.org; linux-mm@kvack.org; Michal Hocko; > Johannes Weiner; Mel Gorman; Rik van Riel; Shaohua Li; Wang, Yalin; Minchan > Kim > Subject: [PATCH 3/4] mm: move lazy free pages to inactive list > > MADV_FREE is hint that it's okay to discard pages if there is > memory pressure and we uses reclaimers(ie, kswapd and direct reclaim) > to free them so there is no worth to remain them in active anonymous LRU > so this patch moves them to inactive LRU list's head. > > This means that MADV_FREE-ed pages which were living on the inactive list > are reclaimed first because they are more likely to be cold rather than > recently active pages. > > A arguable issue for the approach would be whether we should put it to > head or tail in inactive list. I selected *head* because kernel cannot > make sure it's really cold or warm for every MADV_FREE usecase but > at least we know it's not *hot* so landing of inactive head would be > comprimise for various usecases. > > This is fixing a suboptimal behavior of MADV_FREE when pages living on > the active list will sit there for a long time even under memory > pressure while the inactive list is reclaimed heavily. This basically > breaks the whole purpose of using MADV_FREE to help the system to free > memory which is might not be used. > > Acked-by: Michal Hocko > Signed-off-by: Minchan Kim > --- > include/linux/swap.h | 1 + > mm/madvise.c | 2 ++ > mm/swap.c | 35 +++++++++++++++++++++++++++++++++++ > 3 files changed, 38 insertions(+) > > diff --git a/include/linux/swap.h b/include/linux/swap.h > index cee108c..0428e4c 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -308,6 +308,7 @@ extern void lru_add_drain_cpu(int cpu); > extern void lru_add_drain_all(void); > extern void rotate_reclaimable_page(struct page *page); > extern void deactivate_file_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/madvise.c b/mm/madvise.c > index ebe692e..22e8f0c 100644 > --- a/mm/madvise.c > +++ b/mm/madvise.c > @@ -340,6 +340,8 @@ static int madvise_free_pte_range(pmd_t *pmd, unsigned > long addr, > ptent = pte_mkold(ptent); > ptent = pte_mkclean(ptent); > set_pte_at(mm, addr, pte, ptent); > + if (PageActive(page)) > + deactivate_page(page); > tlb_remove_tlb_entry(tlb, pte, addr); > } I think this place should be changed like this: + if (!page_referenced(page, false, NULL, NULL, NULL) && PageActive(page)) + deactivate_page(page); Because we don't know if other processes are reference this page, If it is true, don't need deactivate this page. Thanks