@@ -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,
@@ -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
@@ -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);
@@ -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",
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@linux.alibaba.com> --- 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(+)