From: Mike Rapoport <rppt@kernel.org>
To: Pasha Tatashin <pasha.tatashin@soleen.com>
Cc: akpm@linux-foundation.org, mhocko@suse.com, vbabka@suse.cz,
david@redhat.com, quic_charante@quicinc.com,
lizhe.67@bytedance.com, linux-kernel@vger.kernel.org,
linux-mm@kvack.org
Subject: Re: [PATCH v2] mm/page_ext: init page_ext early if there are no deferred struct pages
Date: Thu, 19 Jan 2023 10:42:45 +0200 [thread overview]
Message-ID: <Y8kChUgGCikoDziP@kernel.org> (raw)
In-Reply-To: <20230118155251.2522985-1-pasha.tatashin@soleen.com>
On Wed, Jan 18, 2023 at 03:52:51PM +0000, Pasha Tatashin wrote:
> page_ext must be initialized after all struct pages are initialized.
> Therefore, page_ext is initialized after page_alloc_init_late(), and
> can optionally be initialized earlier via early_page_ext kernel
> parameter which as a side effect also disables deferred struct pages.
>
> Allow to automatically init page_ext early when there are no deferred
> struct pages in order to be able to use page_ext during kernel boot
> and track for example page allocations early.
>
> Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
Acked-by: Mike Rapoport (IBM) <rppt@kernel.org>
> ---
> include/linux/page_ext.h | 2 ++
> init/main.c | 6 +++---
> mm/page_alloc.c | 6 +++++-
> mm/page_ext.c | 2 +-
> 4 files changed, 11 insertions(+), 5 deletions(-)
>
> Changelog:
> v2: Fixed build issue with CONFIG_PAGE_EXTENSION=n
>
> diff --git a/include/linux/page_ext.h b/include/linux/page_ext.h
> index 67314f648aeb..bc2e39090a1f 100644
> --- a/include/linux/page_ext.h
> +++ b/include/linux/page_ext.h
> @@ -29,6 +29,8 @@ struct page_ext_operations {
> bool need_shared_flags;
> };
>
> +extern bool deferred_struct_pages;
> +
> #ifdef CONFIG_PAGE_EXTENSION
>
> /*
> diff --git a/init/main.c b/init/main.c
> index e1c3911d7c70..64cd2ff051c4 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -855,8 +855,8 @@ static void __init mm_init(void)
> pgtable_init();
> debug_objects_mem_init();
> vmalloc_init();
> - /* Should be run after vmap initialization */
> - if (early_page_ext_enabled())
> + /* If no deferred init page_ext now, as vmap is fully initialized */
> + if (!deferred_struct_pages)
> page_ext_init();
> /* Should be run before the first non-init thread is created */
> init_espfix_bsp();
> @@ -1628,7 +1628,7 @@ static noinline void __init kernel_init_freeable(void)
> padata_init();
> page_alloc_init_late();
> /* Initialize page ext after all struct pages are initialized. */
> - if (!early_page_ext_enabled())
> + if (deferred_struct_pages)
> page_ext_init();
>
> do_basic_setup();
> diff --git a/mm/page_alloc.c b/mm/page_alloc.c
> index 99ebb08dc3f2..717f12e83b85 100644
> --- a/mm/page_alloc.c
> +++ b/mm/page_alloc.c
> @@ -430,6 +430,8 @@ EXPORT_SYMBOL(nr_online_nodes);
>
> int page_group_by_mobility_disabled __read_mostly;
>
> +bool deferred_struct_pages __meminitdata;
> +
> #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
> /*
> * During boot we initialize deferred pages on-demand, as needed, but once
> @@ -6803,8 +6805,10 @@ void __meminit memmap_init_range(unsigned long size, int nid, unsigned long zone
> if (context == MEMINIT_EARLY) {
> if (overlap_memmap_init(zone, &pfn))
> continue;
> - if (defer_init(nid, pfn, zone_end_pfn))
> + if (defer_init(nid, pfn, zone_end_pfn)) {
> + deferred_struct_pages = true;
> break;
> + }
> }
>
> page = pfn_to_page(pfn);
> diff --git a/mm/page_ext.c b/mm/page_ext.c
> index e2c22ffdbb81..dc1626be458b 100644
> --- a/mm/page_ext.c
> +++ b/mm/page_ext.c
> @@ -92,7 +92,7 @@ unsigned long page_ext_size;
> static unsigned long total_usage;
> static struct page_ext *lookup_page_ext(const struct page *page);
>
> -bool early_page_ext;
> +bool early_page_ext __meminitdata;
> static int __init setup_early_page_ext(char *str)
> {
> early_page_ext = true;
> --
> 2.39.0.314.g84b9a713c41-goog
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2023-01-19 8:43 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-18 15:52 [PATCH v2] mm/page_ext: init page_ext early if there are no deferred struct pages Pasha Tatashin
2023-01-19 8:42 ` Mike Rapoport [this message]
2023-01-24 10:49 ` Vlastimil Babka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y8kChUgGCikoDziP@kernel.org \
--to=rppt@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lizhe.67@bytedance.com \
--cc=mhocko@suse.com \
--cc=pasha.tatashin@soleen.com \
--cc=quic_charante@quicinc.com \
--cc=vbabka@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.