| From: xu xin <xu.xin16@zte.com.cn> |
| Subject: memcontrol-v1: add ksm_stat at memcg-v1 |
| Date: Thu, 1 May 2025 04:16:47 +0000 |
| |
| With the enablement of container-level KSM (e.g., via prctl), there is a |
| growing demand for container-level observability of KSM behavior. |
| However, current cgroup implementations lack support for exposing |
| KSM-related metrics. |
| |
| This patch introduces a new interface named ksm_stat at the cgroup |
| hierarchy level, enabling users to monitor KSM merging statistics |
| specifically for containers where this feature has been activated, |
| eliminating the need to manually inspect KSM information for each |
| individual process within the cgroup-v1. |
| |
| Since the implementation of ksm_stat has been added into memcg-v2, this |
| just add it back to memcg-v1 with the same function of traversing the |
| process of the memcg. |
| |
| Users can obtain the KSM information of a cgroup just by: |
| |
| `cat /sys/fs/cgroup/memory.ksm_stat` |
| |
| Link: https://lkml.kernel.org/r/20250501041647.3324541-1-xu.xin16@zte.com.cn |
| Signed-off-by: xu xin <xu.xin16@zte.com.cn> |
| Cc: David Hildenbrand <david@redhat.com> |
| Cc: Haonan Chen <chen.haonan2@zte.com.cn> |
| Cc: Wang Yaxin <wang.yaxin@zte.com.cn> |
| Cc: Yang Yang <yang.yang29@zte.com.cn> |
| Cc: Johannes Weiner <hannes@cmpxchg.org> |
| Cc: Michal Hocko <mhocko@kernel.org> |
| Cc: Michal Hocko <mhocko@suse.com> |
| Cc: Muchun Song <muchun.song@linux.dev> |
| Cc: Muchun Song <songmuchun@bytedance.com> |
| Cc: Roman Gushchin <roman.gushchin@linux.dev> |
| Cc: Shakeel Butt <shakeel.butt@linux.dev> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| include/linux/memcontrol.h | 7 +++++++ |
| mm/memcontrol-v1.c | 6 ++++++ |
| mm/memcontrol.c | 2 +- |
| 3 files changed, 14 insertions(+), 1 deletion(-) |
| |
| --- a/include/linux/memcontrol.h~memcontrol-v1-add-ksm_stat-at-memcg-v1 |
| +++ a/include/linux/memcontrol.h |
| @@ -939,6 +939,8 @@ unsigned long lruvec_page_state(struct l |
| unsigned long lruvec_page_state_local(struct lruvec *lruvec, |
| enum node_stat_item idx); |
| |
| +int memcg_ksm_stat_show(struct seq_file *m, void *v); |
| + |
| void mem_cgroup_flush_stats(struct mem_cgroup *memcg); |
| void mem_cgroup_flush_stats_ratelimited(struct mem_cgroup *memcg); |
| |
| @@ -1416,6 +1418,11 @@ static inline unsigned long lruvec_page_ |
| return node_page_state(lruvec_pgdat(lruvec), idx); |
| } |
| |
| +static inline int memcg_ksm_stat_show(struct seq_file *m, void *v) |
| +{ |
| + return 0; |
| +} |
| + |
| static inline void mem_cgroup_flush_stats(struct mem_cgroup *memcg) |
| { |
| } |
| --- a/mm/memcontrol.c~memcontrol-v1-add-ksm_stat-at-memcg-v1 |
| +++ a/mm/memcontrol.c |
| @@ -4491,7 +4491,7 @@ static int evaluate_memcg_ksm_stat(struc |
| return 0; |
| } |
| |
| -static int memcg_ksm_stat_show(struct seq_file *m, void *v) |
| +int memcg_ksm_stat_show(struct seq_file *m, void *v) |
| { |
| struct memcg_ksm_stat ksm_stat; |
| struct mem_cgroup *memcg = mem_cgroup_from_seq(m); |
| --- a/mm/memcontrol-v1.c~memcontrol-v1-add-ksm_stat-at-memcg-v1 |
| +++ a/mm/memcontrol-v1.c |
| @@ -2080,6 +2080,12 @@ struct cftype mem_cgroup_legacy_files[] |
| .seq_show = memcg_numa_stat_show, |
| }, |
| #endif |
| +#ifdef CONFIG_KSM |
| + { |
| + .name = "ksm_stat", |
| + .seq_show = memcg_ksm_stat_show, |
| + }, |
| +#endif |
| { |
| .name = "kmem.limit_in_bytes", |
| .private = MEMFILE_PRIVATE(_KMEM, RES_LIMIT), |
| _ |