author: Rongwei Wang <rongwei.wang@linux.alibaba.com> 2021-10-28 14:36:27 -0700
committer: Linus Torvalds <torvalds@linux-foundation.org> 2021-10-28 17:18:55 -0700
commit: 74c42e1baacf206338b1dd6b6199ac964512b5bb
parent: ffb29b1c255ab48cb0062a3d11c101501e3e9b3f
Commit Summary:
Diffstat:
1 file changed, 6 insertions, 1 deletion
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 045cc579f724..48de4e1b0783 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -1763,6 +1763,10 @@ static void collapse_file(struct mm_struct *mm,
filemap_flush(mapping);
result = SCAN_FAIL;
goto xa_unlocked;
+ } else if (PageWriteback(page)) {
+ xas_unlock_irq(&xas);
+ result = SCAN_FAIL;
+ goto xa_unlocked;
} else if (trylock_page(page)) {
get_page(page);
xas_unlock_irq(&xas);
@@ -1798,7 +1802,8 @@ static void collapse_file(struct mm_struct *mm,
goto out_unlock;
}
- if (!is_shmem && PageDirty(page)) {
+ if (!is_shmem && (PageDirty(page) ||
+ PageWriteback(page))) {
/*
* khugepaged only works on read-only fd, so this
* page is dirty because it hasn't been flushed