Demoted pages are counted into reclaim_state->nr_demoted instead of nr_reclaimed since they are not reclaimed actually. They are still in memory, but just migrated to PMEM. Add pgdemote_kswapd and pgdemote_direct VM counters showed in /proc/vmstat. Signed-off-by: Yang Shi <yang.shi@xxxxxxxxxxxxxxxxx> --- include/linux/vm_event_item.h | 2 ++ include/linux/vmstat.h | 1 + mm/vmscan.c | 14 ++++++++++++++ mm/vmstat.c | 2 ++ 4 files changed, 19 insertions(+) diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h index 47a3441..499a3aa 100644 --- a/include/linux/vm_event_item.h +++ b/include/linux/vm_event_item.h @@ -32,6 +32,8 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, PGREFILL, PGSTEAL_KSWAPD, PGSTEAL_DIRECT, + PGDEMOTE_KSWAPD, + PGDEMOTE_DIRECT, PGSCAN_KSWAPD, PGSCAN_DIRECT, PGSCAN_DIRECT_THROTTLE, diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 2db8d60..eb5d21c 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -29,6 +29,7 @@ struct reclaim_stat { unsigned nr_activate; unsigned nr_ref_keep; unsigned nr_unmap_fail; + unsigned nr_demoted; }; #ifdef CONFIG_VM_EVENT_COUNTERS diff --git a/mm/vmscan.c b/mm/vmscan.c index bdcab6b..3c7ba7e 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1286,6 +1286,10 @@ static unsigned long shrink_page_list(struct list_head *page_list, if (has_nonram_online()) { list_add(&page->lru, &demote_pages); + if (PageTransHuge(page)) + stat->nr_demoted += HPAGE_PMD_NR; + else + stat->nr_demoted++; unlock_page(page); continue; } @@ -1523,7 +1527,17 @@ static unsigned long shrink_page_list(struct list_head *page_list, putback_movable_pages(&demote_pages); list_splice(&ret_pages, &demote_pages); + + if (err > 0) + stat->nr_demoted -= err; + else + stat->nr_demoted = 0; } + + if (current_is_kswapd()) + __count_vm_events(PGDEMOTE_KSWAPD, stat->nr_demoted); + else + __count_vm_events(PGDEMOTE_DIRECT, stat->nr_demoted); } mem_cgroup_uncharge_list(&free_pages); diff --git a/mm/vmstat.c b/mm/vmstat.c index 36b56f8..0e863e7 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1192,6 +1192,8 @@ int fragmentation_index(struct zone *zone, unsigned int order) "pgrefill", "pgsteal_kswapd", "pgsteal_direct", + "pgdemote_kswapd", + "pgdemote_direct", "pgscan_kswapd", "pgscan_direct", "pgscan_direct_throttle", -- 1.8.3.1