On 09/29/2020 03:34 AM, Mike Kravetz wrote: > On 9/25/20 2:12 AM, Anshuman Khandual wrote: >> Add following new vmstat events which will track HugeTLB page migration. >> >> 1. HUGETLB_MIGRATION_SUCCESS >> 2. HUGETLB_MIGRATION_FAILURE >> >> It follows the existing semantics to accommodate HugeTLB subpages in total >> page migration statistics. While here, this updates current trace event >> "mm_migrate_pages" to accommodate now available HugeTLB based statistics. > > Thanks. This makes sense with recent THP changes. > >> diff --git a/mm/migrate.c b/mm/migrate.c >> index 3ab965f83029..d53dd101ffff 100644 >> --- a/mm/migrate.c >> +++ b/mm/migrate.c >> @@ -1415,13 +1415,17 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, >> { >> int retry = 1; >> int thp_retry = 1; >> + int hugetlb_retry = 1; >> int nr_failed = 0; >> int nr_succeeded = 0; >> int nr_thp_succeeded = 0; >> int nr_thp_failed = 0; >> int nr_thp_split = 0; >> + int nr_hugetlb_succeeded = 0; >> + int nr_hugetlb_failed = 0; >> int pass = 0; >> bool is_thp = false; >> + bool is_hugetlb = false; >> struct page *page; >> struct page *page2; >> int swapwrite = current->flags & PF_SWAPWRITE; >> @@ -1433,6 +1437,7 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, >> for (pass = 0; pass < 10 && (retry || thp_retry); pass++) { >> retry = 0; >> thp_retry = 0; >> + hugetlb_retry = 0; >> >> list_for_each_entry_safe(page, page2, from, lru) { >> retry: >> @@ -1442,7 +1447,12 @@ int migrate_pages(struct list_head *from, new_page_t get_new_page, >> * during migration. >> */ >> is_thp = PageTransHuge(page) && !PageHuge(page); >> + is_hugetlb = PageTransHuge(page) && PageHuge(page); > > PageHuge does not depend on PageTransHuge. So, this could just be > is_hugetlb = PageHuge(page); Sure. > > Actually, the current version of PageHuge is more expensive than PageTransHuge. > So, the most optimal way to set these would be something like. > if (PageTransHuge(page)) > if (PageHuge(page)) > is_hugetlb = true; > else > is_thp = true; > > Although, the compiler may be able to optimize. I did not check. Both is_hugetlb and is_thp need to have either a true or false value during each iteration as they are not getting reset otherwise. Hence basically it should either be is_thp = PageTransHuge(page) && !PageHuge(page); is_hugetlb = PageHuge(page); OR is_hugetlb = false; is_thp = false; if (PageTransHuge(page)) if (PageHuge(page)) is_hugetlb = true; else is_thp = true; } > >> + >> nr_subpages = thp_nr_pages(page); >> + if (is_hugetlb) >> + nr_subpages = pages_per_huge_page(page_hstate(page)); > > Can we just use compound_order() here for all cases? Sure but we could also directly use compound_nr().