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