]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Add a new 'xenbus' controller type
authorJim Fehlig <jfehlig@suse.com>
Wed, 6 Mar 2019 22:59:29 +0000 (15:59 -0700)
committerJim Fehlig <jfehlig@suse.com>
Wed, 13 Mar 2019 18:06:52 +0000 (12:06 -0600)
xenbus is virtual controller (akin to virtio controllers) for Xen
paravirtual devices. Although all Xen VMs have a xenbus, it has
never been modeled in libvirt, or in Xen native VM config format
for that matter.

Recently there have been requests to support Xen's max_grant_frames
setting in libvirt. max_grant_frames is best modeled as an attribute
of xenbus. It describes the maximum IO buffer space (or DMA space)
available in xenbus for use by connected paravirtual devices. This
patch introduces a new xenbus controller type that includes a
maxGrantFrames attribute.

Signed-off-by: Jim Fehlig <jfehlig@suse.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
src/qemu/qemu_domain_address.c

index a0b3632b7e2474d1c5b07f1f363cee7e5004b5b1..0e3799061d93d2c5b8e0cdacb8f6788c2e92c0c4 100644 (file)
     &lt;driver iothread='4'/&gt;
     &lt;address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/&gt;
   &lt;/controller&gt;
+  &lt;controller type='xenbus' maxGrantFrames='64'/&gt;
   ...
 &lt;/devices&gt;
 ...</pre>
         <dd><span class="since">Since 3.10.0</span> for the vbox driver, the
         <code>ide</code> controller has an optional attribute
         <code>model</code>, which is one of "piix3", "piix4" or "ich6".</dd>
+        <dt><code>xenbus</code></dt>
+        <dd><span class="since">Since 5.2.0</span>, the <code>xenbus</code>
+        controller has an optional attribute <code>maxGrantFrames</code>,
+        which specifies the maximum number of grant frames the controller
+        makes available for connected devices.</dd>
       </dl>
 
     <p>
index 87ba9daedaa418bf7add5153261214a2e1be5074..1828e0795bd41a6e43a06d6dc025293473faf426 100644 (file)
               </attribute>
             </optional>
           </group>
+          <!-- xenbus has an optional attribute "maxGrantFrames" -->
+          <group>
+            <attribute name="type">
+              <value>xenbus</value>
+            </attribute>
+            <optional>
+              <attribute name="maxGrantFrames">
+                <ref name="unsignedInt"/>
+              </attribute>
+            </optional>
+          </group>
         </choice>
         <optional>
           <element name="driver">
index cfd72215389dd757370b68b5a2bbe3c4a1ad1abd..35001be2a8e7e15a72fc952b0dea11a8b8c8857f 100644 (file)
@@ -347,6 +347,7 @@ VIR_ENUM_IMPL(virDomainController, VIR_DOMAIN_CONTROLLER_TYPE_LAST,
               "ccid",
               "usb",
               "pci",
+              "xenbus",
 );
 
 VIR_ENUM_IMPL(virDomainControllerModelPCI, VIR_DOMAIN_CONTROLLER_MODEL_PCI_LAST,
@@ -2073,6 +2074,9 @@ virDomainControllerDefNew(virDomainControllerType type)
         def->opts.pciopts.targetIndex = -1;
         def->opts.pciopts.numaNode = -1;
         break;
+    case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
+        def->opts.xenbusopts.maxGrantFrames = -1;
+        break;
     case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
     case VIR_DOMAIN_CONTROLLER_TYPE_SCSI:
@@ -10718,6 +10722,20 @@ virDomainControllerDefParseXML(virDomainXMLOptionPtr xmlopt,
             def->opts.pciopts.numaNode = numaNode;
         }
         break;
+    case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS: {
+        VIR_AUTOFREE(char *) gntframes = virXMLPropString(node, "maxGrantFrames");
+
+        if (gntframes) {
+            int r = virStrToLong_i(gntframes, NULL, 10,
+                                   &def->opts.xenbusopts.maxGrantFrames);
+            if (r != 0 || def->opts.xenbusopts.maxGrantFrames < 0) {
+                virReportError(VIR_ERR_INTERNAL_ERROR,
+                               _("Invalid maxGrantFrames: %s"), gntframes);
+                goto error;
+            }
+        }
+        break;
+    }
 
     default:
         break;
@@ -24327,6 +24345,13 @@ virDomainControllerDefFormat(virBufferPtr buf,
         }
         break;
 
+    case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
+        if (def->opts.xenbusopts.maxGrantFrames != -1) {
+            virBufferAsprintf(&attrBuf, " maxGrantFrames='%d'",
+                              def->opts.xenbusopts.maxGrantFrames);
+        }
+        break;
+
     default:
         break;
     }
index fe9d4fb81aa52347d1c77e79a72f549903929b35..78e7ccb4637f178ff961d16bc0a9ec7a86ac31d2 100644 (file)
@@ -709,6 +709,7 @@ typedef enum {
     VIR_DOMAIN_CONTROLLER_TYPE_CCID,
     VIR_DOMAIN_CONTROLLER_TYPE_USB,
     VIR_DOMAIN_CONTROLLER_TYPE_PCI,
+    VIR_DOMAIN_CONTROLLER_TYPE_XENBUS,
 
     VIR_DOMAIN_CONTROLLER_TYPE_LAST
 } virDomainControllerType;
@@ -852,6 +853,12 @@ struct _virDomainUSBControllerOpts {
     int ports;   /* -1 == undef */
 };
 
+typedef struct _virDomainXenbusControllerOpts virDomainXenbusControllerOpts;
+typedef virDomainXenbusControllerOpts *virDomainXenbusControllerOptsPtr;
+struct _virDomainXenbusControllerOpts {
+    int maxGrantFrames;   /* -1 == undef */
+};
+
 /* Stores the virtual disk controller configuration */
 struct _virDomainControllerDef {
     int type;
@@ -866,6 +873,7 @@ struct _virDomainControllerDef {
         virDomainVirtioSerialOpts vioserial;
         virDomainPCIControllerOpts pciopts;
         virDomainUSBControllerOpts usbopts;
+        virDomainXenbusControllerOpts xenbusopts;
     } opts;
     virDomainDeviceInfo info;
     virDomainVirtioOptionsPtr virtio;
index 5e56447b76b4f5eef72279a6b0e31fc49fcf0fa1..1b82b70cc11bf62ec8da910459bd1994389ef428 100644 (file)
@@ -3146,6 +3146,7 @@ qemuBuildControllerDevStr(const virDomainDef *domainDef,
 
     case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
+    case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("Unsupported controller type: %s"),
index 788c19c248f5c738c7f74d6cf8929aeefe5e5989..df2f4de262223e15a55f543bfbc5b50a896aba88 100644 (file)
@@ -5867,6 +5867,7 @@ qemuDomainDeviceDefValidateController(const virDomainControllerDef *controller,
     case VIR_DOMAIN_CONTROLLER_TYPE_VIRTIO_SERIAL:
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_USB:
+    case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         break;
     }
@@ -6519,6 +6520,7 @@ qemuDomainControllerDefPostParse(virDomainControllerDefPtr cont,
     case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
     case VIR_DOMAIN_CONTROLLER_TYPE_IDE:
     case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
+    case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
     case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
         break;
     }
index 4740536d8291723f16396310289c96e5befa044d..3eccf40eb592270fce9131c3dee7c1695be8dc3d 100644 (file)
@@ -685,6 +685,7 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr dev,
 
         case VIR_DOMAIN_CONTROLLER_TYPE_FDC:
         case VIR_DOMAIN_CONTROLLER_TYPE_CCID:
+        case VIR_DOMAIN_CONTROLLER_TYPE_XENBUS:
         case VIR_DOMAIN_CONTROLLER_TYPE_LAST:
             /* should be 0 */
             return pciFlags;