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 v4] mm/page_ext: Do not allocate space for page_ext->flags if not needed
Date: Wed, 18 Jan 2023 07:53:32 +0200 [thread overview]
Message-ID: <Y8eJXOgKQfrmzeDi@kernel.org> (raw)
In-Reply-To: <20230117202103.1412449-1-pasha.tatashin@soleen.com>
On Tue, Jan 17, 2023 at 08:21:03PM +0000, Pasha Tatashin wrote:
> There is 8 byte page_ext->flags field allocated per page whenever
> CONFIG_PAGE_EXTENSION is enabled. However, not every user of page_ext
> uses flags. Therefore, check whether flags is needed at least by one
> user and if so allocate space for it.
>
> For example when page_table_check is enabled, on a machine with 128G
> of memory before the fix:
>
> [ 2.244288] allocated 536870912 bytes of page_ext
> after the fix:
> [ 2.160154] allocated 268435456 bytes of page_ext
>
> Also, add a kernel-doc comment before page_ext_operations that describes
> the fields, and remove check if need() is set, as that is now a required
> field.
>
> Signed-off-by: Pasha Tatashin <pasha.tatashin@soleen.com>
> Acked-by: Vlastimil Babka <vbabka@suse.cz>
> Acked-by: David Hildenbrand <david@redhat.com>
Reviewed-by: Mike Rapoport (IBM) <rppt@kernel.org>
> ---
> include/linux/page_ext.h | 18 ++++++++++++++++++
> mm/page_ext.c | 14 ++++++++++++--
> mm/page_owner.c | 1 +
> mm/page_table_check.c | 1 +
> 4 files changed, 32 insertions(+), 2 deletions(-)
>
> Changelog:
> v4: Addressed comments from Mike Rapoport, added Acked-by's.
> v3: Added comment before page_ext_operations, removed check if
> need is null.
> v2: Fixed field name in page_owner.c that caused build error.
>
> diff --git a/include/linux/page_ext.h b/include/linux/page_ext.h
> index 22be4582faae..67314f648aeb 100644
> --- a/include/linux/page_ext.h
> +++ b/include/linux/page_ext.h
> @@ -7,15 +7,33 @@
> #include <linux/stackdepot.h>
>
> struct pglist_data;
> +
> +/**
> + * struct page_ext_operations - per page_ext client operations
> + * @offset: Offset to the client's data within page_ext. Offset is returned to
> + * the client by page_ext_init.
> + * @size: The size of the client data within page_ext.
> + * @need: Function that returns true if client requires page_ext.
> + * @init: (optional) Called to initialize client once page_exts are allocated.
> + * @need_shared_flags: True when client is using shared page_ext->flags
> + * field.
> + *
> + * Each Page Extension client must define page_ext_operations in
> + * page_ext_ops array.
> + */
> struct page_ext_operations {
> size_t offset;
> size_t size;
> bool (*need)(void);
> void (*init)(void);
> + bool need_shared_flags;
> };
>
> #ifdef CONFIG_PAGE_EXTENSION
>
> +/*
> + * The page_ext_flags users must set need_shared_flags to true.
> + */
> enum page_ext_flags {
> PAGE_EXT_OWNER,
> PAGE_EXT_OWNER_ALLOCATED,
> diff --git a/mm/page_ext.c b/mm/page_ext.c
> index 4ee522fd381c..e2c22ffdbb81 100644
> --- a/mm/page_ext.c
> +++ b/mm/page_ext.c
> @@ -71,6 +71,7 @@ static bool need_page_idle(void)
> }
> static struct page_ext_operations page_idle_ops __initdata = {
> .need = need_page_idle,
> + .need_shared_flags = true,
> };
> #endif
>
> @@ -86,7 +87,7 @@ static struct page_ext_operations *page_ext_ops[] __initdata = {
> #endif
> };
>
> -unsigned long page_ext_size = sizeof(struct page_ext);
> +unsigned long page_ext_size;
>
> static unsigned long total_usage;
> static struct page_ext *lookup_page_ext(const struct page *page);
> @@ -106,7 +107,16 @@ static bool __init invoke_need_callbacks(void)
> bool need = false;
>
> for (i = 0; i < entries; i++) {
> - if (page_ext_ops[i]->need && page_ext_ops[i]->need()) {
> + if (page_ext_ops[i]->need()) {
> + if (page_ext_ops[i]->need_shared_flags) {
> + page_ext_size = sizeof(struct page_ext);
> + break;
> + }
> + }
> + }
> +
> + for (i = 0; i < entries; i++) {
> + if (page_ext_ops[i]->need()) {
> page_ext_ops[i]->offset = page_ext_size;
> page_ext_size += page_ext_ops[i]->size;
> need = true;
> diff --git a/mm/page_owner.c b/mm/page_owner.c
> index 2d27f532df4c..f0553bedb39d 100644
> --- a/mm/page_owner.c
> +++ b/mm/page_owner.c
> @@ -99,6 +99,7 @@ struct page_ext_operations page_owner_ops = {
> .size = sizeof(struct page_owner),
> .need = need_page_owner,
> .init = init_page_owner,
> + .need_shared_flags = true,
> };
>
> static inline struct page_owner *get_page_owner(struct page_ext *page_ext)
> diff --git a/mm/page_table_check.c b/mm/page_table_check.c
> index 93e633c1d587..25d8610c0042 100644
> --- a/mm/page_table_check.c
> +++ b/mm/page_table_check.c
> @@ -45,6 +45,7 @@ struct page_ext_operations page_table_check_ops = {
> .size = sizeof(struct page_table_check),
> .need = need_page_table_check,
> .init = init_page_table_check,
> + .need_shared_flags = false,
> };
>
> static struct page_table_check *get_page_table_check(struct page_ext *page_ext)
> --
> 2.39.0.314.g84b9a713c41-goog
>
--
Sincerely yours,
Mike.
next prev parent reply other threads:[~2023-01-18 5:53 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-17 20:21 [PATCH v4] mm/page_ext: Do not allocate space for page_ext->flags if not needed Pasha Tatashin
2023-01-18 5:53 ` Mike Rapoport [this message]
2023-01-18 5:56 ` David Rientjes
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=Y8eJXOgKQfrmzeDi@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.