[libvirt] [PATCH 09/10] libxl: Stubdom emulator type

Marek Marczykowski-Górecki marmarek at invisiblethingslab.com
Thu Feb 5 05:17:15 UTC 2015


Xen have feature of having device model in separate domain (called stub
domain). Add a 'type' attribute to 'emulator' element to allow selecting
such a configuration. Emulator path is still used for qemu running in dom0 (if
any). Libxl currently do not allow to select stubdomain path.

Signed-off-by: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
---

I think it would be good idea to introduce the same change to capabilities XML.
The problem is I can't include domain_conf.h from capabilities.h, so probably
that enum declaration needs to be moved to capabilities.h. Is it the right way?
Or it should be done somehow different?

 docs/formatdomain.html.in     | 14 ++++++++++++++
 docs/schemas/domaincommon.rng | 23 ++++++++++++++++++++++-
 src/conf/domain_conf.c        | 36 ++++++++++++++++++++++++++++++++++--
 src/conf/domain_conf.h        |  9 +++++++++
 src/libxl/libxl_conf.c        | 17 +++++++++++++++++
 5 files changed, 96 insertions(+), 3 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 38c42d5..4f539e2 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -1652,6 +1652,20 @@
         The <a href="formatcaps.html">capabilities XML</a> specifies
         the recommended default emulator to use for each particular
         domain type / architecture combination.
+
+        <span class="since">Since 1.2.13</span>, the <code>emulator</code>
+        element may contain <code>type</code> attribute. Possible values are:
+        <dl>
+          <dt><code>type='default'</code></dt>
+          <dd>Equivalent to not setting <code>type</code> attribute at all.
+          </dd>
+
+          <dt><code>type='stubdom'</code></dt>
+          <dd>Launch emulator in stub domain (Xen only). The emulator path
+          still indicate which binary is used in dom0 - there is no control
+          which binary is used as a stub domain.
+          </dd>
+        </dl>
       </dd>
     </dl>
 
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index a4321f1..2a12073 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2519,7 +2519,28 @@
     -->
   <define name="emulator">
     <element name="emulator">
-      <ref name="absFilePath"/>
+      <choice>
+        <group>
+          <optional>
+            <attribute name="type">
+              <choice>
+                <value>qemu</value>
+                <value>stubdom</value>
+              </choice>
+            </attribute>
+          </optional>
+          <ref name="absFilePath"/>
+        </group>
+        <group>
+          <attribute name="type">
+            <choice>
+              <value>qemu</value>
+              <value>stubdom</value>
+            </choice>
+          </attribute>
+          <empty/>
+        </group>
+      </choice>
     </element>
   </define>
   <!--
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 17b699a..c268091 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -741,6 +741,10 @@ VIR_ENUM_IMPL(virDomainDiskTray, VIR_DOMAIN_DISK_TRAY_LAST,
               "closed",
               "open");
 
+VIR_ENUM_IMPL(virDomainEmulatorType, VIR_DOMAIN_EMULATOR_TYPE_LAST,
+              "qemu",
+              "stubdom");
+
 VIR_ENUM_IMPL(virDomainRNGModel,
               VIR_DOMAIN_RNG_MODEL_LAST,
               "virtio");
@@ -13712,6 +13716,14 @@ virDomainDefParseXML(xmlDocPtr xml,
     }
 
     def->emulator = virXPathString("string(./devices/emulator[1])", ctxt);
+    if ((tmp = virXPathString("string(./devices/emulator/@type)", ctxt))) {
+        def->emulator_type = virDomainEmulatorTypeTypeFromString(tmp);
+        VIR_FREE(tmp);
+        if (def->emulator_type < 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("Unknown emulator type '%s'"), tmp);
+        }
+    }
 
     /* analysis of the disk devices */
     if ((n = virXPathNodeSet("./devices/disk", ctxt, &nodes)) < 0)
@@ -15690,6 +15702,14 @@ virDomainDefCheckABIStability(virDomainDefPtr src,
         goto error;
     }
 
+    if (src->emulator_type != dst->emulator_type) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                _("Target domain emulator type %s does not match source %s"),
+                virDomainEmulatorTypeTypeToString(dst->emulator_type),
+                virDomainEmulatorTypeTypeToString(src->emulator_type));
+        goto error;
+    }
+
     if (!virDomainDefFeaturesCheckABIStability(src, dst))
         goto error;
 
@@ -19893,8 +19913,20 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     virBufferAddLit(buf, "<devices>\n");
     virBufferAdjustIndent(buf, 2);
 
-    virBufferEscapeString(buf, "<emulator>%s</emulator>\n",
-                          def->emulator);
+    if (def->emulator ||
+            def->emulator_type != VIR_DOMAIN_EMULATOR_TYPE_DEFAULT) {
+        virBufferAddLit(buf, "<emulator");
+        if (def->emulator_type != VIR_DOMAIN_EMULATOR_TYPE_DEFAULT) {
+            virBufferAsprintf(buf, " type='%s'",
+                              virDomainEmulatorTypeTypeToString(def->emulator_type));
+        }
+        if (!def->emulator) {
+            virBufferAddLit(buf, "/>\n");
+        } else {
+            virBufferEscapeString(buf, ">%s</emulator>\n",
+                                  def->emulator);
+        }
+    }
 
     for (n = 0; n < def->ndisks; n++)
         if (virDomainDiskDefFormat(buf, def->disks[n], flags) < 0)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 28c6920..38b9037 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1918,6 +1918,13 @@ struct _virBlkioDevice {
 };
 
 typedef enum {
+    VIR_DOMAIN_EMULATOR_TYPE_DEFAULT,
+    VIR_DOMAIN_EMULATOR_TYPE_STUBDOM,
+
+    VIR_DOMAIN_EMULATOR_TYPE_LAST
+} virDomainEmulatorType;
+
+typedef enum {
     VIR_DOMAIN_RNG_MODEL_VIRTIO,
 
     VIR_DOMAIN_RNG_MODEL_LAST
@@ -2083,6 +2090,7 @@ struct _virDomainDef {
 
     virDomainOSDef os;
     char *emulator;
+    virDomainEmulatorType emulator_type;
     /* These three options are of type virTristateSwitch,
      * except VIR_DOMAIN_FEATURE_CAPABILITIES that is of type
      * virDomainCapabilitiesPolicy */
@@ -2841,6 +2849,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceMouseMode)
 VIR_ENUM_DECL(virDomainGraphicsVNCSharePolicy)
 VIR_ENUM_DECL(virDomainHyperv)
 VIR_ENUM_DECL(virDomainKVM)
+VIR_ENUM_DECL(virDomainEmulatorType)
 VIR_ENUM_DECL(virDomainRNGModel)
 VIR_ENUM_DECL(virDomainRNGBackend)
 VIR_ENUM_DECL(virDomainTPMModel)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index b1131ea..a84ce09 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -768,6 +768,23 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
             b_info->device_model_version = libxlDomainGetEmulatorType(def);
         }
 
+        /* In case of stubdom there will be two qemu instances:
+         *  - in stubdom (libxl uses hardcoded path for this one),
+         *  - in dom0 as a backend for stubdom (if needed).
+         * Emulator path control only the second one. It makes a perfect sense
+         * to use <emulator type='stubdom'/> (yes, without emulator path).
+         */
+        if (def->emulator_type == VIR_DOMAIN_EMULATOR_TYPE_STUBDOM)
+            libxl_defbool_set(&b_info->device_model_stubdomain, 1);
+
+        if (def->os.cmdline && def->os.cmdline[0]) {
+            b_info->extra_hvm = virStringSplit(def->os.cmdline, " ", 0);
+            if (b_info->extra_hvm == NULL) {
+                virReportOOMError();
+                return -1;
+            }
+        }
+
         if (def->nserials) {
             if (def->nserials > 1) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-- 
1.8.3.1




More information about the libvir-list mailing list