mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-10-31 22:34:33 +01: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/[email protected] Signed-off-by: David Hildenbrand <[email protected]> Reviewed-by: Zi Yan <[email protected]> Reviewed-by: Lorenzo Stoakes <[email protected]> Reviewed-by: Harry Yoo <[email protected]> Cc: Alistair Popple <[email protected]> Cc: Al Viro <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: Brendan Jackman <[email protected]> Cc: Byungchul Park <[email protected]> Cc: Chengming Zhou <[email protected]> Cc: Christian Brauner <[email protected]> Cc: Christophe Leroy <[email protected]> Cc: Eugenio Pé rez <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Cc: Gregory Price <[email protected]> Cc: "Huang, Ying" <[email protected]> Cc: Jan Kara <[email protected]> Cc: Jason Gunthorpe <[email protected]> Cc: Jason Wang <[email protected]> Cc: Jerrin Shaji George <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: John Hubbard <[email protected]> Cc: Jonathan Corbet <[email protected]> Cc: Joshua Hahn <[email protected]> Cc: Liam Howlett <[email protected]> Cc: Madhavan Srinivasan <[email protected]> Cc: Mathew Brost <[email protected]> Cc: Matthew Wilcox (Oracle) <[email protected]> Cc: Miaohe Lin <[email protected]> Cc: Michael Ellerman <[email protected]> Cc: "Michael S. Tsirkin" <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Rapoport <[email protected]> Cc: Minchan Kim <[email protected]> Cc: Naoya Horiguchi <[email protected]> Cc: Nicholas Piggin <[email protected]> Cc: Oscar Salvador <[email protected]> Cc: Peter Xu <[email protected]> Cc: Qi Zheng <[email protected]> Cc: Rakie Kim <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Sergey Senozhatsky <[email protected]> Cc: Shakeel Butt <[email protected]> Cc: Suren Baghdasaryan <[email protected]> Cc: Vlastimil Babka <[email protected]> Cc: Xuan Zhuo <[email protected]> Cc: xu xin <[email protected]> Signed-off-by: Andrew Morton <[email protected]>
This commit is contained in:
1 parent
457d7b3adb
commit
84caf98838
8 files changed
+35
-25
No files matched your search
@@ -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);
|
||||
}
|
||||
|
||||
+2
-12
@@ -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 */
|
||||
+2
-3
@@ -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);
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
+2
-3
@@ -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)
|
||||
|
||||
+3
-5
@@ -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);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user