]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
meminfo: add a per node counter for balloon drivers
authorNico Pache <npache@redhat.com>
Fri, 14 Mar 2025 21:37:54 +0000 (15:37 -0600)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 22 Mar 2025 05:03:13 +0000 (22:03 -0700)
Patch series "track memory used by balloon drivers", v2.

This series introduces a way to track memory used by balloon drivers.

Add a NR_BALLOON_PAGES counter to track how many pages are reclaimed by
the balloon drivers.  First add the accounting, then updates the balloon
drivers (virtio, Hyper-V, VMware, Pseries-cmm, and Xen) to maintain this
counter.  The virtio, Vmware, and pseries-cmm balloon drivers utilize the
balloon_compaction interface to allocate and free balloon pages.  Other
balloon drivers will have to maintain this counter manually.

This makes the information visible in memory reporting interfaces like
/proc/meminfo, show_mem, and OOM reporting.

This provides admins visibility into their VM balloon sizes without
requiring different virtualization tooling.  Furthermore, this information
is helpful when debugging an OOM inside a VM.

This patch (of 4):

Add NR_BALLOON_PAGES counter to track memory used by balloon drivers and
expose it through /proc/meminfo and other memory reporting interfaces.

[npache@redhat.com: document Balloon Meminfo entry]
Link: https://lkml.kernel.org/r/a0315ccf-f244-460e-8643-fd7388724fe5@redhat.com
Link: https://lkml.kernel.org/r/20250314213757.244258-1-npache@redhat.com
Link: https://lkml.kernel.org/r/20250314213757.244258-2-npache@redhat.com
Signed-off-by: Nico Pache <npache@redhat.com>
Cc: Alexander Atanasov <alexander.atanasov@virtuozzo.com>
Cc: Chengming Zhou <chengming.zhou@linux.dev>
Cc: David Hildenbrand <david@redhat.com>
Cc: Dexuan Cui <decui@microsoft.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Juegren Gross <jgross@suse.com>
Cc: Kanchana P Sridhar <kanchana.p.sridhar@intel.com>
Cc: K. Y. Srinivasan <kys@microsoft.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>
Cc: Michal Hocko <mhocko@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Nhat Pham <nphamcs@gmail.com>
Cc: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: Shakeel Butt <shakeel.butt@linux.dev>
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Wei Liu <wei.liu@kernel.org>
Cc: Michael Kelley <mhklinux@outlook.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Documentation/filesystems/proc.rst
fs/proc/meminfo.c
include/linux/mmzone.h
mm/show_mem.c
mm/vmstat.c

index 3c37b248fc4f14e469bec53211b2aeed47614357..80f33bce5fe199f9b62dfcf4ae060362e5732c3f 100644 (file)
@@ -1081,6 +1081,7 @@ Example output. You may not have all of these fields.
     FilePmdMapped:         0 kB
     CmaTotal:              0 kB
     CmaFree:               0 kB
+    Balloon:               0 kB
     HugePages_Total:       0
     HugePages_Free:        0
     HugePages_Rsvd:        0
@@ -1255,6 +1256,8 @@ CmaTotal
               Memory reserved for the Contiguous Memory Allocator (CMA)
 CmaFree
               Free remaining memory in the CMA reserves
+Balloon
+              Memory returned to Host by VM Balloon Drivers
 HugePages_Total, HugePages_Free, HugePages_Rsvd, HugePages_Surp, Hugepagesize, Hugetlb
               See Documentation/admin-guide/mm/hugetlbpage.rst.
 DirectMap4k, DirectMap2M, DirectMap1G
index 8ba9b14723902c793a6fcde38230e314af8fd2f2..83be312159c985f77251c83f002dd53f14fe23f4 100644 (file)
@@ -162,6 +162,8 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
        show_val_kb(m, "Unaccepted:     ",
                    global_zone_page_state(NR_UNACCEPTED));
 #endif
+       show_val_kb(m, "Balloon:        ",
+                   global_node_page_state(NR_BALLOON_PAGES));
 
        hugetlb_report_meminfo(m);
 
index 37c29f3fbca839c735934ead3a8f4f13bf8b8ba7..a9db0fbd2b941a527eb977e9e42b827194166261 100644 (file)
@@ -224,6 +224,7 @@ enum node_stat_item {
 #ifdef CONFIG_HUGETLB_PAGE
        NR_HUGETLB,
 #endif
+       NR_BALLOON_PAGES,
        NR_VM_NODE_STAT_ITEMS
 };
 
index 43afb56abbd3e1f436452ef551dd8149545ccb13..6af13bcd2ab36e024177ee68ba122ac6cff9dd42 100644 (file)
@@ -260,6 +260,7 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
                        " pagetables:%lukB"
                        " sec_pagetables:%lukB"
                        " all_unreclaimable? %s"
+                       " Balloon:%lukB"
                        "\n",
                        pgdat->node_id,
                        K(node_page_state(pgdat, NR_ACTIVE_ANON)),
@@ -285,7 +286,8 @@ static void show_free_areas(unsigned int filter, nodemask_t *nodemask, int max_z
 #endif
                        K(node_page_state(pgdat, NR_PAGETABLE)),
                        K(node_page_state(pgdat, NR_SECONDARY_PAGETABLE)),
-                       str_yes_no(pgdat->kswapd_failures >= MAX_RECLAIM_RETRIES));
+                       str_yes_no(pgdat->kswapd_failures >= MAX_RECLAIM_RETRIES),
+                       K(node_page_state(pgdat, NR_BALLOON_PAGES)));
        }
 
        for_each_populated_zone(zone) {
index ed49a86348f7af95007318040afdf09155f1ecd4..ae0e4259ac236da9260f91ee455f0867ff929236 100644 (file)
@@ -1277,6 +1277,7 @@ const char * const vmstat_text[] = {
 #ifdef CONFIG_HUGETLB_PAGE
        "nr_hugetlb",
 #endif
+       "nr_balloon_pages",
        /* system-wide enum vm_stat_item counters */
        "nr_dirty_threshold",
        "nr_dirty_background_threshold",