On 05/30/2018 09:42 AM, Erik Skultety wrote:
QEMU introduced a new type of display for mediated devices using
vfio-pci backend which controls whether a mediated device can be used as
a native rendering device as an alternative to an emulated video device.
This patch adds the necessary bits to domain config handling in order to
expose this feature.
Add blank line between paragraphs
It's worth noting that even though QEMU supports and defaults to
the
value 'auto', this patch only introduces values 'on' and 'off'
defaulting to 'off' (for safety), since there's no convenient way for
libvirt to come up with relevant defaults based on the fact, that libvirt
doesn't know whether the underlying device uses dma-buf or vfio region
mapping.
Such a strange feature - almost seems like qemu tries to enable by
default by using auto and now it's up to libvirt to say, no, set the
default to off and if someone then turns it on make sure the "expected"
graphics is available in order to avoid issues.
Perhaps if you drag in some of the comments from the cover letter it may
clear up a few things... The TL;DR in particular and part of the
paragraph just above it.
Looking at the QEMU code it seems there is the expectation of
essentially "on" or "off" - auto just seems to be a way to have a
default value and try to force usage of on or off... It seems to me
that vfio_realize will check the value != ON_OFF_AUTO_OFF(2), then do
the probe. The "default" for the property is set as ON_OFF_AUTO_AUTO
(or 0), so perhaps since 2.12 there's always an attempt to do this. Of
course I could be reading things wrong. The assumption in that code
being that the "user" of the qemu api would "know" to add the right
graphics device. Mind boggling.
Signed-off-by: Erik Skultety <eskultet(a)redhat.com>
---
docs/formatdomain.html.in | 16 ++++++--
docs/schemas/domaincommon.rng | 5 +++
src/conf/domain_conf.c | 18 +++++++-
src/conf/domain_conf.h | 1 +
src/qemu/qemu_domain.c | 43 +++++++++++++++++++
.../hostdev-mdev-display-missing-graphics.xml | 35 ++++++++++++++++
.../hostdev-mdev-display-spice-no-opengl.xml | 41 ++++++++++++++++++
.../hostdev-mdev-display-spice-opengl.xml | 41 ++++++++++++++++++
.../qemuxml2argvdata/hostdev-mdev-display-vnc.xml | 39 ++++++++++++++++++
.../hostdev-mdev-display-spice-no-opengl.xml | 47 +++++++++++++++++++++
.../hostdev-mdev-display-spice-opengl.xml | 48 ++++++++++++++++++++++
.../hostdev-mdev-display-vnc.xml | 47 +++++++++++++++++++++
tests/qemuxml2xmltest.c | 3 ++
13 files changed, 380 insertions(+), 4 deletions(-)
create mode 100644 tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml
create mode 100644 tests/qemuxml2argvdata/hostdev-mdev-display-spice-no-opengl.xml
create mode 100644 tests/qemuxml2argvdata/hostdev-mdev-display-spice-opengl.xml
create mode 100644 tests/qemuxml2argvdata/hostdev-mdev-display-vnc.xml
create mode 100644 tests/qemuxml2xmloutdata/hostdev-mdev-display-spice-no-opengl.xml
create mode 100644 tests/qemuxml2xmloutdata/hostdev-mdev-display-spice-opengl.xml
create mode 100644 tests/qemuxml2xmloutdata/hostdev-mdev-display-vnc.xml
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index b5a6e33bfe..deecc3166a 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4437,9 +4437,19 @@
guest. Currently, <code>model='vfio-pci'</code> and
<code>model='vfio-ccw'</code> (<span
class="since">Since 4.4.0</span>)
is supported. Refer <a
href="drvnodedev.html#MDEV">MDEV</a> to create
- a mediated device on the host. There are also some implications on the
- usage of guest's address type depending on the
<code>model</code>
- attribute, see the <code>address</code> element below.
+ a mediated device on the host.
+ <span class="since">Since 4.4.0 (QEMU 2.12)</span>
libvirt added
4.5.0
s/libvirt added a new/an/
s/attribute/attribute may be used/
+ a new optional <code>display</code> attribute
to enable or disable
+ support for an accelerated remote desktop backed by a mediated
+ device (such as NVIDIA vGPU or Intel GVT-g) as an alternative to
+ emulated <a href="#elementsVideo">video devices</a>.
This attribute
+ is limited to <code>model='vfio-pci'</code> only.
Supported values
+ are either 'on' or 'off' (default is 'off').
Usage of this option requires ???which types/styles??? of graphics
devices to be defined for the domain.
+ <p>
+ Note: There are also some implications on the usage of guest's
+ address type depending on the <code>model</code> attribute,
+ see the <code>address</code> element below.
+ </p>
</dd>
</dl>
<p>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 703a1bb6f8..345bd3c757 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4507,6 +4507,11 @@
<value>vfio-ccw</value>
</choice>
</attribute>
+ <optional>
+ <attribute name="display">
+ <ref name="virOnOff"/>
+ </attribute>
+ </optional>
<element name="source">
<ref name="mdevaddress"/>
</element>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c868d8de08..7844b6d272 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -7606,6 +7606,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
char *rawio = NULL;
char *backendStr = NULL;
char *model = NULL;
+ char *display = NULL;
int backend;
int ret = -1;
virDomainHostdevSubsysPCIPtr pcisrc = &def->source.subsys.u.pci;
@@ -7625,6 +7626,7 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
sgio = virXMLPropString(node, "sgio");
rawio = virXMLPropString(node, "rawio");
model = virXMLPropString(node, "model");
+ display = virXMLPropString(node, "display");
/* @type is passed in from the caller rather than read from the
* xml document, because it is specified in different places for
@@ -7712,6 +7714,15 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
model);
goto error;
}
+
+ if (display &&
+ (mdevsrc->display = virTristateSwitchTypeFromString(display)) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("unknown value '%s' for <hostdev>
attribute "
+ "'display'"),
+ display);
+ goto error;
+ }
}
switch (def->source.subsys.type) {
@@ -26297,9 +26308,14 @@ virDomainHostdevDefFormat(virBufferPtr buf,
virTristateBoolTypeToString(scsisrc->rawio));
}
- if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV)
+ if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV) {
virBufferAsprintf(buf, " model='%s'",
virMediatedDeviceModelTypeToString(mdevsrc->model));
+ if (mdevsrc->display)
->display
VIR_TRISTATE_SWITCH_ABSENT
+ virBufferAsprintf(buf, "
display='%s'",
+ virTristateSwitchTypeToString(mdevsrc->display));
+ }
+
}
virBufferAddLit(buf, ">\n");
virBufferAdjustIndent(buf, 2);
What about a virDomainHostdevDefCheckABIStability check that display
type didn't change?
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 8493dfdd76..123a676ab9 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -382,6 +382,7 @@ typedef struct _virDomainHostdevSubsysMediatedDev
virDomainHostdevSubsysMediated
typedef virDomainHostdevSubsysMediatedDev *virDomainHostdevSubsysMediatedDevPtr;
struct _virDomainHostdevSubsysMediatedDev {
int model; /* enum virMediatedDeviceModelType */
+ int display; /* virTristateSwitchType */
char uuidstr[VIR_UUID_STRING_BUFLEN]; /* mediated device's uuid string */
};
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 2c51e4c0d8..27088d4456 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -4277,10 +4277,35 @@ qemuDomainDeviceDefValidateNetwork(const virDomainNetDef *net)
}
+static int
+qemuDomainDeviceDefValidateHostdevMdev(const virDomainHostdevSubsysMediatedDev
*mdevsrc,
+ const virDomainDef *def)
+{
+ if (mdevsrc->display) {
VIR_TRISTATE_SWITCH_ABSENT
+ if (mdevsrc->model != VIR_MDEV_MODEL_TYPE_VFIO_PCI) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("<hostdev> attribute 'display' is only
supported"
+ " with model='vfio-pci'"));
+
+ return -1;
+ } else if (def->ngraphics == 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("graphics device is needed for attribute value "
+ "'display=on' in <hostdev>"));
Hmmm.. not sure we noted that in the formatdomain - probably should.
Also if this were a PostParse check, then would the xml2xml tests fail
if no graphics were defined (e.g. hostdev-mdev-display-missing-graphics.xml)
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+
static int
qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev,
const virDomainDef *def)
{
+ const virDomainHostdevSubsysMediatedDev *mdevsrc;
+
/* forbid capabilities mode hostdev in this kind of hypervisor */
if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_CAPABILITIES) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -4290,6 +4315,24 @@ qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef
*hostdev,
return -1;
}
+ if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
+ switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
+ break;
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
+ mdevsrc = &hostdev->source.subsys.u.mdev;
+ return qemuDomainDeviceDefValidateHostdevMdev(mdevsrc, def);
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
+ default:
+ virReportEnumRangeError(virDomainHostdevSubsysType,
+ hostdev->source.subsys.type);
+ return -1;
+ }
+ }
+
return 0;
}
diff --git a/tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml
b/tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml
new file mode 100644
index 0000000000..ea559a6444
--- /dev/null
+++ b/tests/qemuxml2argvdata/hostdev-mdev-display-missing-graphics.xml
This one is not used until the last patch... It could be moved there or
as I noted above, would moving the no graphics check to PostParse allow
xml2xml failure of some sort (I cannot remember any more and it's too
late for me to dig).
The rest of the tests seem OK to me...
[...]
I think for the most part this is OK - just curious about the ABI check,
the test or PostParse check, and making sure I read things right before
the R-b..
John