mm: fix process_vm_rw page counts
[linux-2.6-microblaze.git] / mm / huge_memory.c
index f31f024..6eb55f9 100644 (file)
@@ -2379,7 +2379,7 @@ void vma_adjust_trans_huge(struct vm_area_struct *vma,
 static void unmap_folio(struct folio *folio)
 {
        enum ttu_flags ttu_flags = TTU_RMAP_LOCKED | TTU_SPLIT_HUGE_PMD |
-               TTU_SYNC;
+               TTU_SYNC | TTU_BATCH_FLUSH;
 
        VM_BUG_ON_FOLIO(!folio_test_large(folio), folio);
 
@@ -2392,6 +2392,8 @@ static void unmap_folio(struct folio *folio)
                try_to_migrate(folio, ttu_flags);
        else
                try_to_unmap(folio, ttu_flags | TTU_IGNORE_MLOCK);
+
+       try_to_unmap_flush();
 }
 
 static void remap_page(struct folio *folio, unsigned long nr)
@@ -2769,13 +2771,15 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
                        int nr = folio_nr_pages(folio);
 
                        xas_split(&xas, folio, folio_order(folio));
-                       if (folio_test_swapbacked(folio)) {
-                               __lruvec_stat_mod_folio(folio, NR_SHMEM_THPS,
-                                                       -nr);
-                       } else {
-                               __lruvec_stat_mod_folio(folio, NR_FILE_THPS,
-                                                       -nr);
-                               filemap_nr_thps_dec(mapping);
+                       if (folio_test_pmd_mappable(folio)) {
+                               if (folio_test_swapbacked(folio)) {
+                                       __lruvec_stat_mod_folio(folio,
+                                                       NR_SHMEM_THPS, -nr);
+                               } else {
+                                       __lruvec_stat_mod_folio(folio,
+                                                       NR_FILE_THPS, -nr);
+                                       filemap_nr_thps_dec(mapping);
+                               }
                        }
                }