lkml.org 
[lkml]   [2022]   [Jun]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC PATCH 1/3] mm/memory-tiers Add functions for tier memory usage in a cgroup
Date
Add functions to provide tier based memory usage.  This is in preparation
for query via sysfs and for controlling a cgroup's top tier memory usage.

This patch introduces the tiered memory usage query interface and a
simple implementation. A more efficient implementation to get toptier
memory usage will be introduced in the next patch.
---
include/linux/memory-tiers.h | 2 ++
mm/memcontrol.c | 35 +++++++++++++++++++++++++++++++++++
mm/memory-tiers.c | 3 ++-
3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/include/linux/memory-tiers.h b/include/linux/memory-tiers.h
index de4098f6d5d5..1177dcbbdeda 100644
--- a/include/linux/memory-tiers.h
+++ b/include/linux/memory-tiers.h
@@ -31,6 +31,8 @@ struct memory_tier {
};

extern bool numa_demotion_enabled;
+extern struct list_head memory_tiers;
+
int node_create_and_set_memory_tier(int node, int tier);
int next_demotion_node(int node);
int node_set_memory_tier(int node, int tier);
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index abec50f31fe6..2f6e95e6d200 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -63,6 +63,7 @@
#include <linux/resume_user_mode.h>
#include <linux/psi.h>
#include <linux/seq_buf.h>
+#include <linux/memory-tiers.h>
#include "internal.h"
#include <net/sock.h>
#include <net/ip.h>
@@ -3921,6 +3922,40 @@ static int memcg_numa_stat_show(struct seq_file *m, void *v)

return 0;
}
+
+unsigned long mem_cgroup_memtier_usage(struct mem_cgroup *memcg,
+ struct memory_tier *memtier)
+{
+ int node;
+ struct memory_tier *node_tier;
+ unsigned long usage = 0;
+
+ if (!memcg)
+ return 0;
+
+ rcu_read_lock();
+ for_each_online_node(node) {
+ node_tier = node_get_memory_tier(node);
+ if (node_tier == memtier)
+ usage += mem_cgroup_node_nr_lru_pages(memcg, node,
+ LRU_ALL, true);
+ node_put_memory_tier(node_tier);
+ }
+ rcu_read_unlock();
+ return usage;
+}
+
+unsigned long mem_cgroup_toptier_usage(struct mem_cgroup *memcg)
+{
+ struct memory_tier *top_tier;
+
+ top_tier = list_first_entry(&memory_tiers, struct memory_tier, list);
+ if (top_tier)
+ return mem_cgroup_memtier_usage(memcg, top_tier);
+ else
+ return 0;
+}
+
#endif /* CONFIG_NUMA */

static const unsigned int memcg1_stats[] = {
diff --git a/mm/memory-tiers.c b/mm/memory-tiers.c
index 0dae3114e22c..d552ac1e9d57 100644
--- a/mm/memory-tiers.c
+++ b/mm/memory-tiers.c
@@ -16,7 +16,8 @@ struct demotion_nodes {
#define to_memory_tier(device) container_of(device, struct memory_tier, dev)
static void establish_migration_targets(void);
static DEFINE_MUTEX(memory_tier_lock);
-static LIST_HEAD(memory_tiers);
+LIST_HEAD(memory_tiers);
+EXPORT_SYMBOL(memory_tiers);
static int top_tier_rank;
/*
* node_demotion[] examples:
--
2.35.1
\
 
 \ /
  Last update: 2022-06-15 00:27    [W:0.110 / U:1.132 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site