[Devel,rh7] mm/hmm: Restore removed hunk in copy_one_pte()

Submitted by Andrey Ryabinin on Aug. 28, 2017, 11:54 a.m.

Details

Message ID 20170828115438.12094-1-aryabinin@virtuozzo.com
State New
Series "mm/hmm: Restore removed hunk in copy_one_pte()"
Headers show

Commit Message

Andrey Ryabinin Aug. 28, 2017, 11:54 a.m.
Rebased "ms/mm: remove rest usage of VM_NONLINEAR and pte_file()"
removed huge hunk from copy_one_pte for no reason. Bring it back

https://jira.sw.ru/browse/PSBM-70740

Fixes: be8e22c9c444 ("ms/mm: remove rest usage of VM_NONLINEAR and pte_file()")
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
---
 mm/memory.c | 25 ++++++++++++++++++++++---
 1 file changed, 22 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

diff --git a/mm/memory.c b/mm/memory.c
index e53e8dd288eb..c30a042cebf5 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -879,13 +879,32 @@  copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
 					pte = pte_swp_mksoft_dirty(pte);
 				set_pte_at(src_mm, addr, src_pte, pte);
 			}
-		} else {
+		} else if (is_hmm_entry(entry)) {
+			page = hmm_entry_to_page(entry);
+
+			/*
+			 * Update rss count even for un-addressable
+			 * page as they should be consider just like
+			 * any other page.
+			 */
+			get_page(page);
+			rss[mm_counter(page)]++;
+			page_dup_rmap(page);
+
+			if (is_write_hmm_entry(entry) &&
+				is_cow_mapping(vm_flags)) {
+				make_hmm_entry_read(&entry);
+				pte = swp_entry_to_pte(entry);
+				if (pte_swp_soft_dirty(*src_pte))
+					pte = pte_swp_mksoft_dirty(pte);
+				set_pte_at(src_mm, addr, src_pte, pte);
+			}
+		} else
 			/*
 			 * This can not happen because HMM migration holds
 			 * mmap_sem in read mode.
 			 */
-			VM_BUG_ON(is_hmm_entry(entry));
-		}
+			 VM_BUG_ON(is_hmm_entry(entry));
 		goto out_set_pte;
 	}