Blob Blame History Raw
From b1bbc63b6baff9c5aaf30393cec29112b3abca25 Mon Sep 17 00:00:00 2001
From: Michal Hocko <mhocko@suse.com>
Date: Tue, 4 Jul 2023 13:38:11 +0200
Subject: [PATCH] memcg: drop kmem.limit_in_bytes
Git-commit: 86327e8eb94c52eca4f93cfece2e29d1bf52acbf
Patch-mainline: v6.6-rc1
References: bsc#1208788, bsc#1212905

kmem.limit_in_bytes (v1 way to limit kernel memory usage) has been
deprecated since 58056f77502f ("memcg, kmem: further deprecate
kmem.limit_in_bytes") merged in 5.16. We haven't heard about any
serious users since then but it seems that the mere presence of the file
is causing more harm thatn good. We (SUSE) have had several bug reports
from customers where Docker based containers started to fail because a
write to kmem.limit_in_bytes has failed.

This was unexpected because runc code only expects ENOENT (kmem
disabled) or EBUSY (tasks already running within cgroup). So a new error
code was unexpected and the whole container startup failed. This has
been later addressed by
https://github.com/opencontainers/runc/commit/52390d68040637dfc77f9fda6bbe70952423d380
so current Docker runtimes do not suffer from the problem anymore. There
are still older version of Docker in use and likely hard to get rid of
completely.

Address this by wiping out the file completely and effectively get back
to pre 4.5 era and CONFIG_MEMCG_KMEM=n configuration.

I would recommend backporting to stable trees which have picked up
58056f77502f ("memcg, kmem: further deprecate kmem.limit_in_bytes").

Cc: stable
Signed-off-by: Michal Hocko <mhocko@suse.com>
[mkoutny: Adjust context for SLE12-SP5]
---
 Documentation/cgroup-v1/memory.txt |    2 --
 mm/memcontrol.c                    |   10 ----------
 2 files changed, 12 deletions(-)

--- a/Documentation/cgroup-v1/memory.txt
+++ b/Documentation/cgroup-v1/memory.txt
@@ -78,8 +78,6 @@ Brief summary of control files.
  memory.oom_control		 # set/show oom controls.
  memory.numa_stat		 # show the number of memory usage per numa node
 
- memory.kmem.limit_in_bytes          This knob is deprecated and writing to
-                                     it will return -ENOTSUPP.
  memory.kmem.usage_in_bytes      # show current kernel memory allocation
  memory.kmem.failcnt             # show the number of kernel memory usage hits limits
  memory.kmem.max_usage_in_bytes  # show max kernel memory usage recorded
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3029,10 +3029,6 @@ static ssize_t mem_cgroup_write(struct k
 		case _MEMSWAP:
 			ret = mem_cgroup_resize_memsw_limit(memcg, nr_pages);
 			break;
-		case _KMEM:
-			/* kmem.limit_in_bytes is deprecated. */
-			ret = -EOPNOTSUPP;
-			break;
 		case _TCP:
 			ret = memcg_update_tcp_limit(memcg, nr_pages);
 			break;
@@ -4048,12 +4044,6 @@ static struct cftype mem_cgroup_legacy_f
 	},
 #endif
 	{
-		.name = "kmem.limit_in_bytes",
-		.private = MEMFILE_PRIVATE(_KMEM, RES_LIMIT),
-		.write = mem_cgroup_write,
-		.read_u64 = mem_cgroup_read_u64,
-	},
-	{
 		.name = "kmem.usage_in_bytes",
 		.private = MEMFILE_PRIVATE(_KMEM, RES_USAGE),
 		.read_u64 = mem_cgroup_read_u64,