android_system_core/libprocessgroup
T.J. Mercier 3b5bb3a364 libprocessgroup: Poll on cgroup.events
In killProcessGroup we currently read cgroup.procs to find processes to
kill, send them kill signals until cgroup.procs is empty, then remove
the cgroup directory. The cgroup cannot be removed until all processes
are dead, otherwise we'll get an EBUSY error from the kernel.

There is a race in the kernel where cgroup.procs can read empty even
though the cgroup is pinned by processes which are still exiting, and
can't be removed yet. [1]

Let's use the populated field of cgroup.events instead of an empty
cgroup.procs file to determine when the cgroup is removable. In
addition to functioning like we expect, this is more efficient because
we can poll on cgroup.events instead of retrying kills and rereading
cgroup.procs every 5ms which should help reduce CPU contention and
cgroup lock contention.

It's still possible that it takes longer for a cgroup to become
unpopulated than our timeout allows, in which case we will fail to
remove the cgroup and leak kernel memory. But this change should help
reduce the probability of that happening.

[1] https://lore.kernel.org/all/CABdmKX3SOXpcK85a7cx3iXrwUj=i1yXqEz9i9zNkx8mB=ZXQ8A@mail.gmail.com/

Bug: 301871933
Change-Id: If7dcfb331f47e06994c9ac85ed08bbcce18cdad7
2023-12-07 00:12:00 +00:00
..
cgrouprc Annotate symbols correctly 2022-09-26 22:14:43 +09:00
cgrouprc_format [LSC] Add LOCAL_LICENSE_KINDS to system/core 2021-02-19 12:59:05 -08:00
include/processgroup libprocessgroup: Poll on cgroup.events 2023-12-07 00:12:00 +00:00
profiles Migrate the blkio controller to the v2 cgroup hierarchy 2023-11-17 11:37:24 -08:00
setup libprocessgroup: Use correct language for cgroups 2023-11-03 18:34:46 +00:00
tools libprocessgroup/tools: Add settaskprofile command-line tool 2021-11-09 22:35:51 +00:00
Android.bp libprocessgroup: Switch from gnu++-17 to gnu++-20 2022-08-18 12:34:21 -07:00
cgroup_map.cpp libprocessgroup: Proceed if activation of an optional controller fails 2023-02-10 15:02:44 -08:00
cgroup_map.h libprocessgroup: Add CgroupGetControllerFromPath API function 2021-11-08 21:24:33 +00:00
OWNERS Updating owners of libprocessgroup 2022-12-15 19:12:33 +00:00
processgroup.cpp libprocessgroup: Poll on cgroup.events 2023-12-07 00:12:00 +00:00
sched_policy.cpp libprocessgroup: fall back to cpuset in get_sched_policy 2021-12-14 10:56:34 -08:00
task_profiles.cpp libprocessgroup: Reject JoinCgroup actions for v2 controllers 2023-11-17 11:37:24 -08:00
task_profiles.h libprocessgroup: Make a log message more detailed 2023-11-17 10:11:20 -08:00
task_profiles_test.cpp libprocessgroup: Use correct language for cgroups 2023-11-03 18:34:46 +00:00