From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Kirill A. Shutemov" Subject: RE: [PATCH 03/12] mm, thp, tmpfs: handle huge page cases in shmem_getpage_gfp Date: Tue, 15 Oct 2013 13:29:12 +0300 (EEST) Message-ID: <20131015102912.2BC99E0090@blue.fi.intel.com> References: <20131015001214.GD3432@hippobay.mtv.corp.google.com> Content-Transfer-Encoding: 7bit Cc: Andrea Arcangeli , Andrew Morton , "Kirill A. Shutemov" , Hugh Dickins , Al Viro , Hugh Dickins , Wu Fengguang , Jan Kara , Mel Gorman , linux-mm@kvack.org, Andi Kleen , Matthew Wilcox , Hillf Danton , Dave Hansen , Alexander Shishkin , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Ning Qu To: Ning Qu Return-path: In-Reply-To: <20131015001214.GD3432@hippobay.mtv.corp.google.com> Sender: owner-linux-mm@kvack.org List-Id: linux-fsdevel.vger.kernel.org Ning Qu wrote: > We don't support huge page when page is moved from page cache to swap. > So in this function, we enable huge page handling in two case: > > 1) when a huge page is found in the page cache, > 2) or we need to alloc a huge page for page cache > > We have to refactor all the calls to shmem_getpages to simplify the job > of caller. Right now shmem_getpage does: > > 1) simply request a page, default as a small page > 2) or caller specify a flag to request either a huge page or a small page, > then leave the caller to decide how to use it > > Signed-off-by: Ning Qu > --- > mm/shmem.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++-------------- > 1 file changed, 108 insertions(+), 31 deletions(-) > > diff --git a/mm/shmem.c b/mm/shmem.c > index 447bd14..8fe17dd 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -115,15 +115,43 @@ static unsigned long shmem_default_max_inodes(void) > static bool shmem_should_replace_page(struct page *page, gfp_t gfp); > static int shmem_replace_page(struct page **pagep, gfp_t gfp, > struct shmem_inode_info *info, pgoff_t index); > + > static int shmem_getpage_gfp(struct inode *inode, pgoff_t index, > - struct page **pagep, enum sgp_type sgp, gfp_t gfp, int *fault_type); > + struct page **pagep, enum sgp_type sgp, gfp_t gfp, int flags, > + int *fault_type); > + > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE_PAGECACHE > +static inline int shmem_getpage(struct inode *inode, pgoff_t index, > + struct page **pagep, enum sgp_type sgp, gfp_t gfp, int flags, > + int *fault_type) > +{ > + int ret = 0; > + struct page *page = NULL; > > + if ((flags & AOP_FLAG_TRANSHUGE) && > + mapping_can_have_hugepages(inode->i_mapping)) { I don't think we need ifdef here. mapping_can_have_hugepages() will be 0 compile-time, if CONFIG_TRANSPARENT_HUGEPAGE_PAGECACHE is not defined and compiler should optimize out thp case. > @@ -1298,27 +1348,37 @@ repeat: > error = -ENOSPC; > goto unacct; > } > - percpu_counter_inc(&sbinfo->used_blocks); > } > > - page = shmem_alloc_page(gfp, info, index); > + if (must_use_thp) { > + page = shmem_alloc_hugepage(gfp, info, index); > + if (page) { > + count_vm_event(THP_WRITE_ALLOC); > + nr = hpagecache_nr_pages(page); nr = hpagecache_nr_pages(page) can be moved below if (must_use_thp). hpagecache_nr_pages(page) evaluates to 0 for small pages. -- Kirill A. Shutemov -- 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