On 10/02/2018 10:44 AM, Pavel Hrdina wrote: > We need to create the cgroup v2 sysfs the same way as we do for > cgroup v1. > > This introduces new VIR_CGROUP_MOCK_MODE env variable which will > configure which cgroup mode each test requires. There are three > different modes: > > - legacy: only cgroup v1 is available and it's the default mode > - hybrid: both cgroup v1 and cgroup v2 are available and have some > controllers > - unified: only cgroup v2 is available > > Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx> > --- > tests/vircgroupmock.c | 153 +++++++++++++++++++++++++++++++++++++----- > 1 file changed, 138 insertions(+), 15 deletions(-) > > diff --git a/tests/vircgroupmock.c b/tests/vircgroupmock.c > index 5c48ef012a..1ed00ea91c 100644 > --- a/tests/vircgroupmock.c > +++ b/tests/vircgroupmock.c > @@ -105,7 +105,8 @@ static int make_file(const char *path, > return ret; > } > > -static int make_controller(const char *path, mode_t mode) > + > +static int make_controller_v1(const char *path, mode_t mode) > { > int ret = -1; > const char *controller; > @@ -231,11 +232,86 @@ static int make_controller(const char *path, mode_t mode) > goto cleanup; > } > > +# undef MAKE_FILE > + > ret = 0; > cleanup: > return ret; > } > > + > +static int make_controller_v2(const char *path, mode_t mode) > +{ > + if (!STRPREFIX(path, fakesysfscgroupdir)) { > + errno = EINVAL; > + return -1; > + } > + > + if (real_mkdir(path, mode) < 0 && errno != EEXIST) > + return -1; > + > +# define MAKE_FILE(name, value) \ > + do { \ > + if (make_file(path, name, value) < 0) \ > + return -1; \ > + } while (0) > + > + MAKE_FILE("cgroup.controllers", "cpu io memory\n"); > + MAKE_FILE("cgroup.subtree_control", ""); > + MAKE_FILE("cgroup.type", "domain\n"); > + MAKE_FILE("cpu.max", "max 100000\n"); > + MAKE_FILE("cpu.stat", > + "usage_usec 0\n" > + "user_usec 0\n" > + "system_usec 0\n" > + "nr_periods 0\n" > + "nr_throttled 0\n" > + "throttled_usec 0\n"); > + MAKE_FILE("cpu.weight", "100\n"); > + MAKE_FILE("memory.current", "1455321088\n"); > + MAKE_FILE("memory.high", "max\n"); > + MAKE_FILE("memory.max", "max\n"); > + MAKE_FILE("memory.stat", > + "anon 0\n" > + "file 0\n" > + "kernel_stack 0\n" > + "slab 0\n" > + "sock 0\n" > + "shmem 0\n" > + "file_mapped 0\n" > + "file_dirty 0\n" > + "file_writeback 0\n" > + "inactive_anon 0\n" > + "active_anon 0\n" > + "inactive_file 0\n" > + "active_file 0\n" > + "unevictable 0\n" > + "slab_reclaimable 0\n" > + "slab_unreclaimable 0\n" > + "pgfault 0\n" > + "pgmajfault 0\n" > + "pgrefill 0\n" > + "pgscan 0\n" > + "pgsteal 0\n" > + "pgactivate 0\n" > + "pgdeactivate 0\n" > + "pglazyfree 0\n" > + "pglazyfreed 0\n" > + "workingset_refault 0\n" > + "workingset_activate 0\n" > + "workingset_nodereclaim 0\n"); > + MAKE_FILE("memory.swap.current", "0\n"); > + MAKE_FILE("memory.swap.max", "max\n"); > + MAKE_FILE("io.stat", "8:0 rbytes=26828800 wbytes=77062144 rios=2256 wios=7849 dbytes=0 dios=0\n"); > + MAKE_FILE("io.max", ""); > + MAKE_FILE("io.weight", "default 100\n"); > + > +# undef MAKE_FILE > + > + return 0; > +} > + > + > static void init_syms(void) > { > if (real_fopen) > @@ -249,16 +325,56 @@ static void init_syms(void) > VIR_MOCK_REAL_INIT(open); > } > > + > +static int make_controller(const char *path, mode_t mode) > +{ > + const char *mock; > + bool unified = false; > + bool hybrid = false; > + > + mock = getenv("VIR_CGROUP_MOCK_MODE"); > + if (mock) { > + if (STREQ(mock, "unified")) > + unified = true; > + else if (STREQ(mock, "hybrid")) > + hybrid = true; > + } > + > + if (unified || (hybrid && strstr(path, "unified"))) { > + return make_controller_v2(path, mode); > + } else { > + return make_controller_v1(path, mode); > + } > +} > + > + > static void init_sysfs(void) > { > - if (fakerootdir && fakesysfscgroupdir) > - return; > + const char *mock; > + char *newfakerootdir; > + bool unified = false; > + bool hybrid = false; > > - if (!(fakerootdir = getenv("LIBVIRT_FAKE_ROOT_DIR"))) { > + if (!(newfakerootdir = getenv("LIBVIRT_FAKE_ROOT_DIR"))) { > fprintf(stderr, "Missing LIBVIRT_FAKE_ROOT_DIR env variable\n"); > abort(); > } > > + if (fakerootdir && STREQ(fakerootdir, newfakerootdir)) or simply STREQ_NULLABLE() > + return; > + > + fakerootdir = newfakerootdir; > + > + mock = getenv("VIR_CGROUP_MOCK_MODE"); > + if (mock) { > + if (STREQ(mock, "unified")) > + unified = true; > + else if (STREQ(mock, "hybrid")) > + hybrid = true; abort(unknown mode $mock); > + } > + > + VIR_FREE(fakesysfscgroupdir); > + > if (virAsprintfQuiet(&fakesysfscgroupdir, "%s%s", > fakerootdir, SYSFS_CGROUP_PREFIX) < 0) > abort(); > @@ -281,18 +397,25 @@ static void init_sysfs(void) > free(path); \ > } while (0) > > - MAKE_CONTROLLER("cpu"); > - MAKE_CONTROLLER("cpuacct"); > - MAKE_CONTROLLER("cpu,cpuacct"); > - MAKE_CONTROLLER("cpu,cpuacct/system"); > - MAKE_CONTROLLER("cpuset"); > - MAKE_CONTROLLER("blkio"); > - MAKE_CONTROLLER("memory"); > - MAKE_CONTROLLER("freezer"); > + if (unified) { > + MAKE_CONTROLLER(""); > + } else if (hybrid) { > + MAKE_CONTROLLER("unified"); > + MAKE_CONTROLLER("cpuset"); > + MAKE_CONTROLLER("freezer"); > + } else { > + MAKE_CONTROLLER("cpu"); > + MAKE_CONTROLLER("cpuacct"); > + MAKE_CONTROLLER("cpu,cpuacct"); > + MAKE_CONTROLLER("cpuset"); > + MAKE_CONTROLLER("blkio"); > + MAKE_CONTROLLER("memory"); > + MAKE_CONTROLLER("freezer"); > > - if (make_file(fakesysfscgroupdir, > - SYSFS_CPU_PRESENT_MOCKED, "8-23,48-159\n") < 0) > - abort(); > + if (make_file(fakesysfscgroupdir, > + SYSFS_CPU_PRESENT_MOCKED, "8-23,48-159\n") < 0) > + abort(); > + } > } > > > ACK Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list