From: Laine Stump Date: Mon, 12 Sep 2016 17:21:10 +0000 (-0400) Subject: qemu: fix improper initialization of cgroupControllers bitmap X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=0276015325a746f2cd26ef0fddfc682cf641423f;p=libvirt.git qemu: fix improper initialization of cgroupControllers bitmap virQEMUDriverConfigNew() always initializes the bitmap in its cgroupControllers member to -1 (i.e. all 1's). Prior to commit a9331394, if qemu.conf had a line with "cgroup_controllers", cgroupControllers would get reset to 0 before going through a loop setting a bit for each named cgroup controller. commit a9331394 left out the "reset to 0" part, so cgroupControllers would always be -1; if you didn't want a controller included, there was no longer a way to make that happen. This was discovered by users who were using qemu commandline passthrough to use the "input-linux" method of directing keyboard/mouse input to a virtual machine: https://www.redhat.com/archives/vfio-users/2016-April/msg00105.html Here's the first report I found of the problem encountered after upgrading libvirt beyond v2.0.0: https://www.redhat.com/archives/vfio-users/2016-August/msg00053.html Thanks to sL1pKn07 SpinFlo for bringing the problem up in IRC, and then taking the time to do a git bisect and find the patch that started the problem. --- diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index e7b2d8d3ad..dad83348f9 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -613,15 +613,18 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg, &controllers) < 0) goto cleanup; - for (i = 0; controllers != NULL && controllers[i] != NULL; i++) { - int ctl; - if ((ctl = virCgroupControllerTypeFromString(controllers[i])) < 0) { - virReportError(VIR_ERR_CONF_SYNTAX, - _("Unknown cgroup controller '%s'"), - controllers[i]); - goto cleanup; + if (controllers) { + cfg-> cgroupControllers = 0; + for (i = 0; controllers[i] != NULL; i++) { + int ctl; + if ((ctl = virCgroupControllerTypeFromString(controllers[i])) < 0) { + virReportError(VIR_ERR_CONF_SYNTAX, + _("Unknown cgroup controller '%s'"), + controllers[i]); + goto cleanup; + } + cfg->cgroupControllers |= (1 << ctl); } - cfg->cgroupControllers |= (1 << ctl); } if (virConfGetValueStringList(conf, "cgroup_device_acl", false,