mm: thp: count 64k shmem pages separately
authorMarek Szyprowski <m.szyprowski@samsung.com>
Wed, 22 Sep 2021 13:29:33 +0000 (15:29 +0200)
committerHoegeun Kwon <hoegeun.kwon@samsung.com>
Mon, 7 Feb 2022 08:01:41 +0000 (17:01 +0900)
64k THP for shmem needs separate counters, otherwise ShmemHugePages entry
in /proc/meminfo incorrectly shows both 2M and 64k THPs as 2M ones.

Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Change-Id: I460ea9f4e9c2f84bb066f68bfb6a291183416bb1

fs/proc/meminfo.c
include/linux/mmzone.h
mm/filemap.c
mm/huge_memory.c
mm/khugepaged.c
mm/page_alloc.c
mm/shmem.c
mm/vmstat.c

index abc072b..e619d5b 100644 (file)
@@ -136,6 +136,10 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
 #endif /* CONFIG_FINEGRAINED_THP */
        show_val_kb(m, "ShmemHugePages: ",
                    global_node_page_state(NR_SHMEM_THPS) * HPAGE_PMD_NR);
+#ifdef CONFIG_FINEGRAINED_THP
+       show_val_kb(m, "Shmem64KBPages: ",
+                   global_node_page_state(NR_SHMEM_64KB_THPS) * HPAGE_CONT_PTE_NR);
+#endif /* CONFIG_FINEGRAINED_THP */
        show_val_kb(m, "ShmemPmdMapped: ",
                    global_node_page_state(NR_SHMEM_PMDMAPPED) * HPAGE_PMD_NR);
 #ifdef CONFIG_FINEGRAINED_THP
index 1f2d21c..4e344e6 100644 (file)
@@ -192,6 +192,9 @@ enum node_stat_item {
        NR_WRITEBACK_TEMP,      /* Writeback using temporary buffers */
        NR_SHMEM,               /* shmem pages (included tmpfs/GEM pages) */
        NR_SHMEM_THPS,
+#ifdef CONFIG_FINEGRAINED_THP
+       NR_SHMEM_64KB_THPS,
+#endif /* CONFIG_FINEGRAINED_THP */
        NR_SHMEM_PMDMAPPED,
 #ifdef CONFIG_FINEGRAINED_THP
        NR_SHMEM_PTEMAPPED,
index 02099ca..4ef7518 100644 (file)
@@ -203,8 +203,16 @@ static void unaccount_page_cache_page(struct address_space *mapping,
        __mod_lruvec_page_state(page, NR_FILE_PAGES, -nr);
        if (PageSwapBacked(page)) {
                __mod_lruvec_page_state(page, NR_SHMEM, -nr);
-               if (PageTransHuge(page))
+               if (PageTransHuge(page)) {
+#ifdef CONFIG_FINEGRAINED_THP
+                       if (thp_nr_pages(page) == HPAGE_PMD_NR)
+                               __dec_node_page_state(page, NR_SHMEM_THPS);
+                       else
+                               __dec_node_page_state(page, NR_SHMEM_64KB_THPS);
+#else /* CONFIG_FINEGRAINED_THP */
                        __dec_node_page_state(page, NR_SHMEM_THPS);
+#endif /* CONFIG_FINEGRAINED_THP */
+               }
        } else if (PageTransHuge(page)) {
 #ifdef CONFIG_FINEGRAINED_THP
                if (thp_nr_pages(page) == HPAGE_PMD_NR)
index 07feb17..9ae0287 100644 (file)
@@ -2842,9 +2842,14 @@ int split_huge_page_to_list(struct page *page, struct list_head *list)
                }
                spin_unlock(&ds_queue->split_queue_lock);
                if (mapping) {
-                       if (PageSwapBacked(head))
-                               __dec_node_page_state(head, NR_SHMEM_THPS);
-                       else {
+                       if (PageSwapBacked(head)) {
+#ifdef CONFIG_FINEGRAINED_THP
+                               if (thp_nr_pages(head) == HPAGE_CONT_PTE_NR)
+                                       __dec_node_page_state(head, NR_SHMEM_64KB_THPS);
+                               else
+#endif /* CONFIG_FINEGRAINED_THP */
+                                       __dec_node_page_state(head, NR_SHMEM_THPS);
+                       } else {
 #ifdef CONFIG_FINEGRAINED_THP
                                if (thp_nr_pages(head) == HPAGE_CONT_PTE_NR)
                                        __dec_node_page_state(head, NR_FILE_64KB_THPS);
index 5868e8b..806bf60 100644 (file)
@@ -2343,7 +2343,14 @@ out_unlock:
        }
 
        if (is_shmem)
+#ifdef CONFIG_FINEGRAINED_THP
+               if (hpage_type == THP_TYPE_64KB)
+                       __inc_node_page_state(new_page, NR_SHMEM_64KB_THPS);
+               else
+                       __inc_node_page_state(new_page, NR_SHMEM_THPS);
+#else /* CONFIG_FINEGRAINED_THP */
                __inc_node_page_state(new_page, NR_SHMEM_THPS);
+#endif /* CONFIG_FINEGRAINED_THP */
        else {
 #ifdef CONFIG_FINEGRAINED_THP
                if (hpage_type == THP_TYPE_64KB)
index 0a0ca74..53e6be1 100644 (file)
@@ -5496,6 +5496,9 @@ void show_free_areas(unsigned int filter, nodemask_t *nodemask)
                        " shmem:%lukB"
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
                        " shmem_thp: %lukB"
+#ifdef CONFIG_FINEGRAINED_THP
+                       " shmem_64kb_thp: %lukB"
+#endif /* CONFIG_FINEGRAINED_THP */
                        " shmem_pmdmapped: %lukB"
                        " anon_thp: %lukB"
 #endif
@@ -5520,6 +5523,9 @@ void show_free_areas(unsigned int filter, nodemask_t *nodemask)
                        K(node_page_state(pgdat, NR_SHMEM)),
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
                        K(node_page_state(pgdat, NR_SHMEM_THPS) * HPAGE_PMD_NR),
+#ifdef CONFIG_FINEGRAINED_THP
+                       K(node_page_state(pgdat, NR_SHMEM_64KB_THPS) * HPAGE_CONT_PTE_NR),
+#endif /* CONFIG_FINEGRAINED_THP */
                        K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED)
                                        * HPAGE_PMD_NR),
                        K(node_page_state(pgdat, NR_ANON_THPS) * HPAGE_PMD_NR),
index c2673da..67a8d5b 100644 (file)
@@ -718,6 +718,11 @@ next:
                }
                if (PageTransHuge(page)) {
                        count_vm_event(THP_FILE_ALLOC);
+#ifdef CONFIG_FINEGRAINED_THP
+                       if (thp_nr_pages(page) == HPAGE_CONT_PTE_NR)
+                               __inc_node_page_state(page, NR_SHMEM_64KB_THPS);
+                       else
+#endif /* CONFIG_FINEGRAINED_THP */
                        __inc_node_page_state(page, NR_SHMEM_THPS);
                }
                mapping->nrpages += nr;
index 42f5ef2..feb65b0 100644 (file)
@@ -1200,6 +1200,9 @@ const char * const vmstat_text[] = {
        "nr_writeback_temp",
        "nr_shmem",
        "nr_shmem_hugepages",
+#ifdef CONFIG_FINEGRAINED_THP
+       "nr_shmem_64kb_hugepages",
+#endif
        "nr_shmem_pmdmapped",
 #ifdef CONFIG_FINEGRAINED_THP
        "nr_shmem_ptemapped",