[Devel] [PATCH vz10 02/14] mm: fix VZ build errors with CONFIG_MEMCG=n

Eva Kurchatova eva.kurchatova at virtuozzo.com
Fri Jun 26 01:08:04 MSK 2026


Guard VZ-specific code that uses memory cgroup internals
(memory_cgrp_id, struct mem_cgroup, root_mem_cgroup) with
CONFIG_MEMCG.

Without CONFIG_MEMCG:
- oom_berserker() and oom_kill_memcg_member() dereference struct
  mem_cgroup fields that do not exist.
- si_meminfo_ve(), fill_meminfo_ve(), and fill_vmstat_ve() use
  memory_cgrp_id and mem_cgroup_from_css() which are undeclared.
- proc_oom_score() VE-specific path references memory_cgrp_id.

Wrap affected functions and their call sites with CONFIG_MEMCG (or
CONFIG_VE && CONFIG_MEMCG where appropriate) and provide stubs where
needed.  Also guard VZ-specific nid field accesses in memcontrol.c
with CONFIG_MEMCG_V1 and move the numa_migrate cftypes entry inside
the existing CONFIG_NUMA block.

Signed-off-by: Eva Kurchatova <eva.kurchatova at virtuozzo.com>

https://virtuozzo.atlassian.net/browse/VSTOR-134732
Feature: fix kunit
---
 fs/proc/base.c    | 4 ++++
 fs/proc/meminfo.c | 4 ++++
 mm/memcontrol.c   | 9 +++++++--
 mm/oom_kill.c     | 8 ++++++++
 mm/show_mem.c     | 2 ++
 mm/vmstat.c       | 7 +++++--
 6 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/fs/proc/base.c b/fs/proc/base.c
index 8174b2a8a5dc..db7d304f1905 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -692,6 +692,7 @@ static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns,
 	unsigned long points = 0;
 	long badness;
 
+#ifdef CONFIG_MEMCG
 	scoped_guard (rcu) {
 		struct cgroup_subsys_state *css = task_css(task, memory_cgrp_id);
 
@@ -702,6 +703,9 @@ static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns,
 			memcg = mem_cgroup_from_css(css);
 			totalpages = mem_cgroup_get_max(memcg);
 		}
+#else
+	scoped_guard (rcu) {
+#endif
 	}
 
 	badness = oom_badness(task, totalpages, NULL);
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index ac3c88e68728..4db69eed0e21 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -73,6 +73,7 @@ static int meminfo_proc_show_mi(struct seq_file *m, struct meminfo *mi)
        return 0;
 }
 
+#if defined(CONFIG_VE) && defined(CONFIG_MEMCG)
 static void fill_meminfo_ve(struct meminfo *mi, struct ve_struct *ve)
 {
 	struct cgroup_subsys_state *css;
@@ -84,6 +85,7 @@ static void fill_meminfo_ve(struct meminfo *mi, struct ve_struct *ve)
 	css_put(css);
 
 }
+#endif
 
 static int meminfo_proc_show_ve(struct seq_file *m, void *v,
 				struct ve_struct *ve)
@@ -104,11 +106,13 @@ static int meminfo_proc_show_ve(struct seq_file *m, void *v,
         mi.si = &i;
         mi.ve = ve;
 
+#if defined(CONFIG_VE) && defined(CONFIG_MEMCG)
 	if (!ve_is_super(ve) && ve->meminfo_val == VE_MEMINFO_DEFAULT) {
 		fill_meminfo_ve(&mi, ve);
 
 		return meminfo_proc_show_mi(m, &mi);
 	}
+#endif
 
 	committed = vm_memory_committed();
 
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 6301319529ee..c27ee90e599c 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -714,8 +714,11 @@ percpu_stats_memcg(struct mem_cgroup *memcg, struct mem_cgroup_per_node **pn)
 	} while (memcg->percpu_stats_disabled);
 
 	if (pn) {
+#ifdef CONFIG_MEMCG_V1
 		unsigned int nid = (*pn)->nid;
-
+#else
+		unsigned int nid = lruvec_pgdat(&(*pn)->lruvec)->node_id;
+#endif
 		*pn = memcg->nodeinfo[nid];
 	}
 	return memcg;
@@ -4179,7 +4182,9 @@ static bool alloc_mem_cgroup_per_node_info(struct mem_cgroup *memcg, int node)
 
 	lruvec_init(&pn->lruvec);
 	pn->memcg = memcg;
+#ifdef CONFIG_MEMCG_V1
 	pn->nid = node;
+#endif
 
 	memcg->nodeinfo[node] = pn;
 	return true;
@@ -5258,12 +5263,12 @@ static struct cftype memory_files[] = {
 		.name = "numa_stat",
 		.seq_show = memory_numa_stat_show,
 	},
-#endif
 	{
 		.name = "numa_migrate",
 		.flags = CFTYPE_NOT_ON_ROOT,
 		.write = memcg_numa_migrate_write,
 	},
+#endif
 	{
 		.name = "oom.group",
 		.flags = CFTYPE_NOT_ON_ROOT | CFTYPE_NS_DELEGATABLE,
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 1fd5f99ce3b9..b26a15072d06 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -1034,6 +1034,7 @@ static void __oom_kill_process(struct task_struct *victim, const char *message)
  * Kill provided task unless it's secured by setting
  * oom_score_adj to OOM_SCORE_ADJ_MIN.
  */
+#ifdef CONFIG_MEMCG
 static int oom_kill_memcg_member(struct task_struct *task, void *message)
 {
 	if (task->signal->oom_score_adj != OOM_SCORE_ADJ_MIN &&
@@ -1043,10 +1044,12 @@ static int oom_kill_memcg_member(struct task_struct *task, void *message)
 	}
 	return 0;
 }
+#endif
 
 /*
  * Kill more processes if oom happens too often in this context.
  */
+#ifdef CONFIG_MEMCG
 static void oom_berserker(struct oom_control *oc)
 {
 	static DEFINE_RATELIMIT_STATE(berserker_rs,
@@ -1150,6 +1153,9 @@ static void oom_berserker(struct oom_control *oc)
 
 	pr_err("OOM killer in rage %d: %d tasks killed\n", rage, killed);
 }
+#else
+static inline void oom_berserker(struct oom_control *oc) { }
+#endif /* CONFIG_MEMCG */
 
 atomic_t global_oom = ATOMIC_INIT(0);
 
@@ -1196,6 +1202,7 @@ static void oom_kill_process(struct oom_control *oc, const char *message)
 	/*
 	 * If necessary, kill all tasks in the selected memory cgroup.
 	 */
+#ifdef CONFIG_MEMCG
 	if (oom_group) {
 		memcg_memory_event(oom_group, MEMCG_OOM_GROUP_KILL);
 		mem_cgroup_print_oom_group(oom_group);
@@ -1203,6 +1210,7 @@ static void oom_kill_process(struct oom_control *oc, const char *message)
 				      (void *)message);
 		mem_cgroup_put(oom_group);
 	}
+#endif
 	oom_berserker(oc);
 }
 
diff --git a/mm/show_mem.c b/mm/show_mem.c
index 3ab11c945bf4..4c879177a531 100644
--- a/mm/show_mem.c
+++ b/mm/show_mem.c
@@ -91,6 +91,7 @@ void si_meminfo(struct sysinfo *val)
 
 EXPORT_SYMBOL(si_meminfo);
 
+#if defined(CONFIG_VE) && defined(CONFIG_MEMCG)
 void si_meminfo_ve(struct sysinfo *si, struct ve_struct *ve)
 {
 	unsigned long memtotal, memused, swaptotal, swapused;
@@ -138,6 +139,7 @@ void si_meminfo_ve(struct sysinfo *si, struct ve_struct *ve)
 	/* bufferram, totalhigh and freehigh left 0 */
 }
 EXPORT_SYMBOL(si_meminfo_ve);
+#endif
 
 #ifdef CONFIG_NUMA
 void si_meminfo_node(struct sysinfo *val, int nid)
diff --git a/mm/vmstat.c b/mm/vmstat.c
index 47cb6bf4ecec..de4f8b4e51b6 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -1855,6 +1855,7 @@ static const struct seq_operations zoneinfo_op = {
 			 (IS_ENABLED(CONFIG_VM_EVENT_COUNTERS) ? \
 			  NR_VM_EVENT_ITEMS : 0))
 
+#if defined(CONFIG_VE) && defined(CONFIG_MEMCG)
 static void fill_vmstat_ve(unsigned long *stat, struct ve_struct *ve)
 {
 	struct cgroup_subsys_state *css;
@@ -1863,10 +1864,10 @@ static void fill_vmstat_ve(unsigned long *stat, struct ve_struct *ve)
 	mem_cgroup_fill_vmstat(mem_cgroup_from_css(css), stat);
 	css_put(css);
 }
+#endif
 
 static void *vmstat_start(struct seq_file *m, loff_t *pos)
 {
-	struct ve_struct *ve;
 	unsigned long *v;
 	int i;
 
@@ -1880,12 +1881,14 @@ static void *vmstat_start(struct seq_file *m, loff_t *pos)
 	if (!v)
 		return ERR_PTR(-ENOMEM);
 
-	ve = get_exec_env();
+#if defined(CONFIG_VE) && defined(CONFIG_MEMCG)
+	struct ve_struct *ve = get_exec_env();
 	if (!ve_is_super(ve)) {
 		memset(v, 0, NR_VMSTAT_ITEMS * sizeof(unsigned long));
 		fill_vmstat_ve(v, ve);
 		return (unsigned long *)m->private + *pos;
 	}
+#endif
 
 	for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
 		v[i] = global_zone_page_state(i);
-- 
2.54.0



More information about the Devel mailing list