diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 209cbc275a..f0729743ab 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -335,6 +335,28 @@ qemuTeardownHostdevCgroup(virDomainObjPtr vm, 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) { @@ -604,6 +626,11 @@ qemuSetupDevicesCgroup(virQEMUDriverPtr driver, 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; diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 92a9a105c3..ea4b28288e 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -7526,6 +7526,42 @@ qemuDomainSetupTPM(virQEMUDriverPtr driver ATTRIBUTE_UNUSED, } +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, @@ -7679,6 +7715,9 @@ qemuDomainBuildNamespace(virQEMUDriverPtr driver, if (qemuDomainSetupTPM(driver, vm, devPath) < 0) goto cleanup; + if (qemuDomainSetupAllGraphics(driver, vm, devPath) < 0) + goto cleanup; + if (qemuDomainSetupAllInputs(driver, vm, devPath) < 0) goto cleanup;