On 4/24/21 1:18 AM, Dan Williams wrote: > On Thu, Mar 25, 2021 at 4:10 PM Joao Martins <joao.m.martins@xxxxxxxxxx> wrote: >> >> Move struct page init to an helper function __init_zone_device_page(). > > Same sentence addition suggestion from the last patch to make this > patch have some rationale for existing. > I have fixed this too, with the same message as the previous patch. >> >> Signed-off-by: Joao Martins <joao.m.martins@xxxxxxxxxx> >> --- >> mm/page_alloc.c | 74 +++++++++++++++++++++++++++---------------------- >> 1 file changed, 41 insertions(+), 33 deletions(-) >> >> diff --git a/mm/page_alloc.c b/mm/page_alloc.c >> index 43dd98446b0b..58974067bbd4 100644 >> --- a/mm/page_alloc.c >> +++ b/mm/page_alloc.c >> @@ -6237,6 +6237,46 @@ void __meminit memmap_init_range(unsigned long size, int nid, unsigned long zone >> } >> >> #ifdef CONFIG_ZONE_DEVICE >> +static void __ref __init_zone_device_page(struct page *page, unsigned long pfn, >> + unsigned long zone_idx, int nid, >> + struct dev_pagemap *pgmap) >> +{ >> + >> + __init_single_page(page, pfn, zone_idx, nid); >> + >> + /* >> + * Mark page reserved as it will need to wait for onlining >> + * phase for it to be fully associated with a zone. >> + * >> + * We can use the non-atomic __set_bit operation for setting >> + * the flag as we are still initializing the pages. >> + */ >> + __SetPageReserved(page); >> + >> + /* >> + * ZONE_DEVICE pages union ->lru with a ->pgmap back pointer >> + * and zone_device_data. It is a bug if a ZONE_DEVICE page is >> + * ever freed or placed on a driver-private list. >> + */ >> + page->pgmap = pgmap; >> + page->zone_device_data = NULL; >> + >> + /* >> + * Mark the block movable so that blocks are reserved for >> + * movable at startup. This will force kernel allocations >> + * to reserve their blocks rather than leaking throughout >> + * the address space during boot when many long-lived >> + * kernel allocations are made. >> + * >> + * Please note that MEMINIT_HOTPLUG path doesn't clear memmap >> + * because this is done early in section_activate() >> + */ >> + if (IS_ALIGNED(pfn, pageblock_nr_pages)) { >> + set_pageblock_migratetype(page, MIGRATE_MOVABLE); >> + cond_resched(); >> + } >> +} >> + >> void __ref memmap_init_zone_device(struct zone *zone, >> unsigned long start_pfn, >> unsigned long nr_pages, >> @@ -6265,39 +6305,7 @@ void __ref memmap_init_zone_device(struct zone *zone, >> for (pfn = start_pfn; pfn < end_pfn; pfn++) { >> struct page *page = pfn_to_page(pfn); >> >> - __init_single_page(page, pfn, zone_idx, nid); >> - >> - /* >> - * Mark page reserved as it will need to wait for onlining >> - * phase for it to be fully associated with a zone. >> - * >> - * We can use the non-atomic __set_bit operation for setting >> - * the flag as we are still initializing the pages. >> - */ >> - __SetPageReserved(page); >> - >> - /* >> - * ZONE_DEVICE pages union ->lru with a ->pgmap back pointer >> - * and zone_device_data. It is a bug if a ZONE_DEVICE page is >> - * ever freed or placed on a driver-private list. >> - */ >> - page->pgmap = pgmap; >> - page->zone_device_data = NULL; >> - >> - /* >> - * Mark the block movable so that blocks are reserved for >> - * movable at startup. This will force kernel allocations >> - * to reserve their blocks rather than leaking throughout >> - * the address space during boot when many long-lived >> - * kernel allocations are made. >> - * >> - * Please note that MEMINIT_HOTPLUG path doesn't clear memmap >> - * because this is done early in section_activate() >> - */ >> - if (IS_ALIGNED(pfn, pageblock_nr_pages)) { >> - set_pageblock_migratetype(page, MIGRATE_MOVABLE); >> - cond_resched(); >> - } >> + __init_zone_device_page(page, pfn, zone_idx, nid, pgmap); >> } >> >> pr_info("%s initialised %lu pages in %ums\n", __func__, >> -- >> 2.17.1 >>