mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
mm/khugepaged: collapse_shmem() stop if punched or truncated
commit701270fa19upstream. Huge tmpfs testing showed that although collapse_shmem() recognizes a concurrently truncated or hole-punched page correctly, its handling of holes was liable to refill an emptied extent. Add check to stop that. Link: http://lkml.kernel.org/r/alpine.LSU.2.11.1811261522040.2275@eggly.anvils Fixes:f3f0e1d215("khugepaged: add support of collapse for tmpfs/shmem pages") Signed-off-by: Hugh Dickins <hughd@google.com> Reviewed-by: Matthew Wilcox <willy@infradead.org> Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Cc: Jerome Glisse <jglisse@redhat.com> Cc: Konstantin Khlebnikov <khlebnikov@yandex-team.ru> Cc: <stable@vger.kernel.org> [4.8+] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6f75a09833
commit
81d2848c99
@@ -1352,6 +1352,16 @@ static void collapse_shmem(struct mm_struct *mm,
|
||||
radix_tree_for_each_slot(slot, &mapping->page_tree, &iter, start) {
|
||||
int n = min(iter.index, end) - index;
|
||||
|
||||
/*
|
||||
* Stop if extent has been hole-punched, and is now completely
|
||||
* empty (the more obvious i_size_read() check would take an
|
||||
* irq-unsafe seqlock on 32-bit).
|
||||
*/
|
||||
if (n >= HPAGE_PMD_NR) {
|
||||
result = SCAN_TRUNCATED;
|
||||
goto tree_locked;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle holes in the radix tree: charge it from shmem and
|
||||
* insert relevant subpage of new_page into the radix-tree.
|
||||
@@ -1463,6 +1473,11 @@ out_unlock:
|
||||
if (result == SCAN_SUCCEED && index < end) {
|
||||
int n = end - index;
|
||||
|
||||
/* Stop if extent has been truncated, and is now empty */
|
||||
if (n >= HPAGE_PMD_NR) {
|
||||
result = SCAN_TRUNCATED;
|
||||
goto tree_locked;
|
||||
}
|
||||
if (!shmem_charge(mapping->host, n)) {
|
||||
result = SCAN_FAIL;
|
||||
goto tree_locked;
|
||||
|
||||
Reference in New Issue
Block a user