94f5018 core: Avoid spurious realization of unit cgroups

1 file Authored by Michal Koutný 2 years ago, Committed by zbyszek 2 years ago,
    core: Avoid spurious realization of unit cgroups
    
    Cgroups may be unnecessarily realized when they are not needed. This
    happens, e.g. for mount units parsed from /proc/$PID/mountinfo, check
    
            touch /run/ns_mount
            unshare -n sh -c "mount --bind /proc/self/ns/net /run/ns_mount"
            # no cgroup exists
            file /sys/fs/cgroup/system.slice/run-ns_mount.mount
            systemctl daemon-reload
            # the vain cgroup exists
            file /sys/fs/cgroup/system.slice/run-ns_mount.mount
    
    . (Such cgroups can account to a large number with many similar mounts.)
    
    The code already accounts for "lazy" realization (see various checks for
    Unit.cgroup_realized) but the unit_deserialize() in the reload/reexec
    path performs unconditional realization.
    
    Invalidate (and queue) the units for realization only if we know that
    they were already realized in the past. This is a safe thing to do even
    in the case the reload brings some new cgroup setting (controllers, BPF)
    because units that aren't realized will use the updated setting when the
    time for their realization comes. (It's not even needed to add a code
    comment because the current formulation suggests the changed behavior.)
    
    (cherry picked from commit cc815b7fea0ade5331e8dd22ef6b5183edb77608)
    
        
file modified
+4 -2