On 7/9/20 10:42 AM, Zi Yan wrote:

> 
> I agree. The patch does not apply to mmotm. Can you try the incremental
> patch below? It should apply to mmotm.
> 
> 
> Hi Andrew and Anshuman,
> 
> Should Anshuman resend the incremental patch or Andrew can fold it along
> with the two patches in mmotm into one?
> 
> 
> diff --git a/Documentation/vm/page_migration.rst 
> b/Documentation/vm/page_migration.rst
> index e65d49f3cf86..68883ac485fa 100644
> --- a/Documentation/vm/page_migration.rst
> +++ b/Documentation/vm/page_migration.rst
> @@ -253,24 +253,32 @@ which are function pointers of struct 
> address_space_operations.
>       PG_isolated is alias with PG_reclaim flag so driver shouldn't use the 
> flag
>       for own purpose.
> 
> -Quantifying Migration
> +Monitoring Migration
>  =====================
> -Following events can be used to quantify page migration.
> -
> -1. PGMIGRATE_SUCCESS       /* Normal page migration success */
> -2. PGMIGRATE_FAIL          /* Normal page migration failure */
> -3. THP_MIGRATION_SUCCESS   /* Transparent huge page migration success */
> -4. THP_MIGRATION_FAILURE   /* Transparent huge page migration failure */
> -5. THP_MIGRATION_SPLIT     /* Transparent huge page got split, retried */
> -
> -THP_MIGRATION_SUCCESS is when THP is migrated successfully without getting
> -split into it's subpages. THP_MIGRATION_FAILURE is when THP could neither
> -be migrated nor be split. THP_MIGRATION_SPLIT is when THP could not
> -just be migrated as is but instead get split into it's subpages and later
> -retried as normal pages. THP events would also update normal page migration
> -statistics PGMIGRATE_SUCCESS and PGMIGRATE_FAILURE. These events will help
> -in quantifying and analyzing various THP migration events including both
> -success and failure cases.
> +
> +The following events (counters) can be used to monitor page migration.
> +
> +1. PGMIGRATE_SUCCESS: Normal page migration success. Each count means that a
> +   page was migrated. If the page was a non-THP page, then this counter is
> +   increased by one. If the page was a THP, then this counter is increased by
> +   the number of THP subpages. For example, migration of a single 2MB THP 
> that
> +   has 4KB-size base pages (subpages) will cause this counter to increase by
> +   512.
> +
> +2. PGMIGRATE_FAIL: Normal page migration failure. Same counting rules as for
> +   _SUCCESS, above: this will be increased by the number of subpages, if it 
> was
> +   a THP.
> +
> +3. THP_MIGRATION_SUCCESS: A THP was migrated without being split.
> +
> +4. THP_MIGRATION_FAIL: A THP could not be migrated nor it could be split.
> +
> +5. THP_MIGRATION_SPLIT: A THP was migrated, but not as such: first, the THP 
> had
> +   to be split. After splitting, a migration retry was used for it's 
> sub-pages.
> +
> +THP_MIGRATION_* events also update the appropriate PGMIGRATE_SUCCESS or
> +PGMIGRATE_FAIL events. For example, a THP migration failure will cause both
> +THP_MIGRATION_FAIL and PGMIGRATE_FAIL to increase.
> 
>  Christoph Lameter, May 8, 2006.
>  Minchan Kim, Mar 28, 2016.
> diff --git a/include/linux/vm_event_item.h b/include/linux/vm_event_item.h
> index 5e7ffa025589..2e6ca53b9bbd 100644
> --- a/include/linux/vm_event_item.h
> +++ b/include/linux/vm_event_item.h
> @@ -56,6 +56,9 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
>  #endif
>  #ifdef CONFIG_MIGRATION
>               PGMIGRATE_SUCCESS, PGMIGRATE_FAIL,
> +             THP_MIGRATION_SUCCESS,
> +             THP_MIGRATION_FAIL,
> +             THP_MIGRATION_SPLIT,
>  #endif
>  #ifdef CONFIG_COMPACTION
>               COMPACTMIGRATE_SCANNED, COMPACTFREE_SCANNED,
> @@ -95,9 +98,6 @@ enum vm_event_item { PGPGIN, PGPGOUT, PSWPIN, PSWPOUT,
>               THP_ZERO_PAGE_ALLOC_FAILED,
>               THP_SWPOUT,
>               THP_SWPOUT_FALLBACK,
> -             THP_MIGRATION_SUCCESS,
> -             THP_MIGRATION_FAILURE,
> -             THP_MIGRATION_SPLIT,
>  #endif
>  #ifdef CONFIG_MEMORY_BALLOON
>               BALLOON_INFLATE,
> diff --git a/mm/migrate.c b/mm/migrate.c
> index b0125c082549..c6cb8e676f9d 100644
> --- a/mm/migrate.c
> +++ b/mm/migrate.c
> @@ -1425,7 +1425,7 @@ int migrate_pages(struct list_head *from, new_page_t 
> get_new_page,
>       struct page *page;
>       struct page *page2;
>       int swapwrite = current->flags & PF_SWAPWRITE;
> -     int rc, thp_n_pages;
> +     int rc, nr_subpages;
> 
>       if (!swapwrite)
>               current->flags |= PF_SWAPWRITE;
> @@ -1442,7 +1442,7 @@ int migrate_pages(struct list_head *from, new_page_t 
> get_new_page,
>                        * during migration.
>                        */
>                       is_thp = PageTransHuge(page);
> -                     thp_n_pages = thp_nr_pages(page);
> +                     nr_subpages = thp_nr_pages(page);
>                       cond_resched();
> 
>                       if (PageHuge(page))
> @@ -1479,7 +1479,7 @@ int migrate_pages(struct list_head *from, new_page_t 
> get_new_page,
>                               }
>                               if (is_thp) {
>                                       nr_thp_failed++;
> -                                     nr_failed += thp_n_pages;
> +                                     nr_failed += nr_subpages;
>                                       goto out;
>                               }
>                               nr_failed++;
> @@ -1494,7 +1494,7 @@ int migrate_pages(struct list_head *from, new_page_t 
> get_new_page,
>                       case MIGRATEPAGE_SUCCESS:
>                               if (is_thp) {
>                                       nr_thp_succeeded++;
> -                                     nr_succeeded += thp_n_pages;
> +                                     nr_succeeded += nr_subpages;
>                                       break;
>                               }
>                               nr_succeeded++;
> @@ -1508,7 +1508,7 @@ int migrate_pages(struct list_head *from, new_page_t 
> get_new_page,
>                                */
>                               if (is_thp) {
>                                       nr_thp_failed++;
> -                                     nr_failed += thp_n_pages;
> +                                     nr_failed += nr_subpages;
>                                       break;
>                               }
>                               nr_failed++;
> @@ -1520,16 +1520,11 @@ int migrate_pages(struct list_head *from, new_page_t 
> get_new_page,
>       nr_thp_failed += thp_retry;
>       rc = nr_failed;
>  out:
> -     if (nr_succeeded)
> -             count_vm_events(PGMIGRATE_SUCCESS, nr_succeeded);
> -     if (nr_failed)
> -             count_vm_events(PGMIGRATE_FAIL, nr_failed);
> -     if (nr_thp_succeeded)
> -             count_vm_events(THP_MIGRATION_SUCCESS, nr_thp_succeeded);
> -     if (nr_thp_failed)
> -             count_vm_events(THP_MIGRATION_FAILURE, nr_thp_failed);
> -     if (nr_thp_split)
> -             count_vm_events(THP_MIGRATION_SPLIT, nr_thp_split);
> +     count_vm_events(PGMIGRATE_SUCCESS, nr_succeeded);
> +     count_vm_events(PGMIGRATE_FAIL, nr_failed);
> +     count_vm_events(THP_MIGRATION_SUCCESS, nr_thp_succeeded);
> +     count_vm_events(THP_MIGRATION_FAIL, nr_thp_failed);
> +     count_vm_events(THP_MIGRATION_SPLIT, nr_thp_split);
>       trace_mm_migrate_pages(nr_succeeded, nr_failed, nr_thp_succeeded,
>                              nr_thp_failed, nr_thp_split, mode, reason);
> 
> diff --git a/mm/vmstat.c b/mm/vmstat.c
> index 9892090df6a2..a21140373edb 100644
> --- a/mm/vmstat.c
> +++ b/mm/vmstat.c
> @@ -1274,6 +1274,9 @@ const char * const vmstat_text[] = {
>  #ifdef CONFIG_MIGRATION
>       "pgmigrate_success",
>       "pgmigrate_fail",
> +     "thp_migration_success",
> +     "thp_migration_fail",
> +     "thp_migration_split",
>  #endif
>  #ifdef CONFIG_COMPACTION
>       "compact_migrate_scanned",
> @@ -1320,9 +1323,6 @@ const char * const vmstat_text[] = {
>       "thp_zero_page_alloc_failed",
>       "thp_swpout",
>       "thp_swpout_fallback",
> -     "thp_migration_success",
> -     "thp_migration_failure",
> -     "thp_migration_split",
>  #endif
>  #ifdef CONFIG_MEMORY_BALLOON
>       "balloon_inflate",

Hi,

Thanks for the patch.
Works for me.

-- 
~Randy

Reply via email to