|
@@ -878,15 +878,24 @@ copy_one_pte(struct mm_struct *dst_mm, struct mm_struct *src_mm,
|
|
|
}
|
|
|
if (likely(!non_swap_entry(entry)))
|
|
|
rss[MM_SWAPENTS]++;
|
|
|
- else if (is_write_migration_entry(entry) &&
|
|
|
- is_cow_mapping(vm_flags)) {
|
|
|
- /*
|
|
|
- * COW mappings require pages in both parent
|
|
|
- * and child to be set to read.
|
|
|
- */
|
|
|
- make_migration_entry_read(&entry);
|
|
|
- pte = swp_entry_to_pte(entry);
|
|
|
- set_pte_at(src_mm, addr, src_pte, pte);
|
|
|
+ else if (is_migration_entry(entry)) {
|
|
|
+ page = migration_entry_to_page(entry);
|
|
|
+
|
|
|
+ if (PageAnon(page))
|
|
|
+ rss[MM_ANONPAGES]++;
|
|
|
+ else
|
|
|
+ rss[MM_FILEPAGES]++;
|
|
|
+
|
|
|
+ if (is_write_migration_entry(entry) &&
|
|
|
+ is_cow_mapping(vm_flags)) {
|
|
|
+ /*
|
|
|
+ * COW mappings require pages in both
|
|
|
+ * parent and child to be set to read.
|
|
|
+ */
|
|
|
+ make_migration_entry_read(&entry);
|
|
|
+ pte = swp_entry_to_pte(entry);
|
|
|
+ set_pte_at(src_mm, addr, src_pte, pte);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
goto out_set_pte;
|
|
@@ -1191,6 +1200,16 @@ again:
|
|
|
|
|
|
if (!non_swap_entry(entry))
|
|
|
rss[MM_SWAPENTS]--;
|
|
|
+ else if (is_migration_entry(entry)) {
|
|
|
+ struct page *page;
|
|
|
+
|
|
|
+ page = migration_entry_to_page(entry);
|
|
|
+
|
|
|
+ if (PageAnon(page))
|
|
|
+ rss[MM_ANONPAGES]--;
|
|
|
+ else
|
|
|
+ rss[MM_FILEPAGES]--;
|
|
|
+ }
|
|
|
if (unlikely(!free_swap_and_cache(entry)))
|
|
|
print_bad_pte(vma, addr, ptent, NULL);
|
|
|
}
|