return ret;
}
+
+static int
+qemuSetupGraphicsCgroup(virDomainObjPtr vm,
+ virDomainGraphicsDefPtr gfx)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ const char *rendernode = gfx->data.spice.rendernode;
+ int ret;
+
+ if (gfx->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE ||
+ gfx->data.spice.gl != VIR_TRISTATE_BOOL_YES ||
+ !rendernode)
+ return 0;
+
+ ret = virCgroupAllowDevicePath(priv->cgroup, rendernode,
+ VIR_CGROUP_DEVICE_RW, false);
+ virDomainAuditCgroupPath(vm, priv->cgroup, "allow", rendernode,
+ "rw", ret == 0);
+ return ret;
+}
+
+
static int
qemuSetupBlkioCgroup(virDomainObjPtr vm)
{
goto cleanup;
}
+ for (i = 0; i < vm->def->ngraphics; i++) {
+ if (qemuSetupGraphicsCgroup(vm, vm->def->graphics[i]) < 0)
+ goto cleanup;
+ }
+
for (i = 0; i < vm->def->ninputs; i++) {
if (qemuSetupInputCgroup(vm, vm->def->inputs[i]) < 0)
goto cleanup;
}
+static int
+qemuDomainSetupGraphics(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
+ virDomainGraphicsDefPtr gfx,
+ const char *devPath)
+{
+ const char *rendernode = gfx->data.spice.rendernode;
+
+ if (gfx->type != VIR_DOMAIN_GRAPHICS_TYPE_SPICE ||
+ gfx->data.spice.gl != VIR_TRISTATE_BOOL_YES ||
+ !rendernode)
+ return 0;
+
+ return qemuDomainCreateDevice(rendernode, devPath, false);
+}
+
+
+static int
+qemuDomainSetupAllGraphics(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ const char *devPath)
+{
+ size_t i;
+
+ VIR_DEBUG("Setting up graphics");
+ for (i = 0; i < vm->def->ngraphics; i++) {
+ if (qemuDomainSetupGraphics(driver,
+ vm->def->graphics[i],
+ devPath) < 0)
+ return -1;
+ }
+
+ VIR_DEBUG("Setup all graphics");
+ return 0;
+}
+
+
static int
qemuDomainSetupInput(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
virDomainInputDefPtr input,
if (qemuDomainSetupTPM(driver, vm, devPath) < 0)
goto cleanup;
+ if (qemuDomainSetupAllGraphics(driver, vm, devPath) < 0)
+ goto cleanup;
+
if (qemuDomainSetupAllInputs(driver, vm, devPath) < 0)
goto cleanup;