Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24900f35 authored by Johannes Weiner's avatar Johannes Weiner Committed by Greg Kroah-Hartman
Browse files

mm: memcontrol: deprecate charge moving

commit da34a8484d162585e22ed8c1e4114aa2f60e3567 upstream.

Charge moving mode in cgroup1 allows memory to follow tasks as they
migrate between cgroups.  This is, and always has been, a questionable
thing to do - for several reasons.

First, it's expensive.  Pages need to be identified, locked and isolated
from various MM operations, and reassigned, one by one.

Second, it's unreliable.  Once pages are charged to a cgroup, there isn't
always a clear owner task anymore.  Cache isn't moved at all, for example.
Mapped memory is moved - but if trylocking or isolating a page fails,
it's arbitrarily left behind.  Frequent moving between domains may leave a
task's memory scattered all over the place.

Third, it isn't really needed.  Launcher tasks can kick off workload tasks
directly in their target cgroup.  Using dedicated per-workload groups
allows fine-grained policy adjustments - no need to move tasks and their
physical pages between control domains.  The feature was never
forward-ported to cgroup2, and it hasn't been missed.

Despite it being a niche usecase, the maintenance overhead of supporting
it is enormous.  Because pages are moved while they are live and subject
to various MM operations, the synchronization rules are complicated.
There are lock_page_memcg() in MM and FS code, which non-cgroup people
don't understand.  In some cases we've been able to shift code and cgroup
API calls around such that we can rely on native locking as much as
possible.  But that's fragile, and sometimes we need to hold MM locks for
longer than we otherwise would (pte lock e.g.).

Mark the feature deprecated. Hopefully we can remove it soon.

And backport into -stable kernels so that people who develop against
earlier kernels are warned about this deprecation as early as possible.

[akpm@linux-foundation.org: fix memory.rst underlining]
Link: https://lkml.kernel.org/r/Y5COd+qXwk/S+n8N@cmpxchg.org


Signed-off-by: default avatarJohannes Weiner <hannes@cmpxchg.org>
Acked-by: default avatarShakeel Butt <shakeelb@google.com>
Acked-by: default avatarHugh Dickins <hughd@google.com>
Acked-by: default avatarMichal Hocko <mhocko@suse.com>
Cc: Muchun Song <songmuchun@bytedance.com>
Cc: Roman Gushchin <roman.gushchin@linux.dev>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 964e9e12
Loading
Loading
Loading
Loading
+11 −2
Original line number Original line Diff line number Diff line
@@ -82,6 +82,8 @@ Brief summary of control files.
 memory.swappiness		     set/show swappiness parameter of vmscan
 memory.swappiness		     set/show swappiness parameter of vmscan
				     (See sysctl's vm.swappiness)
				     (See sysctl's vm.swappiness)
 memory.move_charge_at_immigrate     set/show controls of moving charges
 memory.move_charge_at_immigrate     set/show controls of moving charges
                                     This knob is deprecated and shouldn't be
                                     used.
 memory.oom_control		     set/show oom controls.
 memory.oom_control		     set/show oom controls.
 memory.numa_stat		     show the number of memory usage per numa
 memory.numa_stat		     show the number of memory usage per numa
				     node
				     node
@@ -745,8 +747,15 @@ NOTE2:
       It is recommended to set the soft limit always below the hard limit,
       It is recommended to set the soft limit always below the hard limit,
       otherwise the hard limit will take precedence.
       otherwise the hard limit will take precedence.


8. Move charges at task migration
8. Move charges at task migration (DEPRECATED!)
=================================
===============================================

THIS IS DEPRECATED!

It's expensive and unreliable! It's better practice to launch workload
tasks directly from inside their target cgroup. Use dedicated workload
cgroups to allow fine-grained policy adjustments without having to
move physical pages between control domains.


Users can move charges associated with a task along with task migration, that
Users can move charges associated with a task along with task migration, that
is, uncharge task's pages from the old cgroup and charge them to the new cgroup.
is, uncharge task's pages from the old cgroup and charge them to the new cgroup.
+4 −0
Original line number Original line Diff line number Diff line
@@ -3775,6 +3775,10 @@ static int mem_cgroup_move_charge_write(struct cgroup_subsys_state *css,
{
{
	struct mem_cgroup *memcg = mem_cgroup_from_css(css);
	struct mem_cgroup *memcg = mem_cgroup_from_css(css);


	pr_warn_once("Cgroup memory moving (move_charge_at_immigrate) is deprecated. "
		     "Please report your usecase to linux-mm@kvack.org if you "
		     "depend on this functionality.\n");

	if (val & ~MOVE_MASK)
	if (val & ~MOVE_MASK)
		return -EINVAL;
		return -EINVAL;