cgroupfs keeps track of processes
Posted: | More posts about gsoc debian hurd |
Tl;dr!!elfel1 Screenshot (slightly edited and annotated shell trace):
+ settrans -ca /cgroup /hurd/cgroupfs + mkdir /cgroup/init /cgroup/rootfs + echo $$ >> /cgroup/init/tasks # $$ is 6 + echo 3 >> /cgroup/rootfs/tasks # pid 3 is the root filesystem + sleep 1m & echo sleep has pid $! sleep has pid 16 + cat /proc/cmdline > /dev/null + tail /cgroup/init/tasks /cgroup/rootfs/tasks ==> /cgroup/init/tasks <== 6 16 20 ==> /cgroup/rootfs/tasks <== 3 19 17 + pstree -p init(1)-+-auth(5) |-cgroupfs(14) |-ext2fs(3)-+-exec(4) | |-null(17) | |-pflocal(8) | |-procfs(19) | `-term(7) |-mach-defpager(10) |-root=device:hd0s1(2) `-sh(6)-+-pstree(21) `-sleep(16)
Isn't she a beauty?
So we bind the cgroupfs translator to /cgroup, create two cgroups, init and rootfs, move the currently executing shell script (that later execs sysvinit) into the former and the root filesystem translator into the latter cgroup. We then spawn a sleep process and cat the content of /proc/cmdline into /dev/null which will make the root filesystem start the /hurd/procfs and the /hurd/null translator. We then inspect /cgroup/{init,rootfs}/tasks and find indeed all the newly spawned processes in the cgroup their parent process was in.
This is accomplished by:
- The cgroupfs translator: http://darnassus.sceen.net/gitweb/teythoon/cgroupfs.git/
- A way to request notifications about process changes from the /hurd/proc server: http://lists.gnu.org/archive/html/bug-hurd/2013-09/msg00029.html
I also filed a bug report containing my patches for the sysvinit package (#721917). This is the second bug report I filed during my gsoc, the first one was for the ifupdown package (#720531) which Andrew Shadura improved and merged on the very next day, thanks Andrew!
Next week I'll continue to improve the cgroupfs translator, work on the notification prototype (hopefully fixing non-root subhurds in the process, this requires a similar notification mechanism for newly created tasks and making /hurd/proc just a little subhurd aware) and trying to get my gnumach patch into a working shape (currently the parental relation of processes is a Hurd-only concept and relies upon processes telling the /hurd/proc server that a newly created process is their child. This is automatically done if the process uses fork(2) of course, but not if it uses task_create to start a new Mach task).