diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst index db1ca5637a..a861f9f177 100644 --- a/docs/formatdomain.rst +++ b/docs/formatdomain.rst @@ -7365,6 +7365,14 @@ A video device. guest. The ``edid`` attribute is only valid for model types ``vga``, ``bochs``, and ``virtio``. + :since:`Since 12.5.0` the ``virtio`` video model has an additional attribute + ``device``, which records the specific virtio device model which was picked + for the configuration, to preserve guest ABI and migration compatibility. + Users do not need to set this attribute as aprropriate value is picked and + filled in automatically. Accepted values are ``virtio-vga``, ``virtio-gpu``, + ``virtio-vga-gl``, and ``virtio-gpu-gl``, but not all combinations of config + and this field make sense. + ``acceleration`` Configure if video acceleration should be enabled. diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 893027482d..17c4a57cd8 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -910,6 +910,17 @@ VIR_ENUM_IMPL(virDomainVideoVGAConf, "off", ); +VIR_ENUM_IMPL(virDomainVideoVirtioDevice, + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_LAST, + "", + "virtio-vga", + "virtio-gpu", + "virtio-vga-gl", + "virtio-gpu-gl", + "vhost-user-vga", + "vhost-user-gpu", +); + VIR_ENUM_IMPL(virDomainInput, VIR_DOMAIN_INPUT_TYPE_LAST, "mouse", @@ -13816,6 +13827,14 @@ virDomainVideoModelDefParseXML(virDomainVideoDef *def, VIR_DOMAIN_VIDEO_TYPE_DEFAULT) < 0) return -1; + if (def->type == VIR_DOMAIN_VIDEO_TYPE_VIRTIO) { + if (virXMLPropEnumDefault(node, "device", + virDomainVideoVirtioDeviceTypeFromString, + VIR_XML_PROP_NONZERO, &def->virtiodevice, + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_DEFAULT) < 0) + return -1; + } + if (virXMLPropUInt(node, "ram", 10, VIR_XML_PROP_NONE, &def->ram) < 0) return -1; @@ -21694,6 +21713,18 @@ virDomainVideoDefCheckABIStability(virDomainVideoDef *src, return false; } + /* While 'src->virtiodevice' vs 'dst->virtiodevice' match is considered + * guest ABI (both the device looks different to the guest OS and qemu + * refuses to migrate into wrong device) we deliberately omit the check + * here due to historical reasons. + * + * The actual values were not recorded in the XML after picking a device + * based on capabilities and thus, if the host configuration changes + * different defaults can be picked. Users might want to fix their + * saveimage or migration by specifying the proper model which will differ + * from the one that will be auto-picked via post-parse callback when the + * XML is loaded for the first time */ + if (!virDomainVirtioOptionsCheckABIStability(src->virtio, dst->virtio)) return false; @@ -27395,6 +27426,10 @@ virDomainVideoDefFormat(virBuffer *buf, if (def->edid != VIR_TRISTATE_SWITCH_ABSENT) virBufferAsprintf(&modelAttrBuf, " edid='%s'", virTristateSwitchTypeToString(def->edid)); + if (def->virtiodevice != VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_DEFAULT) + virBufferAsprintf(&modelAttrBuf, " device='%s'", + virDomainVideoVirtioDeviceTypeToString(def->virtiodevice)); + virDomainVideoAccelDefFormat(&modelChildBuf, def->accel); virDomainVideoResolutionDefFormat(&modelChildBuf, def->res); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d17f6352bd..bd360cd4a3 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1885,6 +1885,20 @@ typedef enum { VIR_ENUM_DECL(virDomainVideoVGAConf); +typedef enum { + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_DEFAULT = 0, + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_VGA, + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_GPU, + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_VGA_GL, + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_GPU_GL, + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_VHOST_USER_VGA, + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_VHOST_USER_GPU, + + VIR_DOMAIN_VIDEO_VIRTIO_DEVICE_LAST +} virDomainVideoVirtioDevice; + +VIR_ENUM_DECL(virDomainVideoVirtioDevice); + struct _virDomainVideoAccelDef { virTristateBool accel2d; virTristateBool accel3d; @@ -1915,6 +1929,7 @@ struct _virDomainVideoDef { virDomainVideoResolutionDef *res; virTristateSwitch blob; virDomainVideoDriverDef *driver; + virDomainVideoVirtioDevice virtiodevice; /* virtio device frontend */ virDomainDeviceInfo info; virDomainVirtioOptions *virtio; virDomainVideoBackendType backend; diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng index eb365a83b5..121e4e06a6 100644 --- a/src/conf/schemas/domaincommon.rng +++ b/src/conf/schemas/domaincommon.rng @@ -4874,7 +4874,6 @@ vmvga xen vbox - virtio gop none bochs @@ -4901,6 +4900,23 @@ + + + virtio + + + + + virtio-vga + virtio-vga-gl + virtio-gpu + virtio-gpu-gl + vhost-user-vga + vhost-user-gpu + + + + diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 30c4564456..c76e5cb08a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -731,6 +731,7 @@ virDomainVideoTypeFromString; virDomainVideoTypeToString; virDomainVideoVGAConfTypeFromString; virDomainVideoVGAConfTypeToString; +virDomainVideoVirtioDeviceTypeToString; virDomainVirtTypeFromString; virDomainVirtTypeToString; virDomainVsockDefEquals;