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: <ef5f6776-b405-48e8-9fa9-c56af392bc4f@lucifer.local>
Date: Mon, 12 May 2025 17:10:56 +0100
From: Lorenzo Stoakes <lorenzo.stoakes@...cle.com>
To: Zi Yan <ziy@...dia.com>
Cc: David Hildenbrand <david@...hat.com>, Oscar Salvador <osalvador@...e.de>,
        Johannes Weiner <hannes@...xchg.org>, linux-mm@...ck.org,
        Andrew Morton <akpm@...ux-foundation.org>,
        Vlastimil Babka <vbabka@...e.cz>,
        Baolin Wang <baolin.wang@...ux.alibaba.com>,
        "Kirill A . Shutemov" <kirill.shutemov@...ux.intel.com>,
        Mel Gorman <mgorman@...hsingularity.net>,
        Suren Baghdasaryan <surenb@...gle.com>, Michal Hocko <mhocko@...e.com>,
        Brendan Jackman <jackmanb@...gle.com>,
        Richard Chang <richardycc@...gle.com>, linux-kernel@...r.kernel.org,
        Harry Yoo <harry.yoo@...cle.com>
Subject: Re: [PATCH v4 2/4] mm/page_isolation: remove migratetype from
 move_freepages_block_isolate()

Andrew - please drop this series, it's broken in mm-new.

Zi - (as kernel bot reports actually!) I bisected a kernel splat to this
commit, triggerred by the mm/transhuge-stress test (please make sure to run
mm self tests before submitting series :)

You can trigger it manually with:

./transhuge-stress -d 20

(The same invocation run_vmtest.sh uses).

Note that this was reported in [0] (thanks to Harry Yoo for pointing this
out to me off-list! :)

[0]: https://lore.kernel.org/linux-mm/87wmalyktd.fsf@linux.ibm.com/T/#u

The decoded splat (at this commit in mm-new):

[   55.835700] ------------[ cut here ]------------
[   55.835705] page type is 0, passed migratetype is 2 (nr=32)
[   55.835720] WARNING: CPU: 2 PID: 288 at mm/page_alloc.c:727 move_to_free_list (mm/page_alloc.c:727 (discriminator 16))
[   55.835734] Modules linked in:
[   55.835739] Tainted: [W]=WARN
[   55.835740] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Arch Linux 1.16.3-1-1 04/01/2014
[   55.835741] RIP: 0010:move_to_free_list (mm/page_alloc.c:727 (discriminator 16))
[ 55.835742] Code: e9 fe ff ff c6 05 f1 9b 7b 01 01 90 48 89 ef e8 11 d7 ff ff 44 89 e1 44 89 ea 48 c7 c7 58 dc 70 82 48 89 c6 e8 1c e3 e0 ff 90 <0f> 0b 90 90 e9 ba fe ff ff 66 90 90 90 90 90 90 90 90 90 90 90 90
All code
========
   0:	e9 fe ff ff c6       	jmp    0xffffffffc7000003
   5:	05 f1 9b 7b 01       	add    $0x17b9bf1,%eax
   a:	01 90 48 89 ef e8    	add    %edx,-0x171076b8(%rax)
  10:	11 d7                	adc    %edx,%edi
  12:	ff                   	(bad)
  13:	ff 44 89 e1          	incl   -0x1f(%rcx,%rcx,4)
  17:	44 89 ea             	mov    %r13d,%edx
  1a:	48 c7 c7 58 dc 70 82 	mov    $0xffffffff8270dc58,%rdi
  21:	48 89 c6             	mov    %rax,%rsi
  24:	e8 1c e3 e0 ff       	call   0xffffffffffe0e345
  29:	90                   	nop
  2a:*	0f 0b                	ud2		<-- trapping instruction
  2c:	90                   	nop
  2d:	90                   	nop
  2e:	e9 ba fe ff ff       	jmp    0xfffffffffffffeed
  33:	66 90                	xchg   %ax,%ax
  35:	90                   	nop
  36:	90                   	nop
  37:	90                   	nop
  38:	90                   	nop
  39:	90                   	nop
  3a:	90                   	nop
  3b:	90                   	nop
  3c:	90                   	nop
  3d:	90                   	nop
  3e:	90                   	nop
  3f:	90                   	nop

Code starting with the faulting instruction
===========================================
   0:	0f 0b                	ud2
   2:	90                   	nop
   3:	90                   	nop
   4:	e9 ba fe ff ff       	jmp    0xfffffffffffffec3
   9:	66 90                	xchg   %ax,%ax
   b:	90                   	nop
   c:	90                   	nop
   d:	90                   	nop
   e:	90                   	nop
   f:	90                   	nop
  10:	90                   	nop
  11:	90                   	nop
  12:	90                   	nop
  13:	90                   	nop
  14:	90                   	nop
  15:	90                   	nop
[   55.835743] RSP: 0018:ffffc900004eba20 EFLAGS: 00010086
[   55.835744] RAX: 000000000000002f RBX: ffff88826cccb080 RCX: 0000000000000027
[   55.835745] RDX: ffff888263d17b08 RSI: 0000000000000001 RDI: ffff888263d17b00
[   55.835746] RBP: ffffea0005fe0000 R08: 00000000ffffdfff R09: ffffffff82b16528
[   55.835746] R10: 80000000ffffe000 R11: 00000000ffffe000 R12: 0000000000000020
[   55.835746] R13: 0000000000000002 R14: 0000000000000001 R15: 0000000000000005
[   55.835750] FS:  00007fef6a06a740(0000) GS:ffff8882e08a0000(0000) knlGS:0000000000000000
[   55.835751] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   55.835751] CR2: 00007fee20c00000 CR3: 0000000179321000 CR4: 0000000000750ef0
[   55.835751] PKRU: 55555554
[   55.835752] Call Trace:
[   55.835755]  <TASK>
[   55.835756] __move_freepages_block (mm/page_alloc.c:1849)
[   55.835758] try_to_claim_block (mm/page_alloc.c:452 (discriminator 3) mm/page_alloc.c:2231 (discriminator 3))
[   55.835759] __rmqueue_pcplist (mm/page_alloc.c:2287 mm/page_alloc.c:2383 mm/page_alloc.c:2422 mm/page_alloc.c:3140)
[   55.835760] get_page_from_freelist (./include/linux/spinlock.h:391 mm/page_alloc.c:3183 mm/page_alloc.c:3213 mm/page_alloc.c:3739)
[   55.835761] __alloc_frozen_pages_noprof (mm/page_alloc.c:5032)
[   55.835763] ? __blk_flush_plug (block/blk-core.c:1227 (discriminator 2))
[   55.835766] alloc_pages_mpol (mm/mempolicy.c:2413)
[   55.835768] vma_alloc_folio_noprof (mm/mempolicy.c:2432 mm/mempolicy.c:2465)
[   55.835769] ? __pte_alloc (mm/memory.c:444)
[   55.835771] do_anonymous_page (mm/memory.c:1064 (discriminator 4) mm/memory.c:4982 (discriminator 4) mm/memory.c:5039 (discriminator 4))
[   55.835772] ? do_huge_pmd_anonymous_page (mm/huge_memory.c:1226 mm/huge_memory.c:1372)
[   55.835774] __handle_mm_fault (mm/memory.c:4197 mm/memory.c:6038 mm/memory.c:6181)
[   55.835776] handle_mm_fault (mm/memory.c:6350)
[   55.835777] do_user_addr_fault (arch/x86/mm/fault.c:1338)
[   55.835779] exc_page_fault (./arch/x86/include/asm/irqflags.h:37 ./arch/x86/include/asm/irqflags.h:114 arch/x86/mm/fault.c:1488 arch/x86/mm/fault.c:1538)
[   55.835783] asm_exc_page_fault (./arch/x86/include/asm/idtentry.h:623)
[   55.835785] RIP: 0033:0x403824
[ 55.835786] Code: e0 0f 85 7c 01 00 00 ba 0e 00 00 00 be 00 00 20 00 48 89 c7 48 89 c3 e8 4a ea ff ff 85 c0 0f 85 51 01 00 00 8b 0d b4 49 00 00 <48> 89 1b 85 c9 0f 84 b1 00 00 00 83 e9 03 48 89 e6 ba 10 00 00 00
All code
========
   0:	e0 0f                	loopne 0x11
   2:	85 7c 01 00          	test   %edi,0x0(%rcx,%rax,1)
   6:	00 ba 0e 00 00 00    	add    %bh,0xe(%rdx)
   c:	be 00 00 20 00       	mov    $0x200000,%esi
  11:	48 89 c7             	mov    %rax,%rdi
  14:	48 89 c3             	mov    %rax,%rbx
  17:	e8 4a ea ff ff       	call   0xffffffffffffea66
  1c:	85 c0                	test   %eax,%eax
  1e:	0f 85 51 01 00 00    	jne    0x175
  24:	8b 0d b4 49 00 00    	mov    0x49b4(%rip),%ecx        # 0x49de
  2a:*	48 89 1b             	mov    %rbx,(%rbx)		<-- trapping instruction
  2d:	85 c9                	test   %ecx,%ecx
  2f:	0f 84 b1 00 00 00    	je     0xe6
  35:	83 e9 03             	sub    $0x3,%ecx
  38:	48 89 e6             	mov    %rsp,%rsi
  3b:	ba 10 00 00 00       	mov    $0x10,%edx

Code starting with the faulting instruction
===========================================
   0:	48 89 1b             	mov    %rbx,(%rbx)
   3:	85 c9                	test   %ecx,%ecx
   5:	0f 84 b1 00 00 00    	je     0xbc
   b:	83 e9 03             	sub    $0x3,%ecx
   e:	48 89 e6             	mov    %rsp,%rsi
  11:	ba 10 00 00 00       	mov    $0x10,%edx
[   55.835786] RSP: 002b:00007ffd50b1e550 EFLAGS: 00010246
[   55.835787] RAX: 0000000000000000 RBX: 00007fee20c00000 RCX: 000000000000000c
[   55.835787] RDX: 000000000000000e RSI: 0000000000200000 RDI: 00007fee20c00000
[   55.835788] RBP: 0000000000000003 R08: 00000000ffffffff R09: 0000000000000000
[   55.835788] R10: 0000000000004032 R11: 0000000000000246 R12: 00007fee20c00000
[   55.835788] R13: 00007fef6a000000 R14: 00000000323ca6b0 R15: 0000000000000fd2
[   55.835789]  </TASK>
[   55.835789] ---[ end trace 0000000000000000 ]---


On Fri, May 09, 2025 at 04:01:09PM -0400, Zi Yan wrote:
> Since migratetype is no longer overwritten during pageblock isolation,
> moving pageblocks to and from MIGRATE_ISOLATE no longer needs migratetype.
>
> Add MIGRATETYPE_NO_ISO_MASK to allow read before-isolation migratetype
> when a pageblock is isolated. It is used by move_freepages_block_isolate().
>
> Add pageblock_isolate_and_move_free_pages() and
> pageblock_unisolate_and_move_free_pages() to be explicit about the page
> isolation operations. Both share the common code in
> __move_freepages_block_isolate(), which is renamed from
> move_freepages_block_isolate().
>
> Make set_pageblock_migratetype() only accept non MIGRATE_ISOLATE types,
> so that one should use set_pageblock_isolate() to isolate pageblocks.
>
> Two consequential changes:
> 1. move pageblock migratetype code out of __move_freepages_block().
> 2. in online_pages() from mm/memory_hotplug.c, move_pfn_range_to_zone() is
>    called with MIGRATE_MOVABLE instead of MIGRATE_ISOLATE and all affected
>    pageblocks are isolated afterwards. Otherwise, all online pageblocks
>    will have non-determined migratetype.
>
> Signed-off-by: Zi Yan <ziy@...dia.com>
> ---
>  include/linux/mmzone.h         |  4 +-
>  include/linux/page-isolation.h |  5 ++-
>  mm/memory_hotplug.c            |  7 +++-
>  mm/page_alloc.c                | 73 +++++++++++++++++++++++++---------
>  mm/page_isolation.c            | 27 ++++++++-----
>  5 files changed, 82 insertions(+), 34 deletions(-)
>
> diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
> index 7ef01fe148ce..f66895456974 100644
> --- a/include/linux/mmzone.h
> +++ b/include/linux/mmzone.h
> @@ -107,8 +107,10 @@ static inline bool migratetype_is_mergeable(int mt)
>  extern int page_group_by_mobility_disabled;
>
>  #ifdef CONFIG_MEMORY_ISOLATION
> -#define MIGRATETYPE_MASK ((BIT(PB_migratetype_bits) - 1) | PB_migrate_isolate_bit)
> +#define MIGRATETYPE_NO_ISO_MASK (BIT(PB_migratetype_bits) - 1)
> +#define MIGRATETYPE_MASK (MIGRATETYPE_NO_ISO_MASK | PB_migrate_isolate_bit)
>  #else
> +#define MIGRATETYPE_NO_ISO_MASK MIGRATETYPE_MASK
>  #define MIGRATETYPE_MASK (BIT(PB_migratetype_bits) - 1)
>  #endif
>
> diff --git a/include/linux/page-isolation.h b/include/linux/page-isolation.h
> index 898bb788243b..b0a2af0a5357 100644
> --- a/include/linux/page-isolation.h
> +++ b/include/linux/page-isolation.h
> @@ -26,9 +26,10 @@ static inline bool is_migrate_isolate(int migratetype)
>  #define REPORT_FAILURE	0x2
>
>  void set_pageblock_migratetype(struct page *page, int migratetype);
> +void set_pageblock_isolate(struct page *page);
>
> -bool move_freepages_block_isolate(struct zone *zone, struct page *page,
> -				  int migratetype);
> +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);
> diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
> index b1caedbade5b..c86c47bba019 100644
> --- a/mm/memory_hotplug.c
> +++ b/mm/memory_hotplug.c
> @@ -1178,6 +1178,7 @@ int online_pages(unsigned long pfn, unsigned long nr_pages,
>  	const int nid = zone_to_nid(zone);
>  	int ret;
>  	struct memory_notify arg;
> +	unsigned long isol_pfn;
>
>  	/*
>  	 * {on,off}lining is constrained to full memory sections (or more
> @@ -1192,7 +1193,11 @@ int online_pages(unsigned long pfn, unsigned long nr_pages,
>
>
>  	/* associate pfn range with the zone */
> -	move_pfn_range_to_zone(zone, pfn, nr_pages, NULL, MIGRATE_ISOLATE);
> +	move_pfn_range_to_zone(zone, pfn, nr_pages, NULL, MIGRATE_MOVABLE);
> +	for (isol_pfn = pfn;
> +	     isol_pfn < pfn + nr_pages;
> +	     isol_pfn += pageblock_nr_pages)
> +		set_pageblock_isolate(pfn_to_page(isol_pfn));
>
>  	arg.start_pfn = pfn;
>  	arg.nr_pages = nr_pages;
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 04e301fb4879..cfd37b2d992e 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -454,11 +454,9 @@ void set_pageblock_migratetype(struct page *page, int migratetype)
>  		migratetype = MIGRATE_UNMOVABLE;
>
>  #ifdef CONFIG_MEMORY_ISOLATION
> -	if (migratetype == MIGRATE_ISOLATE) {
> -		set_pfnblock_flags_mask(page, PB_migrate_isolate_bit,
> -				page_to_pfn(page), PB_migrate_isolate_bit);
> -		return;
> -	}
> +	VM_WARN(migratetype == MIGRATE_ISOLATE,
> +			"Use set_pageblock_isolate() for pageblock isolation");
> +	return;
>  #endif
>  	set_pfnblock_flags_mask(page, (unsigned long)migratetype,
>  				page_to_pfn(page), MIGRATETYPE_MASK);
> @@ -1819,8 +1817,8 @@ static inline struct page *__rmqueue_cma_fallback(struct zone *zone,
>  #endif
>
>  /*
> - * Change the type of a block and move all its free pages to that
> - * type's freelist.
> + * Move all free pages of a block to new type's freelist. Caller needs to
> + * change the block type.
>   */
>  static int __move_freepages_block(struct zone *zone, unsigned long start_pfn,
>  				  int old_mt, int new_mt)
> @@ -1852,8 +1850,6 @@ static int __move_freepages_block(struct zone *zone, unsigned long start_pfn,
>  		pages_moved += 1 << order;
>  	}
>
> -	set_pageblock_migratetype(pfn_to_page(start_pfn), new_mt);
> -
>  	return pages_moved;
>  }
>
> @@ -1911,11 +1907,16 @@ static int move_freepages_block(struct zone *zone, struct page *page,
>  				int old_mt, int new_mt)
>  {
>  	unsigned long start_pfn;
> +	int res;
>
>  	if (!prep_move_freepages_block(zone, page, &start_pfn, NULL, NULL))
>  		return -1;
>
> -	return __move_freepages_block(zone, start_pfn, old_mt, new_mt);
> +	res = __move_freepages_block(zone, start_pfn, old_mt, new_mt);
> +	set_pageblock_migratetype(pfn_to_page(start_pfn), new_mt);
> +
> +	return res;
> +
>  }
>
>  #ifdef CONFIG_MEMORY_ISOLATION
> @@ -1943,11 +1944,17 @@ static unsigned long find_large_buddy(unsigned long start_pfn)
>  	return start_pfn;
>  }
>
> +static inline void toggle_pageblock_isolate(struct page *page, bool isolate)
> +{
> +	set_pfnblock_flags_mask(page, (isolate << PB_migrate_isolate),
> +			page_to_pfn(page), PB_migrate_isolate_bit);
> +}
> +
>  /**
> - * move_freepages_block_isolate - move free pages in block for page isolation
> + * __move_freepages_block_isolate - move free pages in block for page isolation
>   * @zone: the zone
>   * @page: the pageblock page
> - * @migratetype: migratetype to set on the pageblock
> + * @isolate: to isolate the given pageblock or unisolate it
>   *
>   * This is similar to move_freepages_block(), but handles the special
>   * case encountered in page isolation, where the block of interest
> @@ -1962,10 +1969,15 @@ static unsigned long find_large_buddy(unsigned long start_pfn)
>   *
>   * Returns %true if pages could be moved, %false otherwise.
>   */
> -bool move_freepages_block_isolate(struct zone *zone, struct page *page,
> -				  int migratetype)
> +static bool __move_freepages_block_isolate(struct zone *zone,
> +		struct page *page, bool isolate)
>  {
>  	unsigned long start_pfn, pfn;
> +	int from_mt;
> +	int to_mt;
> +
> +	if (isolate == (get_pageblock_migratetype(page) == MIGRATE_ISOLATE))
> +		return false;
>
>  	if (!prep_move_freepages_block(zone, page, &start_pfn, NULL, NULL))
>  		return false;
> @@ -1982,7 +1994,7 @@ bool move_freepages_block_isolate(struct zone *zone, struct page *page,
>
>  		del_page_from_free_list(buddy, zone, order,
>  					get_pfnblock_migratetype(buddy, pfn));
> -		set_pageblock_migratetype(page, migratetype);
> +		toggle_pageblock_isolate(page, isolate);
>  		split_large_buddy(zone, buddy, pfn, order, FPI_NONE);
>  		return true;
>  	}
> @@ -1993,16 +2005,38 @@ bool move_freepages_block_isolate(struct zone *zone, struct page *page,
>
>  		del_page_from_free_list(page, zone, order,
>  					get_pfnblock_migratetype(page, pfn));
> -		set_pageblock_migratetype(page, migratetype);
> +		toggle_pageblock_isolate(page, isolate);
>  		split_large_buddy(zone, page, pfn, order, FPI_NONE);
>  		return true;
>  	}
>  move:
> -	__move_freepages_block(zone, start_pfn,
> -			       get_pfnblock_migratetype(page, start_pfn),
> -			       migratetype);
> +	/* use MIGRATETYPE_NO_ISO_MASK to get the non-isolate migratetype */
> +	if (isolate) {
> +		from_mt = get_pfnblock_flags_mask(page, page_to_pfn(page),
> +				MIGRATETYPE_NO_ISO_MASK);
> +		to_mt = MIGRATE_ISOLATE;
> +	} else {
> +		from_mt = MIGRATE_ISOLATE;
> +		to_mt = get_pfnblock_flags_mask(page, page_to_pfn(page),
> +				MIGRATETYPE_NO_ISO_MASK);
> +	}
> +
> +	__move_freepages_block(zone, start_pfn, from_mt, to_mt);
> +	toggle_pageblock_isolate(pfn_to_page(start_pfn), isolate);
> +
>  	return true;
>  }
> +
> +bool pageblock_isolate_and_move_free_pages(struct zone *zone, struct page *page)
> +{
> +	return __move_freepages_block_isolate(zone, page, true);
> +}
> +
> +bool pageblock_unisolate_and_move_free_pages(struct zone *zone, struct page *page)
> +{
> +	return __move_freepages_block_isolate(zone, page, false);
> +}
> +
>  #endif /* CONFIG_MEMORY_ISOLATION */
>
>  static void change_pageblock_range(struct page *pageblock_page,
> @@ -2194,6 +2228,7 @@ try_to_claim_block(struct zone *zone, struct page *page,
>  	if (free_pages + alike_pages >= (1 << (pageblock_order-1)) ||
>  			page_group_by_mobility_disabled) {
>  		__move_freepages_block(zone, start_pfn, block_type, start_type);
> +		set_pageblock_migratetype(pfn_to_page(start_pfn), start_type);
>  		return __rmqueue_smallest(zone, order, start_type);
>  	}
>
> diff --git a/mm/page_isolation.c b/mm/page_isolation.c
> index 751e21f6d85e..4571940f14db 100644
> --- a/mm/page_isolation.c
> +++ b/mm/page_isolation.c
> @@ -25,6 +25,12 @@ static inline void clear_pageblock_isolate(struct page *page)
>  	set_pfnblock_flags_mask(page, 0, page_to_pfn(page),
>  			PB_migrate_isolate_bit);
>  }
> +void set_pageblock_isolate(struct page *page)
> +{
> +	set_pfnblock_flags_mask(page, PB_migrate_isolate_bit,
> +			page_to_pfn(page),
> +			PB_migrate_isolate_bit);
> +}
>
>  /*
>   * This function checks whether the range [start_pfn, end_pfn) includes
> @@ -199,7 +205,7 @@ static int set_migratetype_isolate(struct page *page, int migratetype, int isol_
>  	unmovable = has_unmovable_pages(check_unmovable_start, check_unmovable_end,
>  			migratetype, isol_flags);
>  	if (!unmovable) {
> -		if (!move_freepages_block_isolate(zone, page, MIGRATE_ISOLATE)) {
> +		if (!pageblock_isolate_and_move_free_pages(zone, page)) {
>  			spin_unlock_irqrestore(&zone->lock, flags);
>  			return -EBUSY;
>  		}
> @@ -220,7 +226,7 @@ static int set_migratetype_isolate(struct page *page, int migratetype, int isol_
>  	return -EBUSY;
>  }
>
> -static void unset_migratetype_isolate(struct page *page, int migratetype)
> +static void unset_migratetype_isolate(struct page *page)
>  {
>  	struct zone *zone;
>  	unsigned long flags;
> @@ -273,10 +279,10 @@ static void unset_migratetype_isolate(struct page *page, int migratetype)
>  		 * Isolating this block already succeeded, so this
>  		 * should not fail on zone boundaries.
>  		 */
> -		WARN_ON_ONCE(!move_freepages_block_isolate(zone, page, migratetype));
> +		WARN_ON_ONCE(!pageblock_unisolate_and_move_free_pages(zone, page));
>  	} else {
> -		set_pageblock_migratetype(page, migratetype);
> -		__putback_isolated_page(page, order, migratetype);
> +		clear_pageblock_isolate(page);
> +		__putback_isolated_page(page, order, get_pageblock_migratetype(page));
>  	}
>  	zone->nr_isolate_pageblock--;
>  out:
> @@ -394,7 +400,7 @@ static int isolate_single_pageblock(unsigned long boundary_pfn, int flags,
>  		if (PageBuddy(page)) {
>  			int order = buddy_order(page);
>
> -			/* move_freepages_block_isolate() handled this */
> +			/* pageblock_isolate_and_move_free_pages() handled this */
>  			VM_WARN_ON_ONCE(pfn + (1 << order) > boundary_pfn);
>
>  			pfn += 1UL << order;
> @@ -444,7 +450,7 @@ static int isolate_single_pageblock(unsigned long boundary_pfn, int flags,
>  failed:
>  	/* restore the original migratetype */
>  	if (!skip_isolation)
> -		unset_migratetype_isolate(pfn_to_page(isolate_pageblock), migratetype);
> +		unset_migratetype_isolate(pfn_to_page(isolate_pageblock));
>  	return -EBUSY;
>  }
>
> @@ -515,7 +521,7 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn,
>  	ret = isolate_single_pageblock(isolate_end, flags, true,
>  			skip_isolation, migratetype);
>  	if (ret) {
> -		unset_migratetype_isolate(pfn_to_page(isolate_start), migratetype);
> +		unset_migratetype_isolate(pfn_to_page(isolate_start));
>  		return ret;
>  	}
>
> @@ -528,8 +534,7 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn,
>  					start_pfn, end_pfn)) {
>  			undo_isolate_page_range(isolate_start, pfn, migratetype);
>  			unset_migratetype_isolate(
> -				pfn_to_page(isolate_end - pageblock_nr_pages),
> -				migratetype);
> +				pfn_to_page(isolate_end - pageblock_nr_pages));
>  			return -EBUSY;
>  		}
>  	}
> @@ -559,7 +564,7 @@ void undo_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn,
>  		page = __first_valid_page(pfn, pageblock_nr_pages);
>  		if (!page || !is_migrate_isolate_page(page))
>  			continue;
> -		unset_migratetype_isolate(page, migratetype);
> +		unset_migratetype_isolate(page);
>  	}
>  }
>  /*
> --
> 2.47.2
>
>
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ