[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <16FFB01F-6F01-4CDC-B3E6-00377A7B6D61@nvidia.com>
Date: Mon, 12 May 2025 12:28:34 -0400
From: Zi Yan <ziy@...dia.com>
To: Lorenzo Stoakes <lorenzo.stoakes@...cle.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()
On 12 May 2025, at 12:19, Lorenzo Stoakes wrote:
> On Mon, May 12, 2025 at 12:13:35PM -0400, Zi Yan wrote:
>> On 12 May 2025, at 12:10, Lorenzo Stoakes wrote:
>>
>>> 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
>>
>> Thanks. I will fix the issue and resend.
>
> Thanks :)
>
> Sorry re-reading the 'please make sure to run mm self tests' comment sounds
> more snarky thank I intended, and I've definitely forgotten to do it
> sometimes myself, but obviously a useful thing to do :P
You got me. I did not run mm self tests for my series, but will do that
from now on. I was using memory hotplug and hotremove to test my series,
but obviously it is not enough.
>
> I wonder if the issue I mention below is related, actually, unless they're
> running your series on top of v6.15-rc5...
I wonder if something else is causing it. The warning is the check of
making sure pageblock migratetype matches the free list movement.
Anyway, let me reply there. A bisect would be helpful.
>
> I pinged there anyway just in case.
>
> Cheers, Lorenzo
>
>>
>>>
>>> (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
>>>>
>>>>
>>>>
>>
>>
>> --
>> Best Regards,
>> Yan, Zi
--
Best Regards,
Yan, Zi
Powered by blists - more mailing lists