From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752692AbdBJSZa (ORCPT ); Fri, 10 Feb 2017 13:25:30 -0500 Received: from mx0b-00082601.pphosted.com ([67.231.153.30]:40399 "EHLO mx0b-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751724AbdBJSZ2 (ORCPT ); Fri, 10 Feb 2017 13:25:28 -0500 Date: Fri, 10 Feb 2017 09:43:07 -0800 From: Shaohua Li To: Minchan Kim CC: , , , , , , , , , Subject: Re: [PATCH V2 3/7] mm: reclaim MADV_FREE pages Message-ID: <20170210174307.GC86050@shli-mbp.local> References: <9426fa2cf9fe320a15bfb20744c451eb6af1710a.1486163864.git.shli@fb.com> <20170210065839.GD25078@bbox> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20170210065839.GD25078@bbox> User-Agent: Mutt/1.6.1 (2016-04-27) X-Originating-IP: [2620:10d:c090:200::d:7cca] X-ClientProxiedBy: BN6PR05CA0022.namprd05.prod.outlook.com (10.174.92.163) To MWHPR15MB1645.namprd15.prod.outlook.com (10.175.135.143) X-MS-Office365-Filtering-Correlation-Id: 37c8ebcd-6530-4d69-d9d4-08d451dc4cff X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:MWHPR15MB1645; X-Microsoft-Exchange-Diagnostics: 1;MWHPR15MB1645;3:jFQd3lcVcRjqJzaYuzzeBfFs01zyydBnNyZYqAf2yT9YOR4oNRr0DolDzcHx0Y1TXn1bbAdRBfQRVmJa2MxGqYoVZsGSXGoxnBX3b+B4VKqNxyOBc/XKOgSXnyuBTdPFADSVDjpZN3z2hfZn3QAVy+nSxaZmIn7jzn++xQvQvW9pBTcXQlHodEi+Lcjyoua13xDlyxPmvCJwaZhPrD/yyBCIwJ3XXF4Ws4oAhigEBEJyOvSc8PIUBERsASqua5TIdIXHFbp2G5P3FvJrs30KwA==;25:yHuVnvi7Vb5sMu3od6TQaHGmHGdQU9SJuiFLlmmGLzgCbGXymmS9vG/ZEdeODyTMZJRjktlUY0r0nF2T0MAw2vtE58S3vjIqGU6AGVzDpjRUG4DRA16kciepiSyJ/kl4iAJZ7EGUS8DrDu9KEBRPsdpATlxxiD8n88PoYe+cBXtrbxUIyR/F21bfNpyXIMhep6Ip44zcBnQX0WyP2FSBBSlCSeebeDCR6J090rIqpOAP8+67XH2NWJZ03LbrDMc3otBvBXX16zlqR6zZEw6IEXXnhiMXoC8TgAeFjVVCpAbeeO4xsn3CRUUy2DH3B4UG7bN2sbW1HlDwQLFPSlkfvcdtQQ7H0xFaG8Vl3kQwUke7Z0XVZvu2/11jhPu0445AymG/Ybv48AbAHJeb/S+ASrQvq1yiLBJ3Xpqh2v3dVx4xoZ2f/NETIiduAWU5omWEZDKCUGLKESpwQCm1gXU4hA== X-Microsoft-Exchange-Diagnostics: 1;MWHPR15MB1645;31:WFGIIExxfJQPXZvEH45j7jsfDtQkaOUmgjIMtpf9wsAE3kRJvTE6HNk3v0BELr59iXGOhdEhk46gGXKhMygqpwcW4luyBGwtuatx45btc5y1XWXvLPFnhBlQLHjKroawV4pzhr+QbCuxqHaLMBvlbE7Bb9O7wyWMek5T9YR5ZKODcJY1T29+VTH60GxWGmO8NFYzzSIAwRtqWHg38tcZyejz4RyAlzJfiL65H0/5pQJduhlkdypKJdALQ/O9Hc71d4O3NWgZBwn+67QVVyAb4A==;20:+RwlliDIi594j4Fo1WhV1+QU+V1HIP+bbwC3M6I/DjXpYnKR5emCKH6bzI5xYDKerBGUvXsTDARp8QiPvO01jW/hQ3oGg2b2wR8Wr4hhWKsl44qt839NrOuU6ijeS7+WzmWO8zJqREBYRm1st+UXI9Ta3KgTdn8d/L2JBQ2Q0vnjUrIVxV0Qn7G1P24yHfd6DPa/BM6uFzb8zl8LrAE10PajRk9vHzkYO2NQO1ZDFK90I1ymqM12+9LOrJVsbjf5ijBT3wvcMweyVBcfhuYoAAKCa3kEFl0+7tZ0US18WvMiWu3mVoKWpLd4MLmYgh+3MF2yssbs4uY+MW8DTMdx/Fn04OOaCQ+j/hd3x+mznSteDMJMYZZzkZqay3YGXhwZY5Y+ROJFt2g83tMgG2fskd0uFiXGW0vtpzLqM0O7RGlSd4kpLOMVUqHkX1UpogqT7dMvLfl4frcOicV2/aV+9VW2iK8mcwZp8anat7eCVtr0OmQZAWnNbWG7Ri/vhlwf X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(67672495146484)(211936372134217); X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123562025)(20161123560025)(20161123564025)(20161123555025)(20161123558025)(6072148);SRVR:MWHPR15MB1645;BCL:0;PCL:0;RULEID:;SRVR:MWHPR15MB1645; X-Microsoft-Exchange-Diagnostics: 1;MWHPR15MB1645;4:t0K69F+FCd06lL5lXnRvXN7kfC2aXYqe31p2BHj9ETw2B/sVN73WuQyjO/CjZ05UL0NqEwajbbuFNRAs3yJeH8kpBXr7OCaSsiDzspTqkI+vc/5J1LloEd7geIf5bTnShaI3LvhnCVs1ghbIn5uM9EdRtW55qk/9HJjRWyxPPJwtubRVcrCQBsBsL8si7ZwSa6IpqXqmu5zlUte9rkneqmUFHAyzRX9kGM6ADQMYzGG1PKRn7YSQpnc/PZRGnFj31kwIRWrzhniwzpuTQWkiT6I8uukh2hA9iqO5E6IPfjC7tPcLch0+53mzRH0V3N2AnnyctQO7sJHAhhI0dSLT0KDx6Aif9bzHHY7mDYKhdt+hdN1IWPwCYx0GTWpxc816eU3PS9KiUt5sgUqqOJMtbU6WF6+jgeBvaf2LhOwwQxpIov+0hI7/Y3X/aemiPYsUgLGSU7rSc02Tc/24js/yMudfuXxhbCMcpMWfmvBpzfVF4yzIzEDbS/ls3eab9E47LuxPtF2Dfb41d9d3U4vZohjB1tfnwrPnEp2wzFIM7fTPL67dCMU94eZtpfmuBaogfj50lyA6spvoeYsr0LpsIJhEwoyLu3RCDzQwrXGU/z4iId2TnEbhQVgoS21+1KLPrYM+OyTf1OZocY6DXwK8+w6q+bSxL1WfIrkOjcLJ0mJavyLRvMKCETYt37KB1Zrm X-Forefront-PRVS: 0214EB3F68 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(7916002)(39450400003)(39410400002)(39830400002)(199003)(24454002)(189002)(81156014)(97756001)(2950100002)(23726003)(8676002)(81166006)(83506001)(106356001)(105586002)(86362001)(4001350100001)(46406003)(9686003)(54906002)(4326007)(39060400001)(76176999)(54356999)(50466002)(1076002)(101416001)(53936002)(92566002)(6506006)(50986999)(2906002)(229853002)(42186005)(25786008)(55016002)(97736004)(189998001)(68736007)(47776003)(6666003)(6116002)(6916009)(305945005)(7736002)(33656002)(7416002)(38730400002)(6246003)(110136004)(98436002)(5660300001)(18370500001)(21314002);DIR:OUT;SFP:1102;SCL:1;SRVR:MWHPR15MB1645;H:shli-mbp.local;FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;MWHPR15MB1645;23:xjCFJtIcRN34+9/GIpwzRrkAbQBGUi52DcWXZQUkq?= =?us-ascii?Q?dP1t79CAu9Cc0t+YjDbAHB+7QOXWUN9xRm/cDj4OahqKBTu+J572bj1ljp9/?= =?us-ascii?Q?9iFPGtBz3hmS+pHMuITJI7JMEQTqI7kLuM5fTHnp61mYTlSa9rQf3hvcHXol?= =?us-ascii?Q?1dzGGfKmL6mQEkV9gg4+mR60kp9sAeut/wxegYvhuixvfeXbndeSLtHTAiON?= =?us-ascii?Q?1/w8tpedgB60bMFnliFfZPQbxMZpX6m/0aj32mRBLYvidusGOXHbfZk0msva?= =?us-ascii?Q?EgCDAPiFSJPhl4bt5tT68SKZZsQNxfRsU/D2GbEFlTPVIm45f/mJMhM3nbTV?= =?us-ascii?Q?ZeZFMDetx2O1YD3uHe1slin2EqXPYK2zWCv5wPORI6Zf/x8przfR0dKIXwiw?= =?us-ascii?Q?FVDkw3wVP8Lt9ph7BXNPQKgGd/0MKGwgh/l1P2LpqjYfjx06SzceJB8ePbL4?= =?us-ascii?Q?3mPGQZAYjrH+uDQNni5FWU1As/mk5v1+OH88YbSKXBAt6Lev7s75VjtttIO0?= =?us-ascii?Q?Vziu/sZRRTb7wYC8hjpoTu53uDWeLRtFlMS4zLAbyA18eYtrFe0jr8fFVWdK?= =?us-ascii?Q?P0n8klyRSNAGTrsr43VBDkXfqkT56wwSD6+p/grXBumQJ0WWZdFFbIGCkwyx?= =?us-ascii?Q?uVz0JYMxc0F+b+/AgaEh9AgOb8TQbAwu6AtTmSAc1EV6+SPnQ9DYggRJm+oR?= =?us-ascii?Q?zaAD/LfjDtLNYyacy8ol5hHYZVbF9XChc52cE+X1sngAFv7NIoQIFrvu20bE?= =?us-ascii?Q?g2HBHA2lrRr2A77bWLiH2Zr/orbAWqgGcUobHZjX9lyPWfUhD2v79wOhufqm?= =?us-ascii?Q?yxjgbYBMzKftuyafiNKUTWRDnyPBvzuc2rSbuKTueyPPIQniA6bwvT76usxL?= =?us-ascii?Q?WLgZ08XWcobZxoZ6ufAlt2SG2Aa/GUNGHEip4nmXJFytVnTGyNAO0jYYvgAP?= =?us-ascii?Q?r3yrXKD2TI9XifV88Y+m54/lNbAV/nmL9vYfnyfz2TN3xiKX4YCy031oWs4O?= =?us-ascii?Q?iIe7nQ9pc3BmmeF0Qt5UcoT6U8kvhTkjx7xPSxV1PdGNVRpZplz9It1tApem?= =?us-ascii?Q?WHKl77E5JYf+Q7ogTFdhtxyuwoTapUJZq6zElEOAetENQq8m175r284v5Al9?= =?us-ascii?Q?SM8bMTOXV8TgWbsKFnC9GivIDsfazyZi5u1Ywn+Y+c+6XoqskkuPLcH4OWMm?= =?us-ascii?Q?TxAr4W2nvgN6kSxjWQ9skUtyeo+UfsgeiSKbvMNRvtrVKzG5LQ5m6pjU1xTm?= =?us-ascii?Q?Z61UYX8CNQB2VsD8Q3+2H1byeRFM1qqP2MtBB0/k2AzLo2zSACSHRYsvoI7K?= =?us-ascii?Q?W8z3tgOOpC+JR1m1dqczgKQ1o0bPGlRja27CVhbXXJfDfF4zLjKQSxvLb/xM?= =?us-ascii?Q?uli60uYFOmWpoFJUMeUsXWvi6Y=3D?= X-Microsoft-Exchange-Diagnostics: 1;MWHPR15MB1645;6:+XlVScJtZTsai4LfCAzkDLwLYm5XLWtTn7NgxRCFoqQQrxr/QHUmXaQ73GWqeOr7eQbt+TqOCqrIXlYfHc5J8LgtzJvneNo5sZ138vQbW7v4xjCBy/7NM2JVu0mzPKbcQUiZ96axWHnxoPN4V1Ino8aHlo/LDftWWEdmnsKT50QL1jx9R3T597eNF+xVnhygDCAuP7HDnjKQO3UXTZim9juXoV+Bj0OGfuxN0RbVhEdKQdbvKaXCfuDmnZPBJe6XWUqtaPXgRHQ1q6WynIrFRtF7V7Af7IPmG3h52oEp/KZenhWLvh6bIl4bBaQNSaZwQxrrWha1uv0HhtD+GFHB5rFQYMopcbRcxp0ppOjGXf2qTyA9C/SvWZR5n8Lve8eBqhO1OLgVkelbn9g992lkPQ==;5:KUc/I8+VwfuU/XRHdDzc0dSI0LRdDAafd8DR3zICmPsU6dP5Gb6QnUFgCjmjoH1JXahIatgpDV2jYCHynNT1tOL56gOLv0aDwavpaF32QDeqzIGGbRB7krBoAXf8FITCihvDNb+ay5EEM+Z6memI6w==;24:e23qUS0qeVFwcIeUI8hwQapww+43y+sWuJ3sLK1S60S2Dbpy9f5kBZQdQzrunVq/Y6NK/YaqBSyS9zncTAurw6FS2MuppuX5/vPYkU/y//g= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;MWHPR15MB1645;7:QQ3qwyXRWYwXksOzF64Y+uEFNVSyXoDu17tByk6OvQchVmOxUgGjd8DAXgvaU9Vr/Xo5dG0tgn/geWIQELw706jxEI4P6Zay2UoTJgJwuRZOZ6k/wpitcaO2BxroaRF3SU2TJ3SJLOu9ss+1kug8wZyOIsh9waD7uaC+J9OFa1O+9DZ/p2ZU5sHDTMPKAff384gBPVf+vK/NOSjm5FlegrkAsNvTdUMvpts3SciHh6JeFLcga5hMIXfLg+vA+cyapAor3+C1yLx+jrPWRq4nQ+MuxhZrvGKeFzL2p9Zi/9E4t7fMYxsvtqoT/lFMjDjBiPfzmc8HJUdiyGlCN9FhD1cZ8GiGBLSkTDDlmSxgU066ktMyThjC6zz1kwZEgQ25iwIgkgTGPkEKgjbvix8zUfkCOwOOmYuV14KSR/qr7ruFgKqbuSrIyI0IbKA06UApCkgfdglczc3Zy632lq4UeSb2uTsgXupD3GosMD33pSpDGfxWGCS3Q4D+c1zRZYHhtWMgCccR5NPhwo+HEGb3fQ==;20:lJr3SSTNdLJhLWXEZr1oGZwHvYaFntHJPxp8f1VHdjIHtoTl8WB1B6fd87/oCb4B5zk29ICobB2MOi8cW7oyK0Qmd4hQszC09NpZTNB7dqQJCEDeMfZNvX7A4t05oWqiUaU07IEUMWUOZUTOXNaFU3MOTfcd6jz4xDaULhSUdNE= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Feb 2017 17:43:17.0494 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR15MB1645 X-OriginatorOrg: fb.com X-Proofpoint-Spam-Reason: safe X-FB-Internal: Safe X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-02-10_07:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Feb 10, 2017 at 03:58:39PM +0900, Minchan Kim wrote: > On Fri, Feb 03, 2017 at 03:33:19PM -0800, Shaohua Li wrote: > > When memory pressure is high, we free MADV_FREE pages. If the pages are > > not dirty in pte, the pages could be freed immediately. Otherwise we > > can't reclaim them. We put the pages back to anonumous LRU list (by > > setting SwapBacked flag) and the pages will be reclaimed in normal > > swapout way. > > > > We use normal page reclaim policy. Since MADV_FREE pages are put into > > inactive file list, such pages and inactive file pages are reclaimed > > according to their age. This is expected, because we don't want to > > reclaim too many MADV_FREE pages before used once pages. > > > > Cc: Michal Hocko > > Cc: Minchan Kim > > Cc: Hugh Dickins > > Cc: Johannes Weiner > > Cc: Rik van Riel > > Cc: Mel Gorman > > Cc: Andrew Morton > > Signed-off-by: Shaohua Li > > --- > > mm/rmap.c | 4 ++++ > > mm/vmscan.c | 43 +++++++++++++++++++++++++++++++------------ > > 2 files changed, 35 insertions(+), 12 deletions(-) > > > > diff --git a/mm/rmap.c b/mm/rmap.c > > index c8d6204..5f05926 100644 > > --- a/mm/rmap.c > > +++ b/mm/rmap.c > > @@ -1554,6 +1554,10 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, > > dec_mm_counter(mm, MM_ANONPAGES); > > rp->lazyfreed++; > > goto discard; > > + } else if (flags & TTU_LZFREE) { > > + set_pte_at(mm, address, pte, pteval); > > + ret = SWAP_FAIL; > > + goto out_unmap; > > trivial: > > How about this? > > if (flags && TTU_LZFREE) { > if (PageDirty(page)) { > set_pte_at(XXX); > ret = SWAP_FAIL; > goto out_unmap; > } else { > dec_mm_counter(mm, MM_ANONPAGES); > rp->lazyfreed++; > goto discard; > } > } ok > > } > > > > if (swap_duplicate(entry) < 0) { > > diff --git a/mm/vmscan.c b/mm/vmscan.c > > index 947ab6f..b304a84 100644 > > --- a/mm/vmscan.c > > +++ b/mm/vmscan.c > > @@ -864,7 +864,7 @@ static enum page_references page_check_references(struct page *page, > > return PAGEREF_RECLAIM; > > > > if (referenced_ptes) { > > - if (PageSwapBacked(page)) > > + if (PageSwapBacked(page) || PageAnon(page)) > > If anyone accesses MADV_FREEed range with load op, not store, > why shouldn't we discard that pages? Don't have strong opinion about this, userspace probably shouldn't do this. I'm ok to delete it if you insist. > > return PAGEREF_ACTIVATE; > > /* > > * All mapped pages start out with page table > > @@ -903,7 +903,7 @@ static enum page_references page_check_references(struct page *page, > > > > /* Check if a page is dirty or under writeback */ > > static void page_check_dirty_writeback(struct page *page, > > - bool *dirty, bool *writeback) > > + bool *dirty, bool *writeback, bool lazyfree) > > { > > struct address_space *mapping; > > > > @@ -911,7 +911,7 @@ static void page_check_dirty_writeback(struct page *page, > > * Anonymous pages are not handled by flushers and must be written > > * from reclaim context. Do not stall reclaim based on them > > */ > > - if (!page_is_file_cache(page)) { > > + if (!page_is_file_cache(page) || lazyfree) { > > tivial: > > We can check it with PageLazyFree in here rather than passing lazyfree > argument. It's consistent like page_is_file_cache in here. ok > > *dirty = false; > > *writeback = false; > > return; > > @@ -971,7 +971,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > int may_enter_fs; > > enum page_references references = PAGEREF_RECLAIM_CLEAN; > > bool dirty, writeback; > > - bool lazyfree = false; > > + bool lazyfree; > > int ret = SWAP_SUCCESS; > > > > cond_resched(); > > @@ -986,6 +986,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > > > sc->nr_scanned++; > > > > + lazyfree = page_is_lazyfree(page); > > + > > if (unlikely(!page_evictable(page))) > > goto cull_mlocked; > > > > @@ -993,7 +995,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > goto keep_locked; > > > > /* Double the slab pressure for mapped and swapcache pages */ > > - if (page_mapped(page) || PageSwapCache(page)) > > + if ((page_mapped(page) || PageSwapCache(page)) && !lazyfree) > > sc->nr_scanned++; > > In this phase, we cannot know whether lazyfree marked page is discarable > or not. If it is freeable and mapped, this logic makes sense. However, > if the page is dirty? I think this doesn't matter. If the page is dirty, it will go to reclaim in next round and swap out. At that time, we will add nr_scanned there. > > > > may_enter_fs = (sc->gfp_mask & __GFP_FS) || > > @@ -1005,7 +1007,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > * will stall and start writing pages if the tail of the LRU > > * is all dirty unqueued pages. > > */ > > - page_check_dirty_writeback(page, &dirty, &writeback); > > + page_check_dirty_writeback(page, &dirty, &writeback, lazyfree); > > if (dirty || writeback) > > nr_dirty++; > > > > @@ -1107,6 +1109,14 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > ; /* try to reclaim the page below */ > > } > > > > + /* lazyfree page could be freed directly */ > > + if (lazyfree) { > > + if (unlikely(PageTransHuge(page)) && > > + split_huge_page_to_list(page, page_list)) > > + goto keep_locked; > > + goto unmap_page; > > + } > > + > > Maybe, we can remove this hunk. Instead add lazyfree check in here. > > if (PageAnon(page) && !PageSwapCache(page) && !lazyfree) { > if (!(sc->gfp_mask & __GFP_IO)) ok Thanks, Shaohua From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qk0-f197.google.com (mail-qk0-f197.google.com [209.85.220.197]) by kanga.kvack.org (Postfix) with ESMTP id B62876B0038 for ; Fri, 10 Feb 2017 12:43:31 -0500 (EST) Received: by mail-qk0-f197.google.com with SMTP id u25so34851186qki.3 for ; Fri, 10 Feb 2017 09:43:31 -0800 (PST) Received: from mx0b-00082601.pphosted.com (mx0b-00082601.pphosted.com. [67.231.153.30]) by mx.google.com with ESMTPS id v3si1768754qtc.39.2017.02.10.09.43.30 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Feb 2017 09:43:31 -0800 (PST) Date: Fri, 10 Feb 2017 09:43:07 -0800 From: Shaohua Li Subject: Re: [PATCH V2 3/7] mm: reclaim MADV_FREE pages Message-ID: <20170210174307.GC86050@shli-mbp.local> References: <9426fa2cf9fe320a15bfb20744c451eb6af1710a.1486163864.git.shli@fb.com> <20170210065839.GD25078@bbox> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline In-Reply-To: <20170210065839.GD25078@bbox> Sender: owner-linux-mm@kvack.org List-ID: To: Minchan Kim Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org, Kernel-team@fb.com, danielmicay@gmail.com, mhocko@suse.com, hughd@google.com, hannes@cmpxchg.org, riel@redhat.com, mgorman@techsingularity.net, akpm@linux-foundation.org On Fri, Feb 10, 2017 at 03:58:39PM +0900, Minchan Kim wrote: > On Fri, Feb 03, 2017 at 03:33:19PM -0800, Shaohua Li wrote: > > When memory pressure is high, we free MADV_FREE pages. If the pages are > > not dirty in pte, the pages could be freed immediately. Otherwise we > > can't reclaim them. We put the pages back to anonumous LRU list (by > > setting SwapBacked flag) and the pages will be reclaimed in normal > > swapout way. > > > > We use normal page reclaim policy. Since MADV_FREE pages are put into > > inactive file list, such pages and inactive file pages are reclaimed > > according to their age. This is expected, because we don't want to > > reclaim too many MADV_FREE pages before used once pages. > > > > Cc: Michal Hocko > > Cc: Minchan Kim > > Cc: Hugh Dickins > > Cc: Johannes Weiner > > Cc: Rik van Riel > > Cc: Mel Gorman > > Cc: Andrew Morton > > Signed-off-by: Shaohua Li > > --- > > mm/rmap.c | 4 ++++ > > mm/vmscan.c | 43 +++++++++++++++++++++++++++++++------------ > > 2 files changed, 35 insertions(+), 12 deletions(-) > > > > diff --git a/mm/rmap.c b/mm/rmap.c > > index c8d6204..5f05926 100644 > > --- a/mm/rmap.c > > +++ b/mm/rmap.c > > @@ -1554,6 +1554,10 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, > > dec_mm_counter(mm, MM_ANONPAGES); > > rp->lazyfreed++; > > goto discard; > > + } else if (flags & TTU_LZFREE) { > > + set_pte_at(mm, address, pte, pteval); > > + ret = SWAP_FAIL; > > + goto out_unmap; > > trivial: > > How about this? > > if (flags && TTU_LZFREE) { > if (PageDirty(page)) { > set_pte_at(XXX); > ret = SWAP_FAIL; > goto out_unmap; > } else { > dec_mm_counter(mm, MM_ANONPAGES); > rp->lazyfreed++; > goto discard; > } > } ok > > } > > > > if (swap_duplicate(entry) < 0) { > > diff --git a/mm/vmscan.c b/mm/vmscan.c > > index 947ab6f..b304a84 100644 > > --- a/mm/vmscan.c > > +++ b/mm/vmscan.c > > @@ -864,7 +864,7 @@ static enum page_references page_check_references(struct page *page, > > return PAGEREF_RECLAIM; > > > > if (referenced_ptes) { > > - if (PageSwapBacked(page)) > > + if (PageSwapBacked(page) || PageAnon(page)) > > If anyone accesses MADV_FREEed range with load op, not store, > why shouldn't we discard that pages? Don't have strong opinion about this, userspace probably shouldn't do this. I'm ok to delete it if you insist. > > return PAGEREF_ACTIVATE; > > /* > > * All mapped pages start out with page table > > @@ -903,7 +903,7 @@ static enum page_references page_check_references(struct page *page, > > > > /* Check if a page is dirty or under writeback */ > > static void page_check_dirty_writeback(struct page *page, > > - bool *dirty, bool *writeback) > > + bool *dirty, bool *writeback, bool lazyfree) > > { > > struct address_space *mapping; > > > > @@ -911,7 +911,7 @@ static void page_check_dirty_writeback(struct page *page, > > * Anonymous pages are not handled by flushers and must be written > > * from reclaim context. Do not stall reclaim based on them > > */ > > - if (!page_is_file_cache(page)) { > > + if (!page_is_file_cache(page) || lazyfree) { > > tivial: > > We can check it with PageLazyFree in here rather than passing lazyfree > argument. It's consistent like page_is_file_cache in here. ok > > *dirty = false; > > *writeback = false; > > return; > > @@ -971,7 +971,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > int may_enter_fs; > > enum page_references references = PAGEREF_RECLAIM_CLEAN; > > bool dirty, writeback; > > - bool lazyfree = false; > > + bool lazyfree; > > int ret = SWAP_SUCCESS; > > > > cond_resched(); > > @@ -986,6 +986,8 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > > > sc->nr_scanned++; > > > > + lazyfree = page_is_lazyfree(page); > > + > > if (unlikely(!page_evictable(page))) > > goto cull_mlocked; > > > > @@ -993,7 +995,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > goto keep_locked; > > > > /* Double the slab pressure for mapped and swapcache pages */ > > - if (page_mapped(page) || PageSwapCache(page)) > > + if ((page_mapped(page) || PageSwapCache(page)) && !lazyfree) > > sc->nr_scanned++; > > In this phase, we cannot know whether lazyfree marked page is discarable > or not. If it is freeable and mapped, this logic makes sense. However, > if the page is dirty? I think this doesn't matter. If the page is dirty, it will go to reclaim in next round and swap out. At that time, we will add nr_scanned there. > > > > may_enter_fs = (sc->gfp_mask & __GFP_FS) || > > @@ -1005,7 +1007,7 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > * will stall and start writing pages if the tail of the LRU > > * is all dirty unqueued pages. > > */ > > - page_check_dirty_writeback(page, &dirty, &writeback); > > + page_check_dirty_writeback(page, &dirty, &writeback, lazyfree); > > if (dirty || writeback) > > nr_dirty++; > > > > @@ -1107,6 +1109,14 @@ static unsigned long shrink_page_list(struct list_head *page_list, > > ; /* try to reclaim the page below */ > > } > > > > + /* lazyfree page could be freed directly */ > > + if (lazyfree) { > > + if (unlikely(PageTransHuge(page)) && > > + split_huge_page_to_list(page, page_list)) > > + goto keep_locked; > > + goto unmap_page; > > + } > > + > > Maybe, we can remove this hunk. Instead add lazyfree check in here. > > if (PageAnon(page) && !PageSwapCache(page) && !lazyfree) { > if (!(sc->gfp_mask & __GFP_IO)) ok Thanks, Shaohua -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org