lowmem: Modify to move cgroup when pid is child 44/309044/1 accepted/tizen/8.0/unified/20240405.142053
authorSangYoun Kwak <sy.kwak@samsung.com>
Thu, 4 Apr 2024 06:38:53 +0000 (15:38 +0900)
committerSangYoun Kwak <sy.kwak@samsung.com>
Thu, 4 Apr 2024 06:38:53 +0000 (15:38 +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: I0fd516025e2f0dddd4571f5325c54ef44296bc1c
Signed-off-by: SangYoun Kwak <sy.kwak@samsung.com>
src/resource-limiter/memory/lowmem-controller.c

index ecfcf3e..379257a 100644 (file)
@@ -358,8 +358,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;