lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Thu, 9 Jul 2020 14:24:45 -0700
From:   Randy Dunlap <rdunlap@...radead.org>
To:     Zi Yan <ziy@...dia.com>,
        Anshuman Khandual <anshuman.khandual@....com>,
        Andrew Morton <akpm@...ux-foundation.org>
Cc:     linux-mm@...ck.org, Jonathan Corbet <corbet@....net>,
        Steven Rostedt <rostedt@...dmis.org>,
        Ingo Molnar <mingo@...hat.com>,
        Daniel Jordan <daniel.m.jordan@...cle.com>,
        Hugh Dickins <hughd@...gle.com>,
        Matthew Wilcox <willy@...radead.org>,
        John Hubbard <jhubbard@...dia.com>,
        Naoya Horiguchi <n-horiguchi@...jp.nec.com>,
        linux-doc@...r.kernel.org, linux-kernel@...r.kernel.org
Subject: Re: [PATCH V4] mm/vmstat: Add events for THP migration without split

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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ