@@ -60,6 +60,8 @@ public class CgroupSubsystemFactory {
6060 private Path cgroupv1CgInfoNonZeroHierarchy ;
6161 private Path cgroupv1MntInfoNonZeroHierarchyOtherOrder ;
6262 private Path cgroupv1MntInfoNonZeroHierarchy ;
63+ private Path cgroupv1MntInfoDoubleCpuset ;
64+ private Path cgroupv1MntInfoDoubleCpuset2 ;
6365 private String mntInfoEmpty = "" ;
6466 private Path cgroupV1SelfCgroup ;
6567 private Path cgroupV2SelfCgroup ;
@@ -102,11 +104,14 @@ public class CgroupSubsystemFactory {
102104 "41 30 0:37 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:13 - cgroup none rw,seclabel,devices\n " +
103105 "42 30 0:38 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:14 - cgroup none rw,seclabel,cpuset\n " +
104106 "43 30 0:39 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:15 - cgroup none rw,seclabel,blkio\n " +
105- "44 30 0:40 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:16 - cgroup none rw,seclabel,freezer" ;
107+ "44 30 0:40 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:16 - cgroup none rw,seclabel,freezer\n " ;
106108 private String mntInfoHybridRest = cgroupv1MountInfoLineMemory + mntInfoHybridStub ;
107109 private String mntInfoHybridMissingMemory = mntInfoHybridStub ;
108110 private String mntInfoHybrid = cgroupV2LineHybrid + mntInfoHybridRest ;
109111 private String mntInfoHybridFlippedOrder = mntInfoHybridRest + cgroupV2LineHybrid ;
112+ private String mntInfoCgroupv1MoreCpusetLine = "121 32 0:37 / /cpusets rw,relatime shared:69 - cgroup none rw,cpuset\n " ;
113+ private String mntInfoCgroupv1DoubleCpuset = mntInfoCgroupv1MoreCpusetLine + mntInfoHybrid ;
114+ private String mntInfoCgroupv1DoubleCpuset2 = mntInfoHybrid + mntInfoCgroupv1MoreCpusetLine ;
110115 private String cgroupsNonZeroHierarchy =
111116 "#subsys_name hierarchy num_cgroups enabled\n " +
112117 "cpuset 3 1 1\n " +
@@ -157,6 +162,12 @@ private void setup() {
157162
158163 cgroupV2MntInfoMissingCgroupv2 = Paths .get (existingDirectory .toString (), "mnt_info_missing_cgroup2" );
159164 Files .writeString (cgroupV2MntInfoMissingCgroupv2 , mntInfoHybridStub );
165+
166+ cgroupv1MntInfoDoubleCpuset = Paths .get (existingDirectory .toString (), "mnt_info_cgroupv1_double_cpuset" );
167+ Files .writeString (cgroupv1MntInfoDoubleCpuset , mntInfoCgroupv1DoubleCpuset );
168+
169+ cgroupv1MntInfoDoubleCpuset2 = Paths .get (existingDirectory .toString (), "mnt_info_cgroupv1_double_cpuset2" );
170+ Files .writeString (cgroupv1MntInfoDoubleCpuset2 , mntInfoCgroupv1DoubleCpuset2 );
160171 } catch (IOException e ) {
161172 throw new RuntimeException (e );
162173 }
@@ -174,6 +185,16 @@ private boolean isValidCgroup(int value) {
174185 return value == CGROUPS_V1 || value == CGROUPS_V2 ;
175186 }
176187
188+ public void testCgroupv1MultipleCpusetMounts (WhiteBox wb , Path mountInfo ) {
189+ String procCgroups = cgroupv1CgInfoNonZeroHierarchy .toString ();
190+ String procSelfCgroup = cgroupV1SelfCgroup .toString ();
191+ String procSelfMountinfo = mountInfo .toString ();
192+ int retval = wb .validateCgroup (procCgroups , procSelfCgroup , procSelfMountinfo );
193+ Asserts .assertEQ (CGROUPS_V1 , retval , "Multiple cpuset controllers, but only one in /sys/fs/cgroup" );
194+ Asserts .assertTrue (isValidCgroup (retval ));
195+ System .out .println ("testCgroupv1MultipleCpusetMounts PASSED!" );
196+ }
197+
177198 public void testCgroupv1NoMounts (WhiteBox wb ) {
178199 String procCgroups = cgroupv1CgInfoZeroHierarchy .toString ();
179200 String procSelfCgroup = cgroupV1SelfCgroup .toString ();
@@ -246,6 +267,8 @@ public static void main(String[] args) throws Exception {
246267 test .testCgroupV1HybridMntInfoOrder (wb );
247268 test .testCgroupv1MissingMemoryController (wb );
248269 test .testCgroupv2NoCgroup2Fs (wb );
270+ test .testCgroupv1MultipleCpusetMounts (wb , test .cgroupv1MntInfoDoubleCpuset );
271+ test .testCgroupv1MultipleCpusetMounts (wb , test .cgroupv1MntInfoDoubleCpuset2 );
249272 } finally {
250273 test .teardown ();
251274 }
0 commit comments