lowmem: Modify to move cgroup when pid is child 66/308966/4 accepted/tizen/7.0/unified/20240405.054412
authorSangYoun Kwak <sy.kwak@samsung.com>
Wed, 3 Apr 2024 06:27:24 +0000 (15:27 +0900)
committerSangYoun Kwak <sy.kwak@samsung.com>
Thu, 4 Apr 2024 06:23:57 +0000 (15:23 +0900)
Previously, if pid is child's pid and try to move cgroup of it, resourced
does nothing because child pids should be moved with their parent
process.

In the case of Android app, its pid should be grouped with its
corresponding dummy app(Tizen app, android-launcher), but it is treated
as a child of dummy app, resourced does nothing and it is not registered
to the cgroup's tasks.

To fix this issue, modify to call lowmem_limit_move_cgroup() to write
all pids of parent process even if the target(to move cgroup) is child pid.

Change-Id: I1815e06fb888682942cfb73693552215162121d8
Signed-off-by: SangYoun Kwak <sy.kwak@samsung.com>
src/resource-limiter/memory/lowmem.c

index 91cb9fe..12c6f9b 100644 (file)
@@ -1114,8 +1114,27 @@ static void lowmem_move_memcgroup(int pid, int next_oom_score_adj, struct proc_a
                switch (next_memcg_idx) {
                case MEMCG_ROOT:
                case MEMCG_BACKGROUND_LRU:
-                       if (pai->memory.use_mem_limit)
+                       if (pai->memory.use_mem_limit) {
+                               /**
+                                * FIXME:
+                                * Calling lowmem_limit_move_cgroup will write
+                                * all pids in the pai to its corresponding
+                                * cgroup node.
+                                * Normally, it has no effect but can fix
+                                * abnormal situation such as 'some pids are
+                                * added to the pai but not appeared in the
+                                * cgroup'.
+                                * This situation can be generated when the
+                                * "AppGroup" signal is sent from the AMD but
+                                * the child pid to group with is not managed by
+                                * the resourced.
+                                */
+                               int ret = lowmem_limit_move_cgroup(pai);
+                               assert(ret != RESOURCED_ERROR_NO_DATA);
+                               if (ret != RESOURCED_ERROR_NONE)
+                                       _E("Failed to move cgroup for child pid(%d)", pid);
                                return;
+                       }
                        break;
                case MEMCG_BACKGROUND_MRU:
                        break;