Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm/damon/core: implement DAMOS_QUOTA_NODE_MEMCG_USED_BP

Implement the handling of the new DAMOS quota goal metric for per-memcg
per-node memory usage, namely DAMOS_QUOTA_NODE_MEMCG_USED_BP. The metric
value is calculated as the sum of active/inactive anon/file pages of the
given cgroup for a given NUMA node.

Link: https://lkml.kernel.org/r/20251017212706.183502-4-sj@kernel.org
Signed-off-by: SeongJae Park <sj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

SeongJae Park and committed by
Andrew Morton
b74a120b 6a18bbe4

+42
+42
mm/damon/core.c
··· 10 10 #include <linux/damon.h> 11 11 #include <linux/delay.h> 12 12 #include <linux/kthread.h> 13 + #include <linux/memcontrol.h> 13 14 #include <linux/mm.h> 14 15 #include <linux/psi.h> 15 16 #include <linux/slab.h> ··· 788 787 case DAMOS_QUOTA_NODE_MEM_USED_BP: 789 788 case DAMOS_QUOTA_NODE_MEM_FREE_BP: 790 789 dst->nid = src->nid; 790 + break; 791 + case DAMOS_QUOTA_NODE_MEMCG_USED_BP: 792 + dst->nid = src->nid; 793 + dst->memcg_id = src->memcg_id; 791 794 break; 792 795 default: 793 796 break; ··· 2040 2035 numerator = i.freeram; 2041 2036 return numerator * 10000 / i.totalram; 2042 2037 } 2038 + 2039 + static unsigned long damos_get_node_memcg_used_bp( 2040 + struct damos_quota_goal *goal) 2041 + { 2042 + struct mem_cgroup *memcg; 2043 + struct lruvec *lruvec; 2044 + unsigned long used_pages; 2045 + struct sysinfo i; 2046 + 2047 + rcu_read_lock(); 2048 + memcg = mem_cgroup_from_id(goal->memcg_id); 2049 + rcu_read_unlock(); 2050 + if (!memcg) { 2051 + if (goal->metric == DAMOS_QUOTA_NODE_MEMCG_USED_BP) 2052 + return 0; 2053 + else /* DAMOS_QUOTA_NODE_MEMCG_FREE_BP */ 2054 + return 10000; 2055 + } 2056 + mem_cgroup_flush_stats(memcg); 2057 + lruvec = mem_cgroup_lruvec(memcg, NODE_DATA(goal->nid)); 2058 + used_pages = lruvec_page_state(lruvec, NR_ACTIVE_ANON); 2059 + used_pages += lruvec_page_state(lruvec, NR_INACTIVE_ANON); 2060 + used_pages += lruvec_page_state(lruvec, NR_ACTIVE_FILE); 2061 + used_pages += lruvec_page_state(lruvec, NR_INACTIVE_FILE); 2062 + 2063 + si_meminfo_node(&i, goal->nid); 2064 + return used_pages * 10000 / i.totalram; 2065 + } 2043 2066 #else 2044 2067 static __kernel_ulong_t damos_get_node_mem_bp( 2068 + struct damos_quota_goal *goal) 2069 + { 2070 + return 0; 2071 + } 2072 + 2073 + static unsigned long damos_get_node_memcg_used_bp( 2045 2074 struct damos_quota_goal *goal) 2046 2075 { 2047 2076 return 0; ··· 2099 2060 case DAMOS_QUOTA_NODE_MEM_USED_BP: 2100 2061 case DAMOS_QUOTA_NODE_MEM_FREE_BP: 2101 2062 goal->current_value = damos_get_node_mem_bp(goal); 2063 + break; 2064 + case DAMOS_QUOTA_NODE_MEMCG_USED_BP: 2065 + goal->current_value = damos_get_node_memcg_used_bp(goal); 2102 2066 break; 2103 2067 default: 2104 2068 break;