diff options
author | Kirill A. Shutemov <[email protected]> | 2019-10-18 20:20:36 -0700 |
---|---|---|
committer | Linus Torvalds <[email protected]> | 2019-10-19 06:32:33 -0400 |
commit | ef18a1ca847b01cb7296f11a728cb2f5ef671760 (patch) | |
tree | 1997ff661ec1c7d5d25bc59264d7520c845427c8 | |
parent | 906d278d75e364f2bb85dc1e1ff6265ea46e7e43 (diff) |
mm/thp: allow dropping THP from page cache
Once a THP is added to the page cache, it cannot be dropped via
/proc/sys/vm/drop_caches. Fix this issue with proper handling in
invalidate_mapping_pages().
Link: http://lkml.kernel.org/r/[email protected]
Fixes: 99cb0dbd47a1 ("mm,thp: add read-only THP support for (non-shmem) FS")
Signed-off-by: Kirill A. Shutemov <[email protected]>
Signed-off-by: Song Liu <[email protected]>
Tested-by: Song Liu <[email protected]>
Acked-by: Yang Shi <[email protected]>
Cc: Matthew Wilcox (Oracle) <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Srikar Dronamraju <[email protected]>
Cc: William Kucharski <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
-rw-r--r-- | mm/truncate.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/mm/truncate.c b/mm/truncate.c index 8563339041f6..dd9ebc1da356 100644 --- a/mm/truncate.c +++ b/mm/truncate.c @@ -592,6 +592,16 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping, unlock_page(page); continue; } + + /* Take a pin outside pagevec */ + get_page(page); + + /* + * Drop extra pins before trying to invalidate + * the huge page. + */ + pagevec_remove_exceptionals(&pvec); + pagevec_release(&pvec); } ret = invalidate_inode_page(page); @@ -602,6 +612,8 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping, */ if (!ret) deactivate_file_page(page); + if (PageTransHuge(page)) + put_page(page); count += ret; } pagevec_remove_exceptionals(&pvec); |