Re: [PATCH v1 03/11] mm/page_alloc: refactor memmap_init_zone_device() page init

Dan Williams
2021-04-24T00:18:18Z

On Thu, Mar 25, 2021 at 4:10 PM Joao Martins <joao.m.martins@oracle.com> 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.

>
> Signed-off-by: Joao Martins <joao.m.martins@oracle.com>
> ---
> 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