From: Dave Airlie <airl...@redhat.com>

These will be used to track pages actively allocated to the GPU,
and unused pages in pools that can be reclaimed by the shrinker.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 Documentation/filesystems/proc.rst | 6 ++++++
 drivers/base/node.c                | 5 +++++
 fs/proc/meminfo.c                  | 6 ++++++
 include/linux/mmzone.h             | 2 ++
 mm/show_mem.c                      | 9 +++++++--
 mm/vmstat.c                        | 2 ++
 6 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/Documentation/filesystems/proc.rst 
b/Documentation/filesystems/proc.rst
index 2a17865dfe39..224b0568cf99 100644
--- a/Documentation/filesystems/proc.rst
+++ b/Documentation/filesystems/proc.rst
@@ -1093,6 +1093,8 @@ Example output. You may not have all of these fields.
     CmaFree:               0 kB
     Unaccepted:            0 kB
     Balloon:               0 kB
+    GPUActive:             0 kB
+    GPUReclaim:            0 kB
     HugePages_Total:       0
     HugePages_Free:        0
     HugePages_Rsvd:        0
@@ -1271,6 +1273,10 @@ Unaccepted
               Memory that has not been accepted by the guest
 Balloon
               Memory returned to Host by VM Balloon Drivers
+GPUActive
+              Memory allocated to GPU objects
+GPUReclaim
+              Memory in GPU allocator pools that is reclaimable
 HugePages_Total, HugePages_Free, HugePages_Rsvd, HugePages_Surp, Hugepagesize, 
Hugetlb
               See Documentation/admin-guide/mm/hugetlbpage.rst.
 DirectMap4k, DirectMap2M, DirectMap1G
diff --git a/drivers/base/node.c b/drivers/base/node.c
index cd13ef287011..669b1e1968a2 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -454,6 +454,8 @@ static ssize_t node_read_meminfo(struct device *dev,
 #ifdef CONFIG_UNACCEPTED_MEMORY
                             "Node %d Unaccepted:     %8lu kB\n"
 #endif
+                            "Node %d GPUActive:      %8lu kB\n"
+                            "Node %d GPUReclaim:     %8lu kB\n"
                             ,
                             nid, K(node_page_state(pgdat, NR_FILE_DIRTY)),
                             nid, K(node_page_state(pgdat, NR_WRITEBACK)),
@@ -487,6 +489,9 @@ static ssize_t node_read_meminfo(struct device *dev,
                             ,
                             nid, K(sum_zone_node_page_state(nid, 
NR_UNACCEPTED))
 #endif
+                            ,
+                            nid, K(node_page_state(pgdat, NR_GPU_ACTIVE)),
+                            nid, K(node_page_state(pgdat, NR_GPU_RECLAIM))
                            );
        len += hugetlb_report_node_meminfo(buf, len, nid);
        return len;
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index 83be312159c9..baf537044115 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -165,6 +165,12 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
        show_val_kb(m, "Balloon:        ",
                    global_node_page_state(NR_BALLOON_PAGES));
 
+       show_val_kb(m, "GPUActive:      ",
+                   global_node_page_state(NR_GPU_ACTIVE));
+
+       show_val_kb(m, "GPUReclaim:     ",
+                   global_node_page_state(NR_GPU_RECLAIM));
+
        hugetlb_report_meminfo(m);
 
        arch_report_meminfo(m);
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 6ccec1bf2896..ddc1b9b2a5e3 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -226,6 +226,8 @@ enum node_stat_item {
        NR_HUGETLB,
 #endif
        NR_BALLOON_PAGES,
+       NR_GPU_ACTIVE,          /* GPU pages assigned to an object */
+       NR_GPU_RECLAIM,         /* GPU pages in shrinkable pool */
        NR_VM_NODE_STAT_ITEMS
 };
 
diff --git a/mm/show_mem.c b/mm/show_mem.c
index 6af13bcd2ab3..fe8cd06a9143 100644
--- a/mm/show_mem.c
+++ b/mm/show_mem.c
@@ -261,7 +261,9 @@ static void show_free_areas(unsigned int filter, nodemask_t 
*nodemask, int max_z
                        " sec_pagetables:%lukB"
                        " all_unreclaimable? %s"
                        " Balloon:%lukB"
-                       "\n",
+                       " gpu_active:%lukB"
+                       " gpu_reclaim:%lukB"
+                       "\n",
                        pgdat->node_id,
                        K(node_page_state(pgdat, NR_ACTIVE_ANON)),
                        K(node_page_state(pgdat, NR_INACTIVE_ANON)),
@@ -287,7 +289,10 @@ static void show_free_areas(unsigned int filter, 
nodemask_t *nodemask, int max_z
                        K(node_page_state(pgdat, NR_PAGETABLE)),
                        K(node_page_state(pgdat, NR_SECONDARY_PAGETABLE)),
                        str_yes_no(pgdat->kswapd_failures >= 
MAX_RECLAIM_RETRIES),
-                       K(node_page_state(pgdat, NR_BALLOON_PAGES)));
+                       K(node_page_state(pgdat, NR_BALLOON_PAGES)),
+                       K(node_page_state(pgdat, NR_GPU_ACTIVE)),
+                       K(node_page_state(pgdat, NR_GPU_RECLAIM)));
+
        }
 
        for_each_populated_zone(zone) {
diff --git a/mm/vmstat.c b/mm/vmstat.c
index 4c268ce39ff2..52bec6522220 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -1282,6 +1282,8 @@ const char * const vmstat_text[] = {
        "nr_hugetlb",
 #endif
        "nr_balloon_pages",
+       "nr_gpu_active",
+       "nr_gpu_reclaim",
        /* system-wide enum vm_stat_item counters */
        "nr_dirty_threshold",
        "nr_dirty_background_threshold",
-- 
2.49.0

Reply via email to