[v4,20/36] mm/page_ext: enable early_page_ext when CONFIG_MEM_ALLOC_PROFILING_DEBUG=y

Message ID 20240221194052.927623-21-surenb@google.com
State New
Headers
Series Memory allocation profiling |

Commit Message

Suren Baghdasaryan Feb. 21, 2024, 7:40 p.m. UTC
  For all page allocations to be tagged, page_ext has to be initialized
before the first page allocation. Early tasks allocate their stacks
using page allocator before alloc_node_page_ext() initializes page_ext
area, unless early_page_ext is enabled. Therefore these allocations will
generate a warning when CONFIG_MEM_ALLOC_PROFILING_DEBUG is enabled.
Enable early_page_ext whenever CONFIG_MEM_ALLOC_PROFILING_DEBUG=y to
ensure page_ext initialization prior to any page allocation. This will
have all the negative effects associated with early_page_ext, such as
possible longer boot time, therefore we enable it only when debugging
with CONFIG_MEM_ALLOC_PROFILING_DEBUG enabled and not universally for
CONFIG_MEM_ALLOC_PROFILING.

Signed-off-by: Suren Baghdasaryan <surenb@google.com>
---
 mm/page_ext.c | 9 +++++++++
 1 file changed, 9 insertions(+)
  

Comments

Vlastimil Babka Feb. 27, 2024, 10:18 a.m. UTC | #1
On 2/21/24 20:40, Suren Baghdasaryan wrote:
> For all page allocations to be tagged, page_ext has to be initialized
> before the first page allocation. Early tasks allocate their stacks
> using page allocator before alloc_node_page_ext() initializes page_ext
> area, unless early_page_ext is enabled. Therefore these allocations will
> generate a warning when CONFIG_MEM_ALLOC_PROFILING_DEBUG is enabled.
> Enable early_page_ext whenever CONFIG_MEM_ALLOC_PROFILING_DEBUG=y to
> ensure page_ext initialization prior to any page allocation. This will
> have all the negative effects associated with early_page_ext, such as
> possible longer boot time, therefore we enable it only when debugging
> with CONFIG_MEM_ALLOC_PROFILING_DEBUG enabled and not universally for
> CONFIG_MEM_ALLOC_PROFILING.
> 
> Signed-off-by: Suren Baghdasaryan <surenb@google.com>

Reviewed-by: Vlastimil Babka <vbabka@suse.cz>

> ---
>  mm/page_ext.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/mm/page_ext.c b/mm/page_ext.c
> index 3c58fe8a24df..e7d8f1a5589e 100644
> --- a/mm/page_ext.c
> +++ b/mm/page_ext.c
> @@ -95,7 +95,16 @@ unsigned long page_ext_size;
>  
>  static unsigned long total_usage;
>  
> +#ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG
> +/*
> + * To ensure correct allocation tagging for pages, page_ext should be available
> + * before the first page allocation. Otherwise early task stacks will be
> + * allocated before page_ext initialization and missing tags will be flagged.
> + */
> +bool early_page_ext __meminitdata = true;
> +#else
>  bool early_page_ext __meminitdata;
> +#endif
>  static int __init setup_early_page_ext(char *str)
>  {
>  	early_page_ext = true;
  

Patch

diff --git a/mm/page_ext.c b/mm/page_ext.c
index 3c58fe8a24df..e7d8f1a5589e 100644
--- a/mm/page_ext.c
+++ b/mm/page_ext.c
@@ -95,7 +95,16 @@  unsigned long page_ext_size;
 
 static unsigned long total_usage;
 
+#ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG
+/*
+ * To ensure correct allocation tagging for pages, page_ext should be available
+ * before the first page allocation. Otherwise early task stacks will be
+ * allocated before page_ext initialization and missing tags will be flagged.
+ */
+bool early_page_ext __meminitdata = true;
+#else
 bool early_page_ext __meminitdata;
+#endif
 static int __init setup_early_page_ext(char *str)
 {
 	early_page_ext = true;