[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <94a10c772c50d378b81dad654476551bfc50e3d7.1655242024.git.tim.c.chen@linux.intel.com>
Date: Tue, 14 Jun 2022 15:25:33 -0700
From: Tim Chen <tim.c.chen@...ux.intel.com>
To: linux-mm@...ck.org, akpm@...ux-foundation.org
Cc: Tim Chen <tim.c.chen@...ux.intel.com>, Wei Xu <weixugc@...gle.com>,
Huang Ying <ying.huang@...el.com>,
Greg Thelen <gthelen@...gle.com>,
Yang Shi <shy828301@...il.com>,
Davidlohr Bueso <dave@...olabs.net>,
Brice Goglin <brice.goglin@...il.com>,
Michal Hocko <mhocko@...nel.org>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
Hesham Almatary <hesham.almatary@...wei.com>,
Dave Hansen <dave.hansen@...el.com>,
Jonathan Cameron <Jonathan.Cameron@...wei.com>,
Alistair Popple <apopple@...dia.com>,
Dan Williams <dan.j.williams@...el.com>,
Feng Tang <feng.tang@...el.com>,
Jagdish Gediya <jvgediya@...ux.ibm.com>,
Baolin Wang <baolin.wang@...ux.alibaba.com>,
David Rientjes <rientjes@...gle.com>,
"Aneesh Kumar K . V" <aneesh.kumar@...ux.ibm.com>,
Shakeel Butt <shakeelb@...gle.com>
Subject: [RFC PATCH 1/3] mm/memory-tiers Add functions for tier memory usage in a cgroup
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
Powered by blists - more mailing lists