mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 08:38:45 +02:00 
			
		
		
		
	mm: stop storing migration_ops in page->mapping
... instead, look them up statically based on the page type. Maybe in the future we want a registration interface? At least for now, it can be easily handled using the two page types that actually support page migration. The remaining usage of page->mapping is to flag such pages as actually being movable (having movable_ops), which we will change next. Link: https://lkml.kernel.org/r/20250704102524.326966-20-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Reviewed-by: Zi Yan <ziy@nvidia.com> Reviewed-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> Reviewed-by: Harry Yoo <harry.yoo@oracle.com> Cc: Alistair Popple <apopple@nvidia.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Brendan Jackman <jackmanb@google.com> Cc: Byungchul Park <byungchul@sk.com> Cc: Chengming Zhou <chengming.zhou@linux.dev> Cc: Christian Brauner <brauner@kernel.org> Cc: Christophe Leroy <christophe.leroy@csgroup.eu> Cc: Eugenio Pé rez <eperezma@redhat.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Gregory Price <gourry@gourry.net> Cc: "Huang, Ying" <ying.huang@linux.alibaba.com> Cc: Jan Kara <jack@suse.cz> Cc: Jason Gunthorpe <jgg@ziepe.ca> Cc: Jason Wang <jasowang@redhat.com> Cc: Jerrin Shaji George <jerrin.shaji-george@broadcom.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Joshua Hahn <joshua.hahnjy@gmail.com> Cc: Liam Howlett <liam.howlett@oracle.com> Cc: Madhavan Srinivasan <maddy@linux.ibm.com> Cc: Mathew Brost <matthew.brost@intel.com> Cc: Matthew Wilcox (Oracle) <willy@infradead.org> Cc: Miaohe Lin <linmiaohe@huawei.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Michal Hocko <mhocko@suse.com> Cc: Mike Rapoport <rppt@kernel.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Naoya Horiguchi <nao.horiguchi@gmail.com> Cc: Nicholas Piggin <npiggin@gmail.com> Cc: Oscar Salvador <osalvador@suse.de> Cc: Peter Xu <peterx@redhat.com> Cc: Qi Zheng <zhengqi.arch@bytedance.com> Cc: Rakie Kim <rakie.kim@sk.com> Cc: Rik van Riel <riel@surriel.com> Cc: Sergey Senozhatsky <senozhatsky@chromium.org> Cc: Shakeel Butt <shakeel.butt@linux.dev> Cc: Suren Baghdasaryan <surenb@google.com> Cc: Vlastimil Babka <vbabka@suse.cz> Cc: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Cc: xu xin <xu.xin16@zte.com.cn> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									457d7b3adb
								
							
						
					
					
						commit
						84caf98838
					
				
					 8 changed files with 35 additions and 25 deletions
				
			
		|  | @ -92,7 +92,7 @@ static inline void balloon_page_insert(struct balloon_dev_info *balloon, | |||
| 				       struct page *page) | ||||
| { | ||||
| 	__SetPageOffline(page); | ||||
| 	__SetPageMovable(page, &balloon_mops); | ||||
| 	__SetPageMovable(page); | ||||
| 	set_page_private(page, (unsigned long)balloon); | ||||
| 	list_add(&page->lru, &balloon->pages); | ||||
| } | ||||
|  |  | |||
|  | @ -104,23 +104,13 @@ static inline int migrate_huge_page_move_mapping(struct address_space *mapping, | |||
| #endif /* CONFIG_MIGRATION */ | ||||
| 
 | ||||
| #ifdef CONFIG_COMPACTION | ||||
| void __SetPageMovable(struct page *page, const struct movable_operations *ops); | ||||
| void __SetPageMovable(struct page *page); | ||||
| #else | ||||
| static inline void __SetPageMovable(struct page *page, | ||||
| 		const struct movable_operations *ops) | ||||
| static inline void __SetPageMovable(struct page *page) | ||||
| { | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| static inline | ||||
| const struct movable_operations *page_movable_ops(struct page *page) | ||||
| { | ||||
| 	VM_WARN_ON_ONCE_PAGE(!page_has_movable_ops(page), page); | ||||
| 
 | ||||
| 	return (const struct movable_operations *) | ||||
| 		((unsigned long)page->mapping - PAGE_MAPPING_MOVABLE); | ||||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_NUMA_BALANCING | ||||
| int migrate_misplaced_folio_prepare(struct folio *folio, | ||||
| 		struct vm_area_struct *vma, int node); | ||||
|  |  | |||
|  | @ -46,4 +46,6 @@ void zs_obj_read_end(struct zs_pool *pool, unsigned long handle, | |||
| void zs_obj_write(struct zs_pool *pool, unsigned long handle, | ||||
| 		  void *handle_mem, size_t mem_len); | ||||
| 
 | ||||
| extern const struct movable_operations zsmalloc_mops; | ||||
| 
 | ||||
| #endif | ||||
|  |  | |||
|  | @ -253,6 +253,5 @@ const struct movable_operations balloon_mops = { | |||
| 	.isolate_page = balloon_page_isolate, | ||||
| 	.putback_page = balloon_page_putback, | ||||
| }; | ||||
| EXPORT_SYMBOL_GPL(balloon_mops); | ||||
| 
 | ||||
| #endif /* CONFIG_BALLOON_COMPACTION */ | ||||
|  |  | |||
|  | @ -114,11 +114,10 @@ static unsigned long release_free_list(struct list_head *freepages) | |||
| } | ||||
| 
 | ||||
| #ifdef CONFIG_COMPACTION | ||||
| void __SetPageMovable(struct page *page, const struct movable_operations *mops) | ||||
| void __SetPageMovable(struct page *page) | ||||
| { | ||||
| 	VM_BUG_ON_PAGE(!PageLocked(page), page); | ||||
| 	VM_BUG_ON_PAGE((unsigned long)mops & PAGE_MAPPING_MOVABLE, page); | ||||
| 	page->mapping = (void *)((unsigned long)mops | PAGE_MAPPING_MOVABLE); | ||||
| 	page->mapping = (void *)(PAGE_MAPPING_MOVABLE); | ||||
| } | ||||
| EXPORT_SYMBOL(__SetPageMovable); | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										23
									
								
								mm/migrate.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								mm/migrate.c
									
									
									
									
									
								
							|  | @ -43,6 +43,8 @@ | |||
| #include <linux/sched/sysctl.h> | ||||
| #include <linux/memory-tiers.h> | ||||
| #include <linux/pagewalk.h> | ||||
| #include <linux/balloon_compaction.h> | ||||
| #include <linux/zsmalloc.h> | ||||
| 
 | ||||
| #include <asm/tlbflush.h> | ||||
| 
 | ||||
|  | @ -51,6 +53,27 @@ | |||
| #include "internal.h" | ||||
| #include "swap.h" | ||||
| 
 | ||||
| static const struct movable_operations *page_movable_ops(struct page *page) | ||||
| { | ||||
| 	VM_WARN_ON_ONCE_PAGE(!page_has_movable_ops(page), page); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * If we enable page migration for a page of a certain type by marking | ||||
| 	 * it as movable, the page type must be sticky until the page gets freed | ||||
| 	 * back to the buddy. | ||||
| 	 */ | ||||
| #ifdef CONFIG_BALLOON_COMPACTION | ||||
| 	if (PageOffline(page)) | ||||
| 		/* Only balloon compaction sets PageOffline pages movable. */ | ||||
| 		return &balloon_mops; | ||||
| #endif /* CONFIG_BALLOON_COMPACTION */ | ||||
| #if defined(CONFIG_ZSMALLOC) && defined(CONFIG_COMPACTION) | ||||
| 	if (PageZsmalloc(page)) | ||||
| 		return &zsmalloc_mops; | ||||
| #endif /* defined(CONFIG_ZSMALLOC) && defined(CONFIG_COMPACTION) */ | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * isolate_movable_ops_page - isolate a movable_ops page for migration | ||||
|  * @page: The page. | ||||
|  |  | |||
|  | @ -152,10 +152,9 @@ static inline struct zpdesc *pfn_zpdesc(unsigned long pfn) | |||
| 	return page_zpdesc(pfn_to_page(pfn)); | ||||
| } | ||||
| 
 | ||||
| static inline void __zpdesc_set_movable(struct zpdesc *zpdesc, | ||||
| 					const struct movable_operations *mops) | ||||
| static inline void __zpdesc_set_movable(struct zpdesc *zpdesc) | ||||
| { | ||||
| 	__SetPageMovable(zpdesc_page(zpdesc), mops); | ||||
| 	__SetPageMovable(zpdesc_page(zpdesc)); | ||||
| } | ||||
| 
 | ||||
| static inline void __zpdesc_set_zsmalloc(struct zpdesc *zpdesc) | ||||
|  |  | |||
|  | @ -1685,8 +1685,6 @@ static void lock_zspage(struct zspage *zspage) | |||
| 
 | ||||
| #ifdef CONFIG_COMPACTION | ||||
| 
 | ||||
| static const struct movable_operations zsmalloc_mops; | ||||
| 
 | ||||
| static void replace_sub_page(struct size_class *class, struct zspage *zspage, | ||||
| 				struct zpdesc *newzpdesc, struct zpdesc *oldzpdesc) | ||||
| { | ||||
|  | @ -1709,7 +1707,7 @@ static void replace_sub_page(struct size_class *class, struct zspage *zspage, | |||
| 	set_first_obj_offset(newzpdesc, first_obj_offset); | ||||
| 	if (unlikely(ZsHugePage(zspage))) | ||||
| 		newzpdesc->handle = oldzpdesc->handle; | ||||
| 	__zpdesc_set_movable(newzpdesc, &zsmalloc_mops); | ||||
| 	__zpdesc_set_movable(newzpdesc); | ||||
| } | ||||
| 
 | ||||
| static bool zs_page_isolate(struct page *page, isolate_mode_t mode) | ||||
|  | @ -1819,7 +1817,7 @@ static void zs_page_putback(struct page *page) | |||
| { | ||||
| } | ||||
| 
 | ||||
| static const struct movable_operations zsmalloc_mops = { | ||||
| const struct movable_operations zsmalloc_mops = { | ||||
| 	.isolate_page = zs_page_isolate, | ||||
| 	.migrate_page = zs_page_migrate, | ||||
| 	.putback_page = zs_page_putback, | ||||
|  | @ -1882,7 +1880,7 @@ static void SetZsPageMovable(struct zs_pool *pool, struct zspage *zspage) | |||
| 
 | ||||
| 	do { | ||||
| 		WARN_ON(!zpdesc_trylock(zpdesc)); | ||||
| 		__zpdesc_set_movable(zpdesc, &zsmalloc_mops); | ||||
| 		__zpdesc_set_movable(zpdesc); | ||||
| 		zpdesc_unlock(zpdesc); | ||||
| 	} while ((zpdesc = get_next_zpdesc(zpdesc)) != NULL); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 David Hildenbrand
						David Hildenbrand