2022-06-14 22:43:01

by Tim Chen

[permalink] [raw]
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


2022-06-21 04:35:21

by Aneesh Kumar K.V

[permalink] [raw]
Subject: Re: [RFC PATCH 1/3] mm/memory-tiers Add functions for tier memory usage in a cgroup

Tim Chen <[email protected]> writes:

+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;
> +}

As discussed here, we would want to consider all memory tiers that got
compute as top tier.

https://lore.kernel.org/linux-mm/[email protected]

V6 patchset actually walk the full memory tier hierarchy reverse and consider any
memory tier with higher or equal rank value than the first memory tier with CPU as top tier.

https://lore.kernel.org/linux-mm/[email protected]

-aneesh

2022-06-23 23:27:18

by Tim Chen

[permalink] [raw]
Subject: Re: [RFC PATCH 1/3] mm/memory-tiers Add functions for tier memory usage in a cgroup

On Tue, 2022-06-21 at 09:48 +0530, Aneesh Kumar K.V wrote:
> Tim Chen <[email protected]> writes:
>
> +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;
> > +}
>
> As discussed here, we would want to consider all memory tiers that got
> compute as top tier.
>
> https://lore.kernel.org/linux-mm/[email protected]
>
> V6 patchset actually walk the full memory tier hierarchy reverse and consider any
> memory tier with higher or equal rank value than the first memory tier with CPU as top tier.
>
> https://lore.kernel.org/linux-mm/[email protected]
>

Thanks. Will take that into consideration for future patches.

Tim