Commit d1554fb6 authored by Zi Yan's avatar Zi Yan Committed by Andrew Morton
Browse files

mm/page_isolation: remove migratetype parameter from more functions

migratetype is no longer overwritten during pageblock isolation,
start_isolate_page_range(), has_unmovable_pages(), and
set_migratetype_isolate() no longer need which migratetype to restore
during isolation failure.

For has_unmoable_pages(), it needs to know if the isolation is for CMA
allocation, so adding PB_ISOLATE_MODE_CMA_ALLOC provide the information. 
At the same time change isolation flags to enum pb_isolate_mode
(PB_ISOLATE_MODE_MEM_OFFLINE, PB_ISOLATE_MODE_CMA_ALLOC,
PB_ISOLATE_MODE_OTHER).  Remove REPORT_FAILURE and check
PB_ISOLATE_MODE_MEM_OFFLINE, since only PB_ISOLATE_MODE_MEM_OFFLINE
reports isolation failures.

alloc_contig_range() no longer needs migratetype.  Replace it with a newly
defined acr_flags_t to tell if an allocation is for CMA.  So does
__alloc_contig_migrate_range().  Add ACR_FLAGS_NONE (set to 0) to indicate
ordinary allocations.

Link: https://lkml.kernel.org/r/20250617021115.2331563-7-ziy@nvidia.com


Signed-off-by: default avatarZi Yan <ziy@nvidia.com>
Reviewed-by: default avatarVlastimil Babka <vbabka@suse.cz>
Acked-by: default avatarDavid Hildenbrand <david@redhat.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Brendan Jackman <jackmanb@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Kirill A. Shuemov <kirill.shutemov@linux.intel.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Richard Chang <richardycc@google.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 7a3324eb
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1243,7 +1243,7 @@ static int virtio_mem_fake_offline(struct virtio_mem *vm, unsigned long pfn,
		if (atomic_read(&vm->config_changed))
			return -EAGAIN;

		rc = alloc_contig_range(pfn, pfn + nr_pages, MIGRATE_MOVABLE,
		rc = alloc_contig_range(pfn, pfn + nr_pages, ACR_FLAGS_NONE,
					GFP_KERNEL);
		if (rc == -ENOMEM)
			/* whoops, out of memory */
+6 −1
Original line number Diff line number Diff line
@@ -423,9 +423,14 @@ static inline bool gfp_compaction_allowed(gfp_t gfp_mask)
extern gfp_t vma_thp_gfp_mask(struct vm_area_struct *vma);

#ifdef CONFIG_CONTIG_ALLOC

typedef unsigned int __bitwise acr_flags_t;
#define ACR_FLAGS_NONE ((__force acr_flags_t)0) // ordinary allocation request
#define ACR_FLAGS_CMA ((__force acr_flags_t)BIT(0)) // allocate for CMA

/* The below functions must be run on a range from a single zone. */
extern int alloc_contig_range_noprof(unsigned long start, unsigned long end,
			      unsigned migratetype, gfp_t gfp_mask);
				     acr_flags_t alloc_flags, gfp_t gfp_mask);
#define alloc_contig_range(...)			alloc_hooks(alloc_contig_range_noprof(__VA_ARGS__))

extern struct page *alloc_contig_pages_noprof(unsigned long nr_pages, gfp_t gfp_mask,
+16 −4
Original line number Diff line number Diff line
@@ -38,8 +38,20 @@ static inline void set_pageblock_isolate(struct page *page)
}
#endif

#define MEMORY_OFFLINE	0x1
#define REPORT_FAILURE	0x2
/*
 * Pageblock isolation modes:
 * PB_ISOLATE_MODE_MEM_OFFLINE - isolate to offline (!allocate) memory
 *				 e.g., skip over PageHWPoison() pages and
 *				 PageOffline() pages. Unmovable pages will be
 *				 reported in this mode.
 * PB_ISOLATE_MODE_CMA_ALLOC   - isolate for CMA allocations
 * PB_ISOLATE_MODE_OTHER       - isolate for other purposes
 */
enum pb_isolate_mode {
	PB_ISOLATE_MODE_MEM_OFFLINE,
	PB_ISOLATE_MODE_CMA_ALLOC,
	PB_ISOLATE_MODE_OTHER,
};

void __meminit init_pageblock_migratetype(struct page *page,
					  enum migratetype migratetype,
@@ -49,10 +61,10 @@ bool pageblock_isolate_and_move_free_pages(struct zone *zone, struct page *page)
bool pageblock_unisolate_and_move_free_pages(struct zone *zone, struct page *page);

int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn,
			     int migratetype, int flags);
			     enum pb_isolate_mode mode);

void undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn);

int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn,
			int isol_flags);
			enum pb_isolate_mode mode);
#endif
+8 −6
Original line number Diff line number Diff line
@@ -304,6 +304,7 @@ TRACE_EVENT(mm_page_alloc_extfrag,
		__entry->change_ownership)
);

#ifdef CONFIG_CONTIG_ALLOC
TRACE_EVENT(mm_alloc_contig_migrate_range_info,

	TP_PROTO(unsigned long start,
@@ -311,9 +312,9 @@ TRACE_EVENT(mm_alloc_contig_migrate_range_info,
		 unsigned long nr_migrated,
		 unsigned long nr_reclaimed,
		 unsigned long nr_mapped,
		 int migratetype),
		 acr_flags_t alloc_flags),

	TP_ARGS(start, end, nr_migrated, nr_reclaimed, nr_mapped, migratetype),
	TP_ARGS(start, end, nr_migrated, nr_reclaimed, nr_mapped, alloc_flags),

	TP_STRUCT__entry(
		__field(unsigned long, start)
@@ -321,7 +322,7 @@ TRACE_EVENT(mm_alloc_contig_migrate_range_info,
		__field(unsigned long, nr_migrated)
		__field(unsigned long, nr_reclaimed)
		__field(unsigned long, nr_mapped)
		__field(int, migratetype)
		__field(acr_flags_t, alloc_flags)
	),

	TP_fast_assign(
@@ -330,17 +331,18 @@ TRACE_EVENT(mm_alloc_contig_migrate_range_info,
		__entry->nr_migrated = nr_migrated;
		__entry->nr_reclaimed = nr_reclaimed;
		__entry->nr_mapped = nr_mapped;
		__entry->migratetype = migratetype;
		__entry->alloc_flags = alloc_flags;
	),

	TP_printk("start=0x%lx end=0x%lx migratetype=%d nr_migrated=%lu nr_reclaimed=%lu nr_mapped=%lu",
	TP_printk("start=0x%lx end=0x%lx alloc_flags=%d nr_migrated=%lu nr_reclaimed=%lu nr_mapped=%lu",
		  __entry->start,
		  __entry->end,
		  __entry->migratetype,
		  __entry->alloc_flags,
		  __entry->nr_migrated,
		  __entry->nr_reclaimed,
		  __entry->nr_mapped)
);
#endif

TRACE_EVENT(mm_setup_per_zone_wmarks,

+1 −1
Original line number Diff line number Diff line
@@ -822,7 +822,7 @@ static int cma_range_alloc(struct cma *cma, struct cma_memrange *cmr,

		pfn = cmr->base_pfn + (bitmap_no << cma->order_per_bit);
		mutex_lock(&cma->alloc_mutex);
		ret = alloc_contig_range(pfn, pfn + count, MIGRATE_CMA, gfp);
		ret = alloc_contig_range(pfn, pfn + count, ACR_FLAGS_CMA, gfp);
		mutex_unlock(&cma->alloc_mutex);
		if (ret == 0) {
			page = pfn_to_page(pfn);
Loading