mm/page_alloc: add trace event for per-zone lowmem reserve setup
authorMartin Liu <liumartin@google.com>
Sat, 8 Mar 2025 03:46:01 +0000 (03:46 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 18 Mar 2025 05:07:03 +0000 (22:07 -0700)
This commit introduces the `mm_setup_per_zone_lowmem_reserve` trace
event,which provides detailed insights into the kernel's per-zone lowmem
reserve configuration.

The trace event provides precise timestamps, allowing developers to

1. Correlate lowmem reserve changes with specific kernel events and
   able to diagnose unexpected kswapd or direct reclaim behavior triggered
   by dynamic changes in lowmem reserve.

2. Know memory allocation failures that occur due to insufficient
   lowmem reserve, by precisely correlating allocation attempts with
   reserve adjustments.

Link: https://lkml.kernel.org/r/20250308034606.2036033-3-liumartin@google.com
Signed-off-by: Martin Liu <liumartin@google.com>
Acked-by: David Rientjes <rientjes@google.com>
Cc: "Masami Hiramatsu (Google)" <mhiramat@kernel.org>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/trace/events/kmem.h
mm/page_alloc.c

index 5fd392dae503e240c3ddc80bf409338e9c719b11..9623e68d4d267c20dda1a5d7706803e90345de8d 100644 (file)
@@ -375,6 +375,33 @@ TRACE_EVENT(mm_setup_per_zone_wmarks,
                  __entry->watermark_promo)
 );
 
+TRACE_EVENT(mm_setup_per_zone_lowmem_reserve,
+
+       TP_PROTO(struct zone *zone, struct zone *upper_zone, long lowmem_reserve),
+
+       TP_ARGS(zone, upper_zone, lowmem_reserve),
+
+       TP_STRUCT__entry(
+               __field(int, node_id)
+               __string(name, zone->name)
+               __string(upper_name, upper_zone->name)
+               __field(long, lowmem_reserve)
+       ),
+
+       TP_fast_assign(
+               __entry->node_id = zone->zone_pgdat->node_id;
+               __assign_str(name);
+               __assign_str(upper_name);
+               __entry->lowmem_reserve = lowmem_reserve;
+       ),
+
+       TP_printk("node_id=%d zone name=%s upper_zone name=%s lowmem_reserve_pages=%ld",
+                 __entry->node_id,
+                 __get_str(name),
+                 __get_str(upper_name),
+                 __entry->lowmem_reserve)
+);
+
 /*
  * Required for uniquely and securely identifying mm in rss_stat tracepoint.
  */
index b739367434ce87cbaf980b76a5484c780c8f0817..a82d96cb3044082c177c0b121d053ed5d14daa04 100644 (file)
@@ -5943,6 +5943,8 @@ static void setup_per_zone_lowmem_reserve(void)
                                        zone->lowmem_reserve[j] = 0;
                                else
                                        zone->lowmem_reserve[j] = managed_pages / ratio;
+                               trace_mm_setup_per_zone_lowmem_reserve(zone, upper_zone,
+                                                                      zone->lowmem_reserve[j]);
                        }
                }
        }