[RFC 0/4] Introduce unbalance proactive reclaim

From: Huan Yang
Date: Wed Nov 08 2023 - 01:59:18 EST


In some cases, we need to selectively reclaim file pages or anonymous
pages in an unbalanced manner.

For example, when an application is pushed to the background and frozen,
it may not be opened for a long time, and we can safely reclaim the
application's anonymous pages, but we do not want to touch the file pages.

This patchset extends the proactive reclaim interface to achieve
unbalanced reclamation. Users can control the reclamation tendency by
inputting swappiness under the original interface. Specifically, users
can input special values to extremely reclaim specific pages.

Example:
echo "1G" 200 > memory.reclaim (only reclaim anon)
echo "1G" 0 > memory.reclaim (only reclaim file)
echo "1G" 1 > memory.reclaim (only reclaim file)

Note that when performing unbalanced reclamation, the cgroup swappiness
will be temporarily adjusted dynamically to the input value. Therefore,
if the cgroup swappiness is further modified during runtime, there may
be some errors.

However, this is acceptable because the interface is dynamically called
by the user and the timing should be controlled by the user.

This patchset did not implement the type-based reclamation as expected
in the documentation.(anon or file) Because in addition to extreme unbalanced
reclamation, this patchset can also adapt to the reclamation tendency
allocated according to swappiness, which is more flexible.

Self test
========
After applying the following patches and myself debug patch, my self-test
results are as follows:

1. LRU test
===========
a. Anon unbalance reclaim
```
cat memory.stat | grep anon
inactive_anon 7634944
active_anon 7741440

echo "200M" 200 > memory.reclaim

cat memory.stat | grep anon
inactive_anon 0
active_anon 0

cat memory.reclaim_stat_summary(self debug interface)
[22368]sh total reclaimed 0 file, 3754 anon, covered item=0
```

b. File unbalance reclaim
```
cat memory.stat | grep file
inactive_file 82862080
active_file 48664576

echo "100M" 0 > memory.reclaim
cat memory.stat | grep file
inactive_file 34164736
active_file 18370560

cat memory.reclaim_stat_summary(self debug interface)
[22368]sh total reclaimed 13732 file, 0 anon, covered item=0
```

2. MGLRU test
============
a. Anon unbalance reclaim
```
echo y > /sys/kernel/mm/lru_gen/enabled
cat /sys/kernel/mm/lru_gen/enabled
0x0003

cat memory.stat | grep anon
inactive_anon 17653760
active_anon 1740800

echo "100M" 200 > memory.reclaim

cat memory.reclaim_stat_summary
[8251]sh total reclaimed 0 file, 5393 anon, covered item=0
```

b. File unbalance reclaim
```
cat memory.stat | grep file
inactive_file 17858560
active_file 5943296

echo "100M" 0 > memory.reclaim

cat memory.stat | grep file
inactive_file 491520
active_file 2764800
cat memory.reclaim_stat_summary
[8251]sh total reclaimed 5230 file, 0 anon, covered item=0
```

Patch 1-3 implement the functionality described above.
Patch 4 aims to implement proactive reclamation to the cgroupv1 interface
for use on Android.

Huan Yang (4):
mm: vmscan: LRU unbalance cgroup reclaim
mm: multi-gen LRU: MGLRU unbalance reclaim
mm: memcg: implement unbalance proactive reclaim
mm: memcg: apply proactive reclaim into cgroupv1

.../admin-guide/cgroup-v1/memory.rst | 38 +++++-
Documentation/admin-guide/cgroup-v2.rst | 16 ++-
include/linux/swap.h | 1 +
mm/memcontrol.c | 126 ++++++++++++------
mm/vmscan.c | 38 +++++-
5 files changed, 169 insertions(+), 50 deletions(-)

--
2.34.1