From 35eecddee3fd822285a4ac619ac972f3714e8edc Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Fri, 24 Jul 2015 15:49:35 +0200 Subject: [PATCH] conf: Add ioeventfd option for controllers This will be used with a virtio-scsi controller later on. Signed-off-by: Martin Kletzander --- docs/formatdomain.html.in | 8 +++++ docs/schemas/domaincommon.rng | 3 ++ src/conf/domain_conf.c | 20 +++++++++++-- src/conf/domain_conf.h | 1 + ...emuxml2argv-disk-virtio-scsi-ioeventfd.xml | 29 +++++++++++++++++++ tests/qemuxml2xmltest.c | 1 + 6 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-ioeventfd.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 7eb21a889..c3b495ac2 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3000,6 +3000,14 @@ a sector is 512 bytes. Since 1.2.7 (QEMU and KVM only) +
ioeventfd
+
+ The optional ioeventfd attribute specifies + whether the controller should use + + I/O asynchronous handling or not. Accepted values are + "on" and "off". Since 1.2.18 +

USB companion controllers have an optional diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index ab02d14f8..043c9757d 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -1832,6 +1832,9 @@ + + + diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8790aabe0..fd0450f09 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -7824,6 +7824,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, char *chassisNr = NULL; char *chassis = NULL; char *port = NULL; + char *ioeventfd = NULL; xmlNodePtr saved = ctxt->node; int rc; @@ -7867,6 +7868,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, queues = virXMLPropString(cur, "queues"); cmd_per_lun = virXMLPropString(cur, "cmd_per_lun"); max_sectors = virXMLPropString(cur, "max_sectors"); + ioeventfd = virXMLPropString(cur, "ioeventfd"); } else if (xmlStrEqual(cur->name, BAD_CAST "model")) { if (processedModel) { virReportError(VIR_ERR_XML_ERROR, "%s", @@ -7910,6 +7912,13 @@ virDomainControllerDefParseXML(xmlNodePtr node, goto error; } + if (ioeventfd && + (def->ioeventfd = virTristateSwitchTypeFromString(ioeventfd)) < 0) { + virReportError(VIR_ERR_XML_ERROR, + _("Malformed 'ioeventfd' value %s'"), max_sectors); + goto error; + } + if (def->type == VIR_DOMAIN_CONTROLLER_TYPE_USB && def->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_NONE) { VIR_DEBUG("Ignoring device address for none model usb controller"); @@ -8083,6 +8092,7 @@ virDomainControllerDefParseXML(xmlNodePtr node, VIR_FREE(chassisNr); VIR_FREE(chassis); VIR_FREE(port); + VIR_FREE(ioeventfd); return def; @@ -19148,7 +19158,7 @@ virDomainControllerDefFormat(virBufferPtr buf, } if (pciModel || pciTarget || - def->queues || def->cmd_per_lun || def->max_sectors || + def->queues || def->cmd_per_lun || def->max_sectors || def->ioeventfd || virDomainDeviceInfoNeedsFormat(&def->info, flags) || pcihole64) { virBufferAddLit(buf, ">\n"); virBufferAdjustIndent(buf, 2); @@ -19178,7 +19188,8 @@ virDomainControllerDefFormat(virBufferPtr buf, virBufferAddLit(buf, "/>\n"); } - if (def->queues || def->cmd_per_lun || def->max_sectors) { + if (def->queues || def->cmd_per_lun || + def->max_sectors || def->ioeventfd) { virBufferAddLit(buf, "queues) virBufferAsprintf(buf, " queues='%u'", def->queues); @@ -19188,6 +19199,11 @@ virDomainControllerDefFormat(virBufferPtr buf, if (def->max_sectors) virBufferAsprintf(buf, " max_sectors='%u'", def->max_sectors); + + if (def->ioeventfd) { + virBufferAsprintf(buf, " ioeventfd='%s'", + virTristateSwitchTypeToString(def->ioeventfd)); + } virBufferAddLit(buf, "/>\n"); } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 86430efb1..9762c4f27 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -840,6 +840,7 @@ struct _virDomainControllerDef { unsigned int queues; unsigned int cmd_per_lun; unsigned int max_sectors; + int ioeventfd; /* enum virTristateSwitch */ union { virDomainVirtioSerialOpts vioserial; virDomainPCIControllerOpts pciopts; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-ioeventfd.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-ioeventfd.xml new file mode 100644 index 000000000..f4487eb84 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio-scsi-ioeventfd.xml @@ -0,0 +1,29 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 8 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + +

+ + + + + + + + + diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c index b261db2bc..08923faa8 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -420,6 +420,7 @@ mymain(void) DO_TEST("disk-virtio-scsi-num_queues"); DO_TEST("disk-virtio-scsi-cmd_per_lun"); DO_TEST("disk-virtio-scsi-max_sectors"); + DO_TEST("disk-virtio-scsi-ioeventfd"); DO_TEST("disk-scsi-megasas"); DO_TEST_DIFFERENT("disk-mirror-old"); DO_TEST_FULL("disk-mirror", false, WHEN_ACTIVE); -- 2.39.5