lkml.org 
[lkml]   [2020]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH V4] mm/vmstat: Add events for THP migration without split
From
Date
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

\
 
 \ /
  Last update: 2020-07-09 23:25    [W:0.120 / U:0.040 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site