cgroups: try /sys/fs/cgroup/cpuset first

With newer systemd systems, /sys/fs/cgroup/ is read-only, so we have
to create our subgroups under existing points.

In case the paths are symlinks, make sure we fully resolve the mount
point so that when we walk the mounted list, we can correctly find it.

BUG=chromium:441992
TEST=None

Change-Id: Ida26f6decdd075cb14669beb499d621ca92c53e6
(cherry picked from commit bafdb8fc52d12d88d4b2e51a696f1566827277e7)
Reviewed-on: https://chromium-review.googlesource.com/1139517
Tested-by: Mike Frysinger <vapier@chromium.org>
Reviewed-by: Mike Frysinger <vapier@chromium.org>
diff --git a/lib/cgroups.py b/lib/cgroups.py
index 6b29472..c75f212 100644
--- a/lib/cgroups.py
+++ b/lib/cgroups.py
@@ -100,7 +100,7 @@
 
   NEEDED_SUBSYSTEMS = ('cpuset',)
   PROC_PATH = '/proc/cgroups'
-  _MOUNT_ROOT_POTENTIALS = ('/sys/fs/cgroup',)
+  _MOUNT_ROOT_POTENTIALS = ('/sys/fs/cgroup/cpuset', '/sys/fs/cgroup')
   _MOUNT_ROOT_FALLBACK = '/dev/cgroup'
   CGROUP_ROOT = None
   MOUNT_ROOT = None
@@ -116,8 +116,9 @@
       return False
 
     def _EnsureMounted(mnt, args):
-      if _FileContains('/proc/mounts', [mnt]):
-        return True
+      for mtab in osutils.IterateMountPoints():
+        if mtab.destination == mnt:
+          return True
 
       # Grab a lock so in the off chance we have multiple programs (like two
       # cros_sdk launched in parallel) running this init logic, we don't end
@@ -125,8 +126,9 @@
       lock_path = '/tmp/.chromite.cgroups.lock'
       with locking.FileLock(lock_path, 'cgroup lock') as lock:
         lock.write_lock()
-        if _FileContains('/proc/mounts', [mnt]):
-          return True
+        for mtab in osutils.IterateMountPoints():
+          if mtab.destination == mnt:
+            return True
 
         # Not all distros mount cgroup_root to sysfs.
         osutils.SafeMakedirs(mnt, sudo=True)
@@ -171,6 +173,7 @@
         break
     else:
       cls.MOUNT_ROOT = cls._MOUNT_ROOT_FALLBACK
+    cls.MOUNT_ROOT = os.path.realpath(cls.MOUNT_ROOT)
 
     cls.CGROUP_ROOT = os.path.join(cls.MOUNT_ROOT, 'cros')
     return True