linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] mm/show_mem: Bug fix for print mem alloc info
@ 2025-09-02 15:57 Yueyang Pan
  2025-09-02 15:57 ` [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling before printing Yueyang Pan
  2025-09-02 15:57 ` [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info Yueyang Pan
  0 siblings, 2 replies; 12+ messages in thread
From: Yueyang Pan @ 2025-09-02 15:57 UTC (permalink / raw)
  To: Suren Baghdasaryan, Andrew Morton, Vlastimil Babka, Michal Hocko,
	Brendan Jackman, Johannes Weiner, Zi Yan, Vishal Moola,
	Shakeel Butt, Usama Arif
  Cc: linux-mm, kernel-team, linux-kernel

This patch set fixes two issues we saw in production rollout. 

The first issue is that we saw all zero output of memory allocation 
profiling information from show_mem() if CONFIG_MEM_ALLOC_PROFILING 
is set and sysctl.vm.mem_profiling=0. This cause ambiguity as we 
don't know what 0B actually means in the output. It can mean either 
memory allocation profiling is temporary disabled or the allocation 
at that position is actually 0. Such ambiguity will make further 
parsing harder as we cannot differentiate between two case.

The second issue is that multiple entities can call show_mem() 
which messed up the allocation info in dmesg. We saw outputs like this:  
```
    327 MiB    83635 mm/compaction.c:1880 func:compaction_alloc
   48.4 GiB 12684937 mm/memory.c:1061 func:folio_prealloc
   7.48 GiB    10899 mm/huge_memory.c:1159 func:vma_alloc_anon_folio_pmd
    298 MiB    95216 kernel/fork.c:318 func:alloc_thread_stack_node
    250 MiB    63901 mm/zsmalloc.c:987 func:alloc_zspage
    1.42 GiB   372527 mm/memory.c:1063 func:folio_prealloc
    1.17 GiB    95693 mm/slub.c:2424 func:alloc_slab_page
     651 MiB   166732 mm/readahead.c:270 func:page_cache_ra_unbounded
     419 MiB   107261 net/core/page_pool.c:572 func:__page_pool_alloc_pages_slow
     404 MiB   103425 arch/x86/mm/pgtable.c:25 func:pte_alloc_one
```
The above example is because one kthread invokes show_mem() 
from __alloc_pages_slowpath while kernel itself calls 
oom_kill_process()

Revision History
=================
Changes from v1 [1]
- Dump status of memory allocation profiling instead of disabling 
the output following Vishal's advise.
- Move lock from file scope to within __show_mem() and replace mutex 
with spinlock following Andrew, Vlastimil and Shakeel's advice.

[1] https://lore.kernel.org/linux-mm/cover.1756318426.git.pyyjason@gmail.com/

Yueyang Pan (2):
  mm/show_mem: Dump the status of the mem alloc profiling  before
    printing
  mm/show_mem: Add trylock while printing alloc info

 mm/show_mem.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

-- 
2.47.3


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling  before printing
  2025-09-02 15:57 [PATCH v2 0/2] mm/show_mem: Bug fix for print mem alloc info Yueyang Pan
@ 2025-09-02 15:57 ` Yueyang Pan
  2025-09-03  9:26   ` Vlastimil Babka
  2025-09-02 15:57 ` [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info Yueyang Pan
  1 sibling, 1 reply; 12+ messages in thread
From: Yueyang Pan @ 2025-09-02 15:57 UTC (permalink / raw)
  To: Suren Baghdasaryan, Andrew Morton, Vlastimil Babka, Michal Hocko,
	Brendan Jackman, Johannes Weiner, Zi Yan, Vishal Moola,
	Shakeel Butt, Usama Arif
  Cc: linux-mm, kernel-team, linux-kernel

This patch prints the status of the memory allocation profiling
before __show_mem actually prints the detailed allocation info.
This way will let us know the `0B` we saw in allocation info is
because the profiling is disabled or the allocation is actually
0B.

Signed-off-by: Yueyang Pan <pyyjason@gmail.com>
---
 mm/show_mem.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/mm/show_mem.c b/mm/show_mem.c
index ecf20a93ea54..51892ce2efc4 100644
--- a/mm/show_mem.c
+++ b/mm/show_mem.c
@@ -427,6 +427,8 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
 
 		nr = alloc_tag_top_users(tags, ARRAY_SIZE(tags), false);
 		if (nr) {
+			pr_notice("Memory alloction profiling is turned %s\n",
+				mem_alloc_profiling_enabled() ? "on" : "off");
 			pr_notice("Memory allocations:\n");
 			for (i = 0; i < nr; i++) {
 				struct codetag *ct = tags[i].ct;
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
  2025-09-02 15:57 [PATCH v2 0/2] mm/show_mem: Bug fix for print mem alloc info Yueyang Pan
  2025-09-02 15:57 ` [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling before printing Yueyang Pan
@ 2025-09-02 15:57 ` Yueyang Pan
  2025-09-03  9:22   ` Vlastimil Babka
                     ` (2 more replies)
  1 sibling, 3 replies; 12+ messages in thread
From: Yueyang Pan @ 2025-09-02 15:57 UTC (permalink / raw)
  To: Suren Baghdasaryan, Andrew Morton, Vlastimil Babka, Michal Hocko,
	Brendan Jackman, Johannes Weiner, Zi Yan, Vishal Moola,
	Shakeel Butt, Usama Arif
  Cc: linux-mm, kernel-team, linux-kernel

In production, show_mem() can be called concurrently from two
different entities, for example one from oom_kill_process()
another from __alloc_pages_slowpath from another kthread. This
patch adds a spinlock and invokes trylock before printing out the
kernel alloc info in show_mem(). This way two alloc info won't
interleave with each other, which then makes parsing easier.

Signed-off-by: Yueyang Pan <pyyjason@gmail.com>
---
 mm/show_mem.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/mm/show_mem.c b/mm/show_mem.c
index 51892ce2efc4..4c876ea2b66f 100644
--- a/mm/show_mem.c
+++ b/mm/show_mem.c
@@ -396,6 +396,7 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
 
 void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
 {
+	static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);
 	unsigned long total = 0, reserved = 0, highmem = 0;
 	struct zone *zone;
 
@@ -421,7 +422,7 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
 	printk("%lu pages hwpoisoned\n", atomic_long_read(&num_poisoned_pages));
 #endif
 #ifdef CONFIG_MEM_ALLOC_PROFILING
-	{
+	if (spin_trylock(&mem_alloc_profiling_spinlock)) {
 		struct codetag_bytes tags[10];
 		size_t i, nr;
 
@@ -449,6 +450,7 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
 						  ct->lineno, ct->function);
 			}
 		}
+		spin_unlock(&mem_alloc_profiling_spinlock);
 	}
 #endif
 }
-- 
2.47.3


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
  2025-09-02 15:57 ` [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info Yueyang Pan
@ 2025-09-03  9:22   ` Vlastimil Babka
  2025-09-03  9:31   ` Usama Arif
  2025-09-03  9:47   ` kernel test robot
  2 siblings, 0 replies; 12+ messages in thread
From: Vlastimil Babka @ 2025-09-03  9:22 UTC (permalink / raw)
  To: Yueyang Pan, Suren Baghdasaryan, Andrew Morton, Michal Hocko,
	Brendan Jackman, Johannes Weiner, Zi Yan, Vishal Moola,
	Shakeel Butt, Usama Arif
  Cc: linux-mm, kernel-team, linux-kernel

On 9/2/25 17:57, Yueyang Pan wrote:
> In production, show_mem() can be called concurrently from two
> different entities, for example one from oom_kill_process()
> another from __alloc_pages_slowpath from another kthread. This
> patch adds a spinlock and invokes trylock before printing out the
> kernel alloc info in show_mem(). This way two alloc info won't
> interleave with each other, which then makes parsing easier.
> 
> Signed-off-by: Yueyang Pan <pyyjason@gmail.com>

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

> ---
>  mm/show_mem.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/mm/show_mem.c b/mm/show_mem.c
> index 51892ce2efc4..4c876ea2b66f 100644
> --- a/mm/show_mem.c
> +++ b/mm/show_mem.c
> @@ -396,6 +396,7 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
>  
>  void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>  {
> +	static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);
>  	unsigned long total = 0, reserved = 0, highmem = 0;
>  	struct zone *zone;
>  
> @@ -421,7 +422,7 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>  	printk("%lu pages hwpoisoned\n", atomic_long_read(&num_poisoned_pages));
>  #endif
>  #ifdef CONFIG_MEM_ALLOC_PROFILING
> -	{
> +	if (spin_trylock(&mem_alloc_profiling_spinlock)) {
>  		struct codetag_bytes tags[10];
>  		size_t i, nr;
>  
> @@ -449,6 +450,7 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>  						  ct->lineno, ct->function);
>  			}
>  		}
> +		spin_unlock(&mem_alloc_profiling_spinlock);
>  	}
>  #endif
>  }


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling before printing
  2025-09-02 15:57 ` [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling before printing Yueyang Pan
@ 2025-09-03  9:26   ` Vlastimil Babka
  2025-09-03  9:34     ` Yueyang Pan
  0 siblings, 1 reply; 12+ messages in thread
From: Vlastimil Babka @ 2025-09-03  9:26 UTC (permalink / raw)
  To: Yueyang Pan, Suren Baghdasaryan, Andrew Morton, Michal Hocko,
	Brendan Jackman, Johannes Weiner, Zi Yan, Vishal Moola,
	Shakeel Butt, Usama Arif
  Cc: linux-mm, kernel-team, linux-kernel

On 9/2/25 17:57, Yueyang Pan wrote:
> This patch prints the status of the memory allocation profiling
> before __show_mem actually prints the detailed allocation info.
> This way will let us know the `0B` we saw in allocation info is
> because the profiling is disabled or the allocation is actually
> 0B.
> 
> Signed-off-by: Yueyang Pan <pyyjason@gmail.com>
> ---
>  mm/show_mem.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/mm/show_mem.c b/mm/show_mem.c
> index ecf20a93ea54..51892ce2efc4 100644
> --- a/mm/show_mem.c
> +++ b/mm/show_mem.c
> @@ -427,6 +427,8 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>  
>  		nr = alloc_tag_top_users(tags, ARRAY_SIZE(tags), false);
>  		if (nr) {
> +			pr_notice("Memory alloction profiling is turned %s\n",

There's a typo "alloction".

> +				mem_alloc_profiling_enabled() ? "on" : "off");
>  			pr_notice("Memory allocations:\n");

But I think the message would be more obvious if it said e.g.:

"Memory allocations (profiling is currently [on/off]):"

>  			for (i = 0; i < nr; i++) {
>  				struct codetag *ct = tags[i].ct;


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
  2025-09-02 15:57 ` [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info Yueyang Pan
  2025-09-03  9:22   ` Vlastimil Babka
@ 2025-09-03  9:31   ` Usama Arif
  2025-09-03  9:47   ` kernel test robot
  2 siblings, 0 replies; 12+ messages in thread
From: Usama Arif @ 2025-09-03  9:31 UTC (permalink / raw)
  To: Yueyang Pan, Suren Baghdasaryan, Andrew Morton, Vlastimil Babka,
	Michal Hocko, Brendan Jackman, Johannes Weiner, Zi Yan,
	Vishal Moola, Shakeel Butt
  Cc: linux-mm, kernel-team, linux-kernel



On 02/09/2025 16:57, Yueyang Pan wrote:
> In production, show_mem() can be called concurrently from two
> different entities, for example one from oom_kill_process()
> another from __alloc_pages_slowpath from another kthread. This
> patch adds a spinlock and invokes trylock before printing out the
> kernel alloc info in show_mem(). This way two alloc info won't
> interleave with each other, which then makes parsing easier.
> 
> Signed-off-by: Yueyang Pan <pyyjason@gmail.com>

Acked-by: Usama Arif <usamaarif642@gmail.com>

> ---
>  mm/show_mem.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/mm/show_mem.c b/mm/show_mem.c
> index 51892ce2efc4..4c876ea2b66f 100644
> --- a/mm/show_mem.c
> +++ b/mm/show_mem.c
> @@ -396,6 +396,7 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
>  
>  void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>  {
> +	static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);
>  	unsigned long total = 0, reserved = 0, highmem = 0;
>  	struct zone *zone;
>  
> @@ -421,7 +422,7 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>  	printk("%lu pages hwpoisoned\n", atomic_long_read(&num_poisoned_pages));
>  #endif
>  #ifdef CONFIG_MEM_ALLOC_PROFILING
> -	{
> +	if (spin_trylock(&mem_alloc_profiling_spinlock)) {
>  		struct codetag_bytes tags[10];
>  		size_t i, nr;
>  
> @@ -449,6 +450,7 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>  						  ct->lineno, ct->function);
>  			}
>  		}
> +		spin_unlock(&mem_alloc_profiling_spinlock);
>  	}
>  #endif
>  }


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling before printing
  2025-09-03  9:26   ` Vlastimil Babka
@ 2025-09-03  9:34     ` Yueyang Pan
  2025-09-03 10:12       ` Vlastimil Babka
  2025-09-03 10:12       ` Usama Arif
  0 siblings, 2 replies; 12+ messages in thread
From: Yueyang Pan @ 2025-09-03  9:34 UTC (permalink / raw)
  To: Vlastimil Babka
  Cc: Suren Baghdasaryan, Andrew Morton, Michal Hocko, Brendan Jackman,
	Johannes Weiner, Zi Yan, Vishal Moola, Shakeel Butt, Usama Arif,
	linux-mm, kernel-team, linux-kernel

On Wed, Sep 03, 2025 at 11:26:01AM +0200, Vlastimil Babka wrote:
> On 9/2/25 17:57, Yueyang Pan wrote:
> > This patch prints the status of the memory allocation profiling
> > before __show_mem actually prints the detailed allocation info.
> > This way will let us know the `0B` we saw in allocation info is
> > because the profiling is disabled or the allocation is actually
> > 0B.
> > 
> > Signed-off-by: Yueyang Pan <pyyjason@gmail.com>
> > ---
> >  mm/show_mem.c | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/mm/show_mem.c b/mm/show_mem.c
> > index ecf20a93ea54..51892ce2efc4 100644
> > --- a/mm/show_mem.c
> > +++ b/mm/show_mem.c
> > @@ -427,6 +427,8 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
> >  
> >  		nr = alloc_tag_top_users(tags, ARRAY_SIZE(tags), false);
> >  		if (nr) {
> > +			pr_notice("Memory alloction profiling is turned %s\n",
> 
> There's a typo "alloction".

Nice catch. Thanks!

> 
> > +				mem_alloc_profiling_enabled() ? "on" : "off");
> >  			pr_notice("Memory allocations:\n");
> 
> But I think the message would be more obvious if it said e.g.:
> 
> "Memory allocations (profiling is currently [on/off]):"

I can change it in the next version. I saw Andrew gave approval. In this case, shall 
I send v3 or create a new patch?

> 
> >  			for (i = 0; i < nr; i++) {
> >  				struct codetag *ct = tags[i].ct;
> 

Thanks
Pan

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
  2025-09-02 15:57 ` [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info Yueyang Pan
  2025-09-03  9:22   ` Vlastimil Babka
  2025-09-03  9:31   ` Usama Arif
@ 2025-09-03  9:47   ` kernel test robot
  2025-09-03 10:16     ` Vlastimil Babka
  2 siblings, 1 reply; 12+ messages in thread
From: kernel test robot @ 2025-09-03  9:47 UTC (permalink / raw)
  To: Yueyang Pan, Suren Baghdasaryan, Andrew Morton, Vlastimil Babka,
	Michal Hocko, Brendan Jackman, Johannes Weiner, Zi Yan,
	Vishal Moola, Shakeel Butt, Usama Arif
  Cc: oe-kbuild-all, Linux Memory Management List, kernel-team,
	linux-kernel

Hi Yueyang,

kernel test robot noticed the following build warnings:

[auto build test WARNING on akpm-mm/mm-everything]

url:    https://github.com/intel-lab-lkp/linux/commits/Yueyang-Pan/mm-show_mem-Dump-the-status-of-the-mem-alloc-profiling-before-printing/20250903-000616
base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
patch link:    https://lore.kernel.org/r/1491df0ac12a7626b7c9b00e26a6e10adb8c9045.1756827906.git.pyyjason%40gmail.com
patch subject: [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
config: i386-buildonly-randconfig-001-20250903 (https://download.01.org/0day-ci/archive/20250903/202509031744.HcibSETe-lkp@intel.com/config)
compiler: gcc-13 (Debian 13.3.0-16) 13.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250903/202509031744.HcibSETe-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509031744.HcibSETe-lkp@intel.com/

All warnings (new ones prefixed by >>):

   In file included from mm/show_mem.c:18:
   mm/show_mem.c: In function 'show_free_areas':
   mm/show_mem.c:336:49: error: 'NR_ZSPAGES' undeclared (first use in this function); did you mean 'NR_STATS'?
     336 |                         K(zone_page_state(zone, NR_ZSPAGES)),
         |                                                 ^~~~~~~~~~
   mm/internal.h:560:16: note: in definition of macro 'K'
     560 | #define K(x) ((x) << (PAGE_SHIFT-10))
         |                ^
   include/linux/printk.h:512:26: note: in expansion of macro 'printk_index_wrap'
     512 | #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
         |                          ^~~~~~~~~~~~~~~~~
   mm/show_mem.c:298:17: note: in expansion of macro 'printk'
     298 |                 printk(KERN_CONT
         |                 ^~~~~~
   mm/show_mem.c:336:49: note: each undeclared identifier is reported only once for each function it appears in
     336 |                         K(zone_page_state(zone, NR_ZSPAGES)),
         |                                                 ^~~~~~~~~~
   mm/internal.h:560:16: note: in definition of macro 'K'
     560 | #define K(x) ((x) << (PAGE_SHIFT-10))
         |                ^
   include/linux/printk.h:512:26: note: in expansion of macro 'printk_index_wrap'
     512 | #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
         |                          ^~~~~~~~~~~~~~~~~
   mm/show_mem.c:298:17: note: in expansion of macro 'printk'
     298 |                 printk(KERN_CONT
         |                 ^~~~~~
   In file included from include/linux/spinlock.h:89,
                    from include/linux/wait.h:9,
                    from include/linux/wait_bit.h:8,
                    from include/linux/fs.h:7,
                    from include/linux/highmem.h:5,
                    from include/linux/bvec.h:10,
                    from include/linux/blk_types.h:10,
                    from include/linux/blkdev.h:9,
                    from mm/show_mem.c:8:
   mm/show_mem.c: In function '__show_mem':
>> mm/show_mem.c:399:32: warning: unused variable 'mem_alloc_profiling_spinlock' [-Wunused-variable]
     399 |         static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);
         |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/spinlock_types.h:43:44: note: in definition of macro 'DEFINE_SPINLOCK'
      43 | #define DEFINE_SPINLOCK(x)      spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
         |                                            ^


vim +/mem_alloc_profiling_spinlock +399 mm/show_mem.c

   396	
   397	void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
   398	{
 > 399		static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling before printing
  2025-09-03  9:34     ` Yueyang Pan
@ 2025-09-03 10:12       ` Vlastimil Babka
  2025-09-03 10:12       ` Usama Arif
  1 sibling, 0 replies; 12+ messages in thread
From: Vlastimil Babka @ 2025-09-03 10:12 UTC (permalink / raw)
  To: Yueyang Pan
  Cc: Suren Baghdasaryan, Andrew Morton, Michal Hocko, Brendan Jackman,
	Johannes Weiner, Zi Yan, Vishal Moola, Shakeel Butt, Usama Arif,
	linux-mm, kernel-team, linux-kernel

On 9/3/25 11:34, Yueyang Pan wrote:
> On Wed, Sep 03, 2025 at 11:26:01AM +0200, Vlastimil Babka wrote:
>> On 9/2/25 17:57, Yueyang Pan wrote:
>> > This patch prints the status of the memory allocation profiling
>> > before __show_mem actually prints the detailed allocation info.
>> > This way will let us know the `0B` we saw in allocation info is
>> > because the profiling is disabled or the allocation is actually
>> > 0B.
>> > 
>> > Signed-off-by: Yueyang Pan <pyyjason@gmail.com>
>> > ---
>> >  mm/show_mem.c | 2 ++
>> >  1 file changed, 2 insertions(+)
>> > 
>> > diff --git a/mm/show_mem.c b/mm/show_mem.c
>> > index ecf20a93ea54..51892ce2efc4 100644
>> > --- a/mm/show_mem.c
>> > +++ b/mm/show_mem.c
>> > @@ -427,6 +427,8 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>> >  
>> >  		nr = alloc_tag_top_users(tags, ARRAY_SIZE(tags), false);
>> >  		if (nr) {
>> > +			pr_notice("Memory alloction profiling is turned %s\n",
>> 
>> There's a typo "alloction".
> 
> Nice catch. Thanks!
> 
>> 
>> > +				mem_alloc_profiling_enabled() ? "on" : "off");
>> >  			pr_notice("Memory allocations:\n");
>> 
>> But I think the message would be more obvious if it said e.g.:
>> 
>> "Memory allocations (profiling is currently [on/off]):"
> 
> I can change it in the next version. I saw Andrew gave approval. In this case, shall 
> I send v3 or create a new patch?

You can send v3 (given patch 2/2 needs warning fix too) and Andrew can
replace or convert to fixups.

>> 
>> >  			for (i = 0; i < nr; i++) {
>> >  				struct codetag *ct = tags[i].ct;
>> 
> 
> Thanks
> Pan


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling before printing
  2025-09-03  9:34     ` Yueyang Pan
  2025-09-03 10:12       ` Vlastimil Babka
@ 2025-09-03 10:12       ` Usama Arif
  1 sibling, 0 replies; 12+ messages in thread
From: Usama Arif @ 2025-09-03 10:12 UTC (permalink / raw)
  To: Yueyang Pan, Vlastimil Babka
  Cc: Suren Baghdasaryan, Andrew Morton, Michal Hocko, Brendan Jackman,
	Johannes Weiner, Zi Yan, Vishal Moola, Shakeel Butt, linux-mm,
	kernel-team, linux-kernel



On 03/09/2025 10:34, Yueyang Pan wrote:
> On Wed, Sep 03, 2025 at 11:26:01AM +0200, Vlastimil Babka wrote:
>> On 9/2/25 17:57, Yueyang Pan wrote:
>>> This patch prints the status of the memory allocation profiling
>>> before __show_mem actually prints the detailed allocation info.
>>> This way will let us know the `0B` we saw in allocation info is
>>> because the profiling is disabled or the allocation is actually
>>> 0B.
>>>
>>> Signed-off-by: Yueyang Pan <pyyjason@gmail.com>
>>> ---
>>>  mm/show_mem.c | 2 ++
>>>  1 file changed, 2 insertions(+)
>>>
>>> diff --git a/mm/show_mem.c b/mm/show_mem.c
>>> index ecf20a93ea54..51892ce2efc4 100644
>>> --- a/mm/show_mem.c
>>> +++ b/mm/show_mem.c
>>> @@ -427,6 +427,8 @@ void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>>>  
>>>  		nr = alloc_tag_top_users(tags, ARRAY_SIZE(tags), false);
>>>  		if (nr) {
>>> +			pr_notice("Memory alloction profiling is turned %s\n",
>>
>> There's a typo "alloction".
> 
> Nice catch. Thanks!
> 
>>
>>> +				mem_alloc_profiling_enabled() ? "on" : "off");
>>>  			pr_notice("Memory allocations:\n");
>>
>> But I think the message would be more obvious if it said e.g.:
>>
>> "Memory allocations (profiling is currently [on/off]):"
> 
> I can change it in the next version. I saw Andrew gave approval. In this case, shall 
> I send v3 or create a new patch?
> 

Send a v3 as a change is needed in both patches.

>>
>>>  			for (i = 0; i < nr; i++) {
>>>  				struct codetag *ct = tags[i].ct;
>>
> 
> Thanks
> Pan


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
  2025-09-03  9:47   ` kernel test robot
@ 2025-09-03 10:16     ` Vlastimil Babka
  2025-09-03 10:24       ` Yueyang Pan
  0 siblings, 1 reply; 12+ messages in thread
From: Vlastimil Babka @ 2025-09-03 10:16 UTC (permalink / raw)
  To: kernel test robot, Yueyang Pan, Suren Baghdasaryan, Andrew Morton,
	Michal Hocko, Brendan Jackman, Johannes Weiner, Zi Yan,
	Vishal Moola, Shakeel Butt, Usama Arif
  Cc: oe-kbuild-all, Linux Memory Management List, kernel-team,
	linux-kernel

On 9/3/25 11:47, kernel test robot wrote:
> Hi Yueyang,
> 
> kernel test robot noticed the following build warnings:
> 
> [auto build test WARNING on akpm-mm/mm-everything]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Yueyang-Pan/mm-show_mem-Dump-the-status-of-the-mem-alloc-profiling-before-printing/20250903-000616
> base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> patch link:    https://lore.kernel.org/r/1491df0ac12a7626b7c9b00e26a6e10adb8c9045.1756827906.git.pyyjason%40gmail.com
> patch subject: [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
> config: i386-buildonly-randconfig-001-20250903 (https://download.01.org/0day-ci/archive/20250903/202509031744.HcibSETe-lkp@intel.com/config)
> compiler: gcc-13 (Debian 13.3.0-16) 13.3.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250903/202509031744.HcibSETe-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202509031744.HcibSETe-lkp@intel.com/
> 
> All warnings (new ones prefixed by >>):
> 
>    In file included from mm/show_mem.c:18:
>    mm/show_mem.c: In function 'show_free_areas':
>    mm/show_mem.c:336:49: error: 'NR_ZSPAGES' undeclared (first use in this function); did you mean 'NR_STATS'?
>      336 |                         K(zone_page_state(zone, NR_ZSPAGES)),
>          |                                                 ^~~~~~~~~~

This is from a different patch and being fixed. Interesting that lkp will
report additional warnings even in presence of prior errors.

>    mm/internal.h:560:16: note: in definition of macro 'K'
>      560 | #define K(x) ((x) << (PAGE_SHIFT-10))
>          |                ^
>    include/linux/printk.h:512:26: note: in expansion of macro 'printk_index_wrap'
>      512 | #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
>          |                          ^~~~~~~~~~~~~~~~~
>    mm/show_mem.c:298:17: note: in expansion of macro 'printk'
>      298 |                 printk(KERN_CONT
>          |                 ^~~~~~
>    mm/show_mem.c:336:49: note: each undeclared identifier is reported only once for each function it appears in
>      336 |                         K(zone_page_state(zone, NR_ZSPAGES)),
>          |                                                 ^~~~~~~~~~
>    mm/internal.h:560:16: note: in definition of macro 'K'
>      560 | #define K(x) ((x) << (PAGE_SHIFT-10))
>          |                ^
>    include/linux/printk.h:512:26: note: in expansion of macro 'printk_index_wrap'
>      512 | #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
>          |                          ^~~~~~~~~~~~~~~~~
>    mm/show_mem.c:298:17: note: in expansion of macro 'printk'
>      298 |                 printk(KERN_CONT
>          |                 ^~~~~~
>    In file included from include/linux/spinlock.h:89,
>                     from include/linux/wait.h:9,
>                     from include/linux/wait_bit.h:8,
>                     from include/linux/fs.h:7,
>                     from include/linux/highmem.h:5,
>                     from include/linux/bvec.h:10,
>                     from include/linux/blk_types.h:10,
>                     from include/linux/blkdev.h:9,
>                     from mm/show_mem.c:8:
>    mm/show_mem.c: In function '__show_mem':
>>> mm/show_mem.c:399:32: warning: unused variable 'mem_alloc_profiling_spinlock' [-Wunused-variable]
>      399 |         static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);

This is the warning

I think you can simply move the definition to the existing #ifdef
CONFIG_MEM_ALLOC_PROFILING block above the spin_trylock(). The kernel now
uses a new enough C standard to allow this and not only at the beginning of
a cuntion. While not encouraged to do that in general, this seems to be a
valid use case.


>          |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
>    include/linux/spinlock_types.h:43:44: note: in definition of macro 'DEFINE_SPINLOCK'
>       43 | #define DEFINE_SPINLOCK(x)      spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
>          |                                            ^
> 
> 
> vim +/mem_alloc_profiling_spinlock +399 mm/show_mem.c
> 
>    396	
>    397	void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
>    398	{
>  > 399		static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
  2025-09-03 10:16     ` Vlastimil Babka
@ 2025-09-03 10:24       ` Yueyang Pan
  0 siblings, 0 replies; 12+ messages in thread
From: Yueyang Pan @ 2025-09-03 10:24 UTC (permalink / raw)
  To: Vlastimil Babka
  Cc: kernel test robot, Suren Baghdasaryan, Andrew Morton,
	Michal Hocko, Brendan Jackman, Johannes Weiner, Zi Yan,
	Vishal Moola, Shakeel Butt, Usama Arif, oe-kbuild-all,
	Linux Memory Management List, kernel-team, linux-kernel

On Wed, Sep 03, 2025 at 12:16:45PM +0200, Vlastimil Babka wrote:
> On 9/3/25 11:47, kernel test robot wrote:
> > Hi Yueyang,
> > 
> > kernel test robot noticed the following build warnings:
> > 
> > [auto build test WARNING on akpm-mm/mm-everything]
> > 
> > url:    https://github.com/intel-lab-lkp/linux/commits/Yueyang-Pan/mm-show_mem-Dump-the-status-of-the-mem-alloc-profiling-before-printing/20250903-000616
> > base:   https://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm.git mm-everything
> > patch link:    https://lore.kernel.org/r/1491df0ac12a7626b7c9b00e26a6e10adb8c9045.1756827906.git.pyyjason%40gmail.com
> > patch subject: [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info
> > config: i386-buildonly-randconfig-001-20250903 (https://download.01.org/0day-ci/archive/20250903/202509031744.HcibSETe-lkp@intel.com/config)
> > compiler: gcc-13 (Debian 13.3.0-16) 13.3.0
> > reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250903/202509031744.HcibSETe-lkp@intel.com/reproduce)
> > 
> > If you fix the issue in a separate patch/commit (i.e. not just a new version of
> > the same patch/commit), kindly add following tags
> > | Reported-by: kernel test robot <lkp@intel.com>
> > | Closes: https://lore.kernel.org/oe-kbuild-all/202509031744.HcibSETe-lkp@intel.com/
> > 
> > All warnings (new ones prefixed by >>):
> > 
> >    In file included from mm/show_mem.c:18:
> >    mm/show_mem.c: In function 'show_free_areas':
> >    mm/show_mem.c:336:49: error: 'NR_ZSPAGES' undeclared (first use in this function); did you mean 'NR_STATS'?
> >      336 |                         K(zone_page_state(zone, NR_ZSPAGES)),
> >          |                                                 ^~~~~~~~~~
> 
> This is from a different patch and being fixed. Interesting that lkp will
> report additional warnings even in presence of prior errors.

Thanks. Understood.

> 
> >    mm/internal.h:560:16: note: in definition of macro 'K'
> >      560 | #define K(x) ((x) << (PAGE_SHIFT-10))
> >          |                ^
> >    include/linux/printk.h:512:26: note: in expansion of macro 'printk_index_wrap'
> >      512 | #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
> >          |                          ^~~~~~~~~~~~~~~~~
> >    mm/show_mem.c:298:17: note: in expansion of macro 'printk'
> >      298 |                 printk(KERN_CONT
> >          |                 ^~~~~~
> >    mm/show_mem.c:336:49: note: each undeclared identifier is reported only once for each function it appears in
> >      336 |                         K(zone_page_state(zone, NR_ZSPAGES)),
> >          |                                                 ^~~~~~~~~~
> >    mm/internal.h:560:16: note: in definition of macro 'K'
> >      560 | #define K(x) ((x) << (PAGE_SHIFT-10))
> >          |                ^
> >    include/linux/printk.h:512:26: note: in expansion of macro 'printk_index_wrap'
> >      512 | #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
> >          |                          ^~~~~~~~~~~~~~~~~
> >    mm/show_mem.c:298:17: note: in expansion of macro 'printk'
> >      298 |                 printk(KERN_CONT
> >          |                 ^~~~~~
> >    In file included from include/linux/spinlock.h:89,
> >                     from include/linux/wait.h:9,
> >                     from include/linux/wait_bit.h:8,
> >                     from include/linux/fs.h:7,
> >                     from include/linux/highmem.h:5,
> >                     from include/linux/bvec.h:10,
> >                     from include/linux/blk_types.h:10,
> >                     from include/linux/blkdev.h:9,
> >                     from mm/show_mem.c:8:
> >    mm/show_mem.c: In function '__show_mem':
> >>> mm/show_mem.c:399:32: warning: unused variable 'mem_alloc_profiling_spinlock' [-Wunused-variable]
> >      399 |         static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);
> 
> This is the warning
> 
> I think you can simply move the definition to the existing #ifdef
> CONFIG_MEM_ALLOC_PROFILING block above the spin_trylock(). The kernel now
> uses a new enough C standard to allow this and not only at the beginning of
> a cuntion. While not encouraged to do that in general, this seems to be a
> valid use case.
> 

Let me quickly fix both and push v3

> 
> >          |                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
> >    include/linux/spinlock_types.h:43:44: note: in definition of macro 'DEFINE_SPINLOCK'
> >       43 | #define DEFINE_SPINLOCK(x)      spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
> >          |                                            ^
> > 
> > 
> > vim +/mem_alloc_profiling_spinlock +399 mm/show_mem.c
> > 
> >    396	
> >    397	void __show_mem(unsigned int filter, nodemask_t *nodemask, int max_zone_idx)
> >    398	{
> >  > 399		static DEFINE_SPINLOCK(mem_alloc_profiling_spinlock);
> > 
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2025-09-03 10:24 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-02 15:57 [PATCH v2 0/2] mm/show_mem: Bug fix for print mem alloc info Yueyang Pan
2025-09-02 15:57 ` [PATCH v2 1/2] mm/show_mem: Dump the status of the mem alloc profiling before printing Yueyang Pan
2025-09-03  9:26   ` Vlastimil Babka
2025-09-03  9:34     ` Yueyang Pan
2025-09-03 10:12       ` Vlastimil Babka
2025-09-03 10:12       ` Usama Arif
2025-09-02 15:57 ` [PATCH v2 2/2] mm/show_mem: Add trylock while printing alloc info Yueyang Pan
2025-09-03  9:22   ` Vlastimil Babka
2025-09-03  9:31   ` Usama Arif
2025-09-03  9:47   ` kernel test robot
2025-09-03 10:16     ` Vlastimil Babka
2025-09-03 10:24       ` Yueyang Pan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).