core: when looking for the unit for a process, look at the PID hashmaps first
authorLennart Poettering <lennart@poettering.net>
Tue, 1 Sep 2015 16:47:46 +0000 (18:47 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 1 Sep 2015 16:47:46 +0000 (18:47 +0200)
It's cheaper that going to cgroupfs, and also usually the better choice
since it's not racy and can map PIDs even if they were moved to a
different unit.

src/core/cgroup.c

index aafd75f..e92d2cc 100644 (file)
@@ -1005,6 +1005,7 @@ Unit* manager_get_unit_by_cgroup(Manager *m, const char *cgroup) {
 
 Unit *manager_get_unit_by_pid(Manager *m, pid_t pid) {
         _cleanup_free_ char *cgroup = NULL;
+        Unit *u;
         int r;
 
         assert(m);
@@ -1012,6 +1013,14 @@ Unit *manager_get_unit_by_pid(Manager *m, pid_t pid) {
         if (pid <= 1)
                 return NULL;
 
+        u = hashmap_get(m->watch_pids1, LONG_TO_PTR(pid));
+        if (u)
+                return u;
+
+        u = hashmap_get(m->watch_pids2, LONG_TO_PTR(pid));
+        if (u)
+                return u;
+
         r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, pid, &cgroup);
         if (r < 0)
                 return NULL;