Like split event counter, this patch add counter for merge event. Signed-off-by: Aaron Lu <aaron.lu@xxxxxxxxx> --- arch/x86/mm/pat/set_memory.c | 19 +++++++++++++++++++ include/linux/vm_event_item.h | 2 ++ mm/vmstat.c | 2 ++ 3 files changed, 23 insertions(+) diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c index fea2c70ff37f..1be9aab42c79 100644 --- a/arch/x86/mm/pat/set_memory.c +++ b/arch/x86/mm/pat/set_memory.c @@ -105,6 +105,23 @@ static void split_page_count(int level) direct_pages_count[level - 1] += PTRS_PER_PTE; } +static void merge_page_count(int level) +{ + if (direct_pages_count[level] < PTRS_PER_PTE) { + WARN_ON_ONCE(1); + return; + } + + direct_pages_count[level] -= PTRS_PER_PTE; + if (system_state == SYSTEM_RUNNING) { + if (level == PG_LEVEL_4K) + count_vm_event(DIRECT_MAP_LEVEL1_MERGE); + else if (level == PG_LEVEL_2M) + count_vm_event(DIRECT_MAP_LEVEL2_MERGE); + } + direct_pages_count[level + 1]++; +} + void arch_report_meminfo(struct seq_file *m) { seq_printf(m, "DirectMap4k: %8lu kB\n", @@ -875,6 +892,8 @@ static void merge_splitted_mapping(struct page *pgt, int level) __ClearPageSplitpgt(pgt); __free_page(pgt); + + merge_page_count(level); } static pgprot_t pgprot_clear_protnone_bits(pgprot_t prot) diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h index 404024486fa5..00a9a435af49 100644 --- a/include/linux/vm_event_item.h +++ b/include/linux/vm_event_item.h @@ -143,6 +143,8 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, #ifdef CONFIG_X86 DIRECT_MAP_LEVEL2_SPLIT, DIRECT_MAP_LEVEL3_SPLIT, + DIRECT_MAP_LEVEL1_MERGE, + DIRECT_MAP_LEVEL2_MERGE, #endif NR_VM_EVENT_ITEMS }; diff --git a/mm/vmstat.c b/mm/vmstat.c index 373d2730fcf2..1a4287a4d614 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1403,6 +1403,8 @@ const char * const vmstat_text[] = { #ifdef CONFIG_X86 "direct_map_level2_splits", "direct_map_level3_splits", + "direct_map_level1_merges", + "direct_map_level2_merges", #endif #endif /* CONFIG_VM_EVENT_COUNTERS || CONFIG_MEMCG */ }; -- 2.37.1