Ning Qu wrote: > When comes to truncate file, add support to handle huge page in the > truncate range. > > Signed-off-by: Ning Qu <quning@xxxxxxxxx> > --- > mm/shmem.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------- > 1 file changed, 86 insertions(+), 11 deletions(-) > > diff --git a/mm/shmem.c b/mm/shmem.c > index 0a423a9..90f2e0e 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -559,6 +559,7 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, > struct shmem_inode_info *info = SHMEM_I(inode); > pgoff_t start = (lstart + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; > pgoff_t end = (lend + 1) >> PAGE_CACHE_SHIFT; > + /* Whether we have to do partial truncate */ > unsigned int partial_start = lstart & (PAGE_CACHE_SIZE - 1); > unsigned int partial_end = (lend + 1) & (PAGE_CACHE_SIZE - 1); > struct pagevec pvec; > @@ -570,12 +571,16 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, > if (lend == -1) > end = -1; /* unsigned, so actually very big */ > > + i_split_down_read(inode); > pagevec_init(&pvec, 0); > index = start; > while (index < end) { > + bool thp = false; > + > pvec.nr = shmem_find_get_pages_and_swap(mapping, index, > min(end - index, (pgoff_t)PAGEVEC_SIZE), > pvec.pages, indices); > + > if (!pvec.nr) > break; > mem_cgroup_uncharge_start(); > @@ -586,6 +591,25 @@ static void shmem_undo_range(struct inode *inode, loff_t lstart, loff_t lend, > if (index >= end) > break; > > + thp = PageTransHugeCache(page); > +#ifdef CONFIG_TRANSPARENT_HUGEPAGE_PAGECACHE Again. Here and below ifdef is redundant: PageTransHugeCache() is zero compile-time and thp case will be optimize out. And do we really need a copy of truncate logic here? Is there a way to share code? -- Kirill A. Shutemov -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>