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); 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. > + > 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? -- Mike Kravetz