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]
Message-ID: <20250115102315.GA4090@system.software.com>
Date: Wed, 15 Jan 2025 19:23:15 +0900
From: Byungchul Park <byungchul@...com>
To: Shivank Garg <shivankg@....com>
Cc: linux-kernel@...r.kernel.org, linux-mm@...ck.org,
	kernel_team@...ynix.com, akpm@...ux-foundation.org, ziy@...dia.com
Subject: Re: [PATCH] mm: separate move/undo parts from migrate_pages_batch()

On Wed, Jan 15, 2025 at 03:37:15PM +0530, Shivank Garg wrote:
> Hi Byungchul,
> 
> On 1/15/2025 3:23 PM, Byungchul Park wrote:
> > Hi,
> > 
> > This is a part of luf(lazy unmap flush) patchset and also referred
> > several times by e.g. Shivank Garg and Zi Yan who are currently working
> > on page migration optimization.  Why don't we take this first so that
> > such a migration optimization tries can use it.
> > 
> > 	Byungchul
> > 
> > --->8---
> > From a65a6e4975962707bf87171e317f005c6276887e Mon Sep 17 00:00:00 2001
> > From: Byungchul Park <byungchul@...com>
> > Date: Thu, 8 Aug 2024 15:53:58 +0900
> > Subject: [PATCH] mm: separate move/undo parts from migrate_pages_batch()
> > 
> > Functionally, no change.  This is a preparation for migration
> > optimization tries that require to use separated folio lists for its own
> > handling during migration.  Refactored migrate_pages_batch() so as to
> > separate move/undo parts from migrate_pages_batch().
> > 
> > Signed-off-by: Byungchul Park <byungchul@...com>
> > ---
> >  mm/migrate.c | 134 +++++++++++++++++++++++++++++++--------------------
> >  1 file changed, 83 insertions(+), 51 deletions(-)
> 
> [...]
> 
> > +		 */
> > +		switch(rc) {
> 		     ^^^
> minor nit here - space after 'switch' before the parentheses.
> This code style issue was present in the original code and was carried
> over during refactoring.

I should've taken more care of it.  Thank you.

	Byungchul

> With this fix, please add-
> Reviewed-by: Shivank Garg <shivankg@....com>
>  
> > +		case -EAGAIN:
> > +			*retry += 1;
> > +			*thp_retry += is_thp;
> > +			*nr_retry_pages += nr_pages;
> > +			break;
> > +		case MIGRATEPAGE_SUCCESS:
> > +			stats->nr_succeeded += nr_pages;
> > +			stats->nr_thp_succeeded += is_thp;
> > +			break;
> > +		default:
> > +			*nr_failed += 1;
> > +			stats->nr_thp_failed += is_thp;
> > +			stats->nr_failed_pages += nr_pages;
> > +			break;
> > +		}
> > +		dst = dst2;
> > +		dst2 = list_next_entry(dst, lru);
> > +	}
> > +}
> > +
> > +static void migrate_folios_undo(struct list_head *src_folios,
> > +		struct list_head *dst_folios,
> > +		free_folio_t put_new_folio, unsigned long private,
> > +		struct list_head *ret_folios)
> > +{
> > +	struct folio *folio, *folio2, *dst, *dst2;
> > +
> > +	dst = list_first_entry(dst_folios, struct folio, lru);
> > +	dst2 = list_next_entry(dst, lru);
> > +	list_for_each_entry_safe(folio, folio2, src_folios, lru) {
> > +		int old_page_state = 0;
> > +		struct anon_vma *anon_vma = NULL;
> > +
> > +		__migrate_folio_extract(dst, &old_page_state, &anon_vma);
> > +		migrate_folio_undo_src(folio, old_page_state & PAGE_WAS_MAPPED,
> > +				anon_vma, true, ret_folios);
> > +		list_del(&dst->lru);
> > +		migrate_folio_undo_dst(dst, true, put_new_folio, private);
> > +		dst = dst2;
> > +		dst2 = list_next_entry(dst, lru);
> > +	}
> > +}
> > +
> >  /*
> >   * migrate_pages_batch() first unmaps folios in the from list as many as
> >   * possible, then move the unmapped folios.
> > @@ -1717,7 +1792,7 @@ static int migrate_pages_batch(struct list_head *from,
> >  	int pass = 0;
> >  	bool is_thp = false;
> >  	bool is_large = false;
> > -	struct folio *folio, *folio2, *dst = NULL, *dst2;
> > +	struct folio *folio, *folio2, *dst = NULL;
> >  	int rc, rc_saved = 0, nr_pages;
> >  	LIST_HEAD(unmap_folios);
> >  	LIST_HEAD(dst_folios);
> > @@ -1888,42 +1963,11 @@ static int migrate_pages_batch(struct list_head *from,
> >  		thp_retry = 0;
> >  		nr_retry_pages = 0;
> >  
> > -		dst = list_first_entry(&dst_folios, struct folio, lru);
> > -		dst2 = list_next_entry(dst, lru);
> > -		list_for_each_entry_safe(folio, folio2, &unmap_folios, lru) {
> > -			is_thp = folio_test_large(folio) && folio_test_pmd_mappable(folio);
> > -			nr_pages = folio_nr_pages(folio);
> > -
> > -			cond_resched();
> > -
> > -			rc = migrate_folio_move(put_new_folio, private,
> > -						folio, dst, mode,
> > -						reason, ret_folios);
> > -			/*
> > -			 * The rules are:
> > -			 *	Success: folio will be freed
> > -			 *	-EAGAIN: stay on the unmap_folios list
> > -			 *	Other errno: put on ret_folios list
> > -			 */
> > -			switch(rc) {
> > -			case -EAGAIN:
> > -				retry++;
> > -				thp_retry += is_thp;
> > -				nr_retry_pages += nr_pages;
> > -				break;
> > -			case MIGRATEPAGE_SUCCESS:
> > -				stats->nr_succeeded += nr_pages;
> > -				stats->nr_thp_succeeded += is_thp;
> > -				break;
> > -			default:
> > -				nr_failed++;
> > -				stats->nr_thp_failed += is_thp;
> > -				stats->nr_failed_pages += nr_pages;
> > -				break;
> > -			}
> > -			dst = dst2;
> > -			dst2 = list_next_entry(dst, lru);
> > -		}
> > +		/* Move the unmapped folios */
> > +		migrate_folios_move(&unmap_folios, &dst_folios,
> > +				put_new_folio, private, mode, reason,
> > +				ret_folios, stats, &retry, &thp_retry,
> > +				&nr_failed, &nr_retry_pages);
> >  	}
> >  	nr_failed += retry;
> >  	stats->nr_thp_failed += thp_retry;
> > @@ -1932,20 +1976,8 @@ static int migrate_pages_batch(struct list_head *from,
> >  	rc = rc_saved ? : nr_failed;
> >  out:
> >  	/* Cleanup remaining folios */
> > -	dst = list_first_entry(&dst_folios, struct folio, lru);
> > -	dst2 = list_next_entry(dst, lru);
> > -	list_for_each_entry_safe(folio, folio2, &unmap_folios, lru) {
> > -		int old_page_state = 0;
> > -		struct anon_vma *anon_vma = NULL;
> > -
> > -		__migrate_folio_extract(dst, &old_page_state, &anon_vma);
> > -		migrate_folio_undo_src(folio, old_page_state & PAGE_WAS_MAPPED,
> > -				       anon_vma, true, ret_folios);
> > -		list_del(&dst->lru);
> > -		migrate_folio_undo_dst(dst, true, put_new_folio, private);
> > -		dst = dst2;
> > -		dst2 = list_next_entry(dst, lru);
> > -	}
> > +	migrate_folios_undo(&unmap_folios, &dst_folios,
> > +			put_new_folio, private, ret_folios);
> >  
> >  	return rc;
> >  }

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ