[libvirt] [PATCH 1/3] conf: Add rom.enabled attribute for PCI devices

Andrea Bolognani abologna at redhat.com
Fri Apr 20 15:44:29 UTC 2018


The attribute can be used to disable ROM loading completely
for a device.

Signed-off-by: Andrea Bolognani <abologna at redhat.com>
---
 docs/formatdomain.html.in     |  3 +++
 docs/schemas/domaincommon.rng |  5 +++++
 src/conf/device_conf.h        |  1 +
 src/conf/domain_conf.c        | 26 +++++++++++++++++++++++++-
 4 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index ada0df227f..0afc310e25 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4476,6 +4476,9 @@
         virtual function of an sr-iov capable ethernet device (which
         has no boot ROMs for the VFs).
         <span class="since">Since 0.9.10 (QEMU and KVM only)</span>.
+        The optional <code>enabled</code> attribute can be set to
+        <code>no</code> to disable PCI ROM loading completely for the device.
+        <span class="since">Since 4.3.0 (QEMU and KVM only)</span>.
       </dd>
       <dt><code>address</code></dt>
       <dd>The <code>address</code> element for USB devices has a
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 4cab55f05d..3569b92127 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -5108,6 +5108,11 @@
 
   <define name="rom">
     <element name="rom">
+      <optional>
+        <attribute name="enabled">
+          <ref name="virYesNo"/>
+        </attribute>
+      </optional>
       <optional>
         <attribute name="bar">
           <ref name="virOnOff"/>
diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h
index f87d6f1fc6..a31ce9c376 100644
--- a/src/conf/device_conf.h
+++ b/src/conf/device_conf.h
@@ -153,6 +153,7 @@ struct _virDomainDeviceInfo {
     } master;
     /* rombar and romfile are only used for pci hostdev and network
      * devices. */
+    int romenabled; /* enum virTristateBool */
     int rombar;         /* enum virTristateSwitch */
     char *romfile;
     /* bootIndex is only used for disk, network interface, hostdev
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 35666c1347..3c152441df 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -6095,9 +6095,17 @@ virDomainDeviceInfoFormat(virBufferPtr buf,
     }
 
     if ((flags & VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM) &&
-        (info->rombar != VIR_TRISTATE_SWITCH_ABSENT || info->romfile)) {
+        (info->romenabled != VIR_TRISTATE_BOOL_ABSENT ||
+         info->rombar != VIR_TRISTATE_SWITCH_ABSENT ||
+         info->romfile)) {
 
         virBufferAddLit(buf, "<rom");
+        if (info->romenabled != VIR_TRISTATE_BOOL_ABSENT) {
+            const char *romenabled = virTristateBoolTypeToString(info->romenabled);
+
+            if (romenabled)
+                virBufferAsprintf(buf, " enabled='%s'", romenabled);
+        }
         if (info->rombar != VIR_TRISTATE_SWITCH_ABSENT) {
             const char *rombar = virTristateSwitchTypeToString(info->rombar);
 
@@ -6738,6 +6746,7 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED,
     xmlNodePtr boot = NULL;
     xmlNodePtr rom = NULL;
     char *type = NULL;
+    char *romenabled = NULL;
     char *rombar = NULL;
     char *aliasStr = NULL;
     int ret = -1;
@@ -6791,6 +6800,12 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED,
     }
 
     if (rom) {
+        if ((romenabled = virXMLPropString(rom, "enabled")) &&
+            ((info->romenabled = virTristateBoolTypeFromString(romenabled)) <= 0)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unknown rom enabled value '%s'"), romenabled);
+            goto cleanup;
+        }
         if ((rombar = virXMLPropString(rom, "bar")) &&
             ((info->rombar = virTristateSwitchTypeFromString(rombar)) <= 0)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -6798,6 +6813,14 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED,
             goto cleanup;
         }
         info->romfile = virXMLPropString(rom, "file");
+
+        if (info->romenabled == VIR_TRISTATE_BOOL_NO &&
+            (info->rombar != VIR_TRISTATE_SWITCH_ABSENT || info->romfile)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           "%s",
+                           _("ROM tuning is not supported when ROM is disabled"));
+            goto cleanup;
+        }
     }
 
     if (address &&
@@ -6811,6 +6834,7 @@ virDomainDeviceInfoParseXML(virDomainXMLOptionPtr xmlopt ATTRIBUTE_UNUSED,
         virDomainDeviceInfoClear(info);
     VIR_FREE(type);
     VIR_FREE(rombar);
+    VIR_FREE(romenabled);
     VIR_FREE(aliasStr);
     return ret;
 }
-- 
2.14.3




More information about the libvir-list mailing list