Message ID | 20211225094036.574157-1-yang.yang29@zte.com.cn (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm/vmstat: add events for THP max_ptes_* exceeds | expand |
cgel.zte@gmail.com writes: > From: Yang Yang <yang.yang29@zte.com.cn> > > There are interfaces to adjust max_ptes_none, max_ptes_swap, > max_ptes_shared values, see > /sys/kernel/mm/transparent_hugepage/khugepaged/. > > But system administrator maynot know which value is the best. So > Add those events to support adjusting max_ptes_* to suitable values. > > For example, if default max_ptes_swap value causes too much failures, > and system uses zram whose IO is fast, administrator could increase > max_ptes_swap until THP_SCAN_EXCEED_SWAP_PTE not increase anymore. > > Signed-off-by: Yang Yang <yang.yang29@zte.com.cn> > --- > include/linux/vm_event_item.h | 3 +++ > mm/khugepaged.c | 7 +++++++ > mm/vmstat.c | 3 +++ > 3 files changed, 13 insertions(+) > > diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h > index a185cc75ff52..7b2363388bfa 100644 > --- a/include/linux/vm_event_item.h > +++ b/include/linux/vm_event_item.h > @@ -98,6 +98,9 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, > THP_SPLIT_PAGE_FAILED, > THP_DEFERRED_SPLIT_PAGE, > THP_SPLIT_PMD, > + THP_SCAN_EXCEED_NONE_PTE, > + THP_SCAN_EXCEED_SWAP_PTE, > + THP_SCAN_EXCEED_SHARED_PTE, "SCAN" appears too general, how about THP_COLLAPSE_EXCEED_SWAP_PTE ? Best Regards, Huang, Ying [snip]
On Mon, Dec 27, 2021 at 11:19:32AM +0800, Huang, Ying wrote: > cgel.zte@gmail.com writes: > > > From: Yang Yang <yang.yang29@zte.com.cn> > > > > There are interfaces to adjust max_ptes_none, max_ptes_swap, > > max_ptes_shared values, see > > /sys/kernel/mm/transparent_hugepage/khugepaged/. > > > > But system administrator maynot know which value is the best. So > > Add those events to support adjusting max_ptes_* to suitable values. > > > > For example, if default max_ptes_swap value causes too much failures, > > and system uses zram whose IO is fast, administrator could increase > > max_ptes_swap until THP_SCAN_EXCEED_SWAP_PTE not increase anymore. > > > > Signed-off-by: Yang Yang <yang.yang29@zte.com.cn> > > --- > > include/linux/vm_event_item.h | 3 +++ > > mm/khugepaged.c | 7 +++++++ > > mm/vmstat.c | 3 +++ > > 3 files changed, 13 insertions(+) > > > > diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h > > index a185cc75ff52..7b2363388bfa 100644 > > --- a/include/linux/vm_event_item.h > > +++ b/include/linux/vm_event_item.h > > @@ -98,6 +98,9 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, > > THP_SPLIT_PAGE_FAILED, > > THP_DEFERRED_SPLIT_PAGE, > > THP_SPLIT_PMD, > > + THP_SCAN_EXCEED_NONE_PTE, > > + THP_SCAN_EXCEED_SWAP_PTE, > > + THP_SCAN_EXCEED_SHARED_PTE, > > "SCAN" appears too general, how about > > THP_COLLAPSE_EXCEED_SWAP_PTE > > ? > Thanks for your suggesting. But I think SCAN is easy to understand, it is SCAN behaviour cause the event, and we know this event is comes from SCAN_EXCEED_*_PTE. > Best Regards, > Huang, Ying > > [snip]
diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h index a185cc75ff52..7b2363388bfa 100644 --- a/include/linux/vm_event_item.h +++ b/include/linux/vm_event_item.h @@ -98,6 +98,9 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT, THP_SPLIT_PAGE_FAILED, THP_DEFERRED_SPLIT_PAGE, THP_SPLIT_PMD, + THP_SCAN_EXCEED_NONE_PTE, + THP_SCAN_EXCEED_SWAP_PTE, + THP_SCAN_EXCEED_SHARED_PTE, #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD THP_SPLIT_PUD, #endif diff --git a/mm/khugepaged.c b/mm/khugepaged.c index 7720189a2da7..abcd6bd8b97a 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -618,6 +618,7 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, continue; } else { result = SCAN_EXCEED_NONE_PTE; + count_vm_event(THP_SCAN_EXCEED_NONE_PTE); goto out; } } @@ -636,6 +637,7 @@ static int __collapse_huge_page_isolate(struct vm_area_struct *vma, if (page_mapcount(page) > 1 && ++shared > khugepaged_max_ptes_shared) { result = SCAN_EXCEED_SHARED_PTE; + count_vm_event(THP_SCAN_EXCEED_SHARED_PTE); goto out; } @@ -1253,6 +1255,7 @@ static int khugepaged_scan_pmd(struct mm_struct *mm, continue; } else { result = SCAN_EXCEED_SWAP_PTE; + count_vm_event(THP_SCAN_EXCEED_SWAP_PTE); goto out_unmap; } } @@ -1262,6 +1265,7 @@ static int khugepaged_scan_pmd(struct mm_struct *mm, continue; } else { result = SCAN_EXCEED_NONE_PTE; + count_vm_event(THP_SCAN_EXCEED_NONE_PTE); goto out_unmap; } } @@ -1290,6 +1294,7 @@ static int khugepaged_scan_pmd(struct mm_struct *mm, if (page_mapcount(page) > 1 && ++shared > khugepaged_max_ptes_shared) { result = SCAN_EXCEED_SHARED_PTE; + count_vm_event(THP_SCAN_EXCEED_SHARED_PTE); goto out_unmap; } @@ -2006,6 +2011,7 @@ static void khugepaged_scan_file(struct mm_struct *mm, if (xa_is_value(page)) { if (++swap > khugepaged_max_ptes_swap) { result = SCAN_EXCEED_SWAP_PTE; + count_vm_event(THP_SCAN_EXCEED_SWAP_PTE); break; } continue; @@ -2056,6 +2062,7 @@ static void khugepaged_scan_file(struct mm_struct *mm, if (result == SCAN_SUCCEED) { if (present < HPAGE_PMD_NR - khugepaged_max_ptes_none) { result = SCAN_EXCEED_NONE_PTE; + count_vm_event(THP_SCAN_EXCEED_NONE_PTE); } else { node = khugepaged_find_target_node(); collapse_file(mm, file, start, hpage, node); diff --git a/mm/vmstat.c b/mm/vmstat.c index d701c335628c..4057372745d0 100644 --- a/mm/vmstat.c +++ b/mm/vmstat.c @@ -1353,6 +1353,9 @@ const char * const vmstat_text[] = { "thp_split_page_failed", "thp_deferred_split_page", "thp_split_pmd", + "thp_scan_exceed_none_pte", + "thp_scan_exceed_swap_pte", + "thp_scan_exceed_share_pte", #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD "thp_split_pud", #endif