[libvirt] [PATCH v2 4/6] conf: Add support for emulatorsched

Martin Kletzander mkletzan at redhat.com
Mon Apr 15 13:14:25 UTC 2019


Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 docs/formatdomain.html.in               | 17 ++++++----
 docs/schemas/domaincommon.rng           |  5 +++
 src/conf/domain_conf.c                  | 44 +++++++++++++++++++++++++
 src/conf/domain_conf.h                  |  1 +
 tests/genericxml2xmlindata/cputune.xml  | 37 +++++++++++++++++++++
 tests/genericxml2xmloutdata/cputune.xml | 40 ++++++++++++++++++++++
 tests/genericxml2xmltest.c              |  2 ++
 7 files changed, 140 insertions(+), 6 deletions(-)
 create mode 100644 tests/genericxml2xmlindata/cputune.xml
 create mode 100644 tests/genericxml2xmloutdata/cputune.xml

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index af4b88c60984..74d32e2a9b8c 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -935,15 +935,19 @@
         <span class="since">Only QEMU driver support since 2.1.0</span>
       </dd>
 
-      <dt><code>vcpusched</code> and <code>iothreadsched</code></dt>
+      <dt><code>vcpusched</code>, <code>iothreadsched</code>
+      and <code>emulatorsched</code></dt>
       <dd>
-        The optional <code>vcpusched</code> and <code>iothreadsched</code>
-        elements specify the scheduler type
+        The optional
+        <code>vcpusched</code>, <code>iothreadsched</code>
+        and <code>emulatorsched</code> elements specify the scheduler type
         (values <code>batch</code>, <code>idle</code>, <code>fifo</code>,
-        <code>rr</code>) for particular vCPU and IOThread threads respecively.
-        The attributes <code>vcpus</code> and <code>iothreads</code> select
+        <code>rr</code>) for particular vCPU, IOThread and emulator threads
+        respecively.  For <code>vcpusched</code> and <code>iothreadsched</code>
+        the attributes <code>vcpus</code> and <code>iothreads</code> select
         which vCPUs/IOThreads this setting applies to, leaving them out sets the
-        default.  Valid <code>vcpus</code> values start at 0 through one less
+        default.  The element <code>emulatorsched</code> does not have that
+        attribute. Valid <code>vcpus</code> values start at 0 through one less
         than the number of vCPU's defined for the
         domain. Valid <code>iothreads</code> values are described in
         the <code>iothreadids</code>
@@ -955,6 +959,7 @@
         well (and is ignored for non-real-time ones). The value range
         for the priority depends on the host kernel (usually 1-99).
         <span class="since">Since 1.2.13</span>
+        <code>emulatorsched</code> <span class="since">since 5.3.0</span>
       </dd>
 
       <dt><code>cachetune</code><span class="since">Since 4.1.0</span></dt>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 623ef28719df..111b85c36fd3 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -967,6 +967,11 @@
             <ref name="schedparam"/>
           </element>
         </zeroOrMore>
+        <optional>
+          <element name="emulatorsched">
+            <ref name="schedparam"/>
+          </element>
+        </optional>
         <zeroOrMore>
           <element name="cachetune">
             <attribute name="vcpus">
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e7b8b51aad0e..17e8975be399 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3396,6 +3396,7 @@ void virDomainDefFree(virDomainDefPtr def)
     virDomainIOThreadIDDefArrayFree(def->iothreadids, def->niothreadids);
 
     virBitmapFree(def->cputune.emulatorpin);
+    VIR_FREE(def->cputune.emulatorsched);
 
     virDomainNumaFree(def->numa);
 
@@ -18483,6 +18484,25 @@ virDomainSchedulerParseCommonAttrs(xmlNodePtr node,
 }
 
 
+static int
+virDomainEmulatorSchedParse(xmlNodePtr node,
+                            virDomainDefPtr def)
+{
+    VIR_AUTOFREE(virDomainThreadSchedParamPtr) sched = NULL;
+
+    if (VIR_ALLOC(sched) < 0)
+        return -1;
+
+    if (virDomainSchedulerParseCommonAttrs(node,
+                                           &sched->policy,
+                                           &sched->priority) < 0)
+        return -1;
+
+    VIR_STEAL_PTR(def->cputune.emulatorsched, sched);
+    return 0;
+}
+
+
 static virBitmapPtr
 virDomainSchedulerParse(xmlNodePtr node,
                         const char *name,
@@ -19913,6 +19933,25 @@ virDomainDefParseXML(xmlDocPtr xml,
     }
     VIR_FREE(nodes);
 
+    if ((n = virXPathNodeSet("./cputune/emulatorsched", ctxt, &nodes)) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("cannot extract emulatorsched nodes"));
+        goto error;
+    }
+
+    if (n) {
+        if (n > 1) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("only one emulatorsched is supported"));
+            VIR_FREE(nodes);
+            goto error;
+        }
+
+        if (virDomainEmulatorSchedParse(nodes[0], def) < 0)
+            goto error;
+    }
+    VIR_FREE(nodes);
+
     if ((n = virXPathNodeSet("./cputune/cachetune", ctxt, &nodes)) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("cannot extract cachetune nodes"));
@@ -27490,6 +27529,11 @@ virDomainCputuneDefFormat(virBufferPtr buf,
         VIR_FREE(cpumask);
     }
 
+    if (def->cputune.emulatorsched) {
+        virDomainSchedulerFormat(&childrenBuf, "emulator",
+                                 def->cputune.emulatorsched, 0, false);
+    }
+
     for (i = 0; i < def->maxvcpus; i++) {
         virDomainSchedulerFormat(&childrenBuf, "vcpu",
                                  &def->vcpus[i]->sched, i, true);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 12eb71c1977e..988ef90f1189 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2159,6 +2159,7 @@ struct _virDomainCputune {
     unsigned long long iothread_period;
     long long iothread_quota;
     virBitmapPtr emulatorpin;
+    virDomainThreadSchedParamPtr emulatorsched;
 };
 
 
diff --git a/tests/genericxml2xmlindata/cputune.xml b/tests/genericxml2xmlindata/cputune.xml
new file mode 100644
index 000000000000..999c8cef73cd
--- /dev/null
+++ b/tests/genericxml2xmlindata/cputune.xml
@@ -0,0 +1,37 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>4</vcpu>
+  <iothreads>4</iothreads>
+  <cputune>
+    <shares>2048</shares>
+    <period>1000000</period>
+    <quota>-1</quota>
+    <vcpupin vcpu='0' cpuset='0'/>
+    <vcpupin vcpu='1' cpuset='1'/>
+    <emulatorpin cpuset='1'/>
+    <emulatorsched scheduler='fifo' priority='2'/>
+    <vcpusched vcpus='0-1' scheduler='fifo' priority='1'/>
+    <vcpusched vcpus='1-3,^1' scheduler='idle'/>
+    <iothreadsched iothreads='1,3' scheduler='batch'/>
+    <iothreadsched iothreads='2' scheduler='rr' priority='99'/>
+  </cputune>
+  <os>
+    <type arch='x86_64' machine='q35'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <features>
+    <smm state='on'>
+      <tseg unit='MiB'>48</tseg>
+    </smm>
+  </features>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+  </devices>
+</domain>
diff --git a/tests/genericxml2xmloutdata/cputune.xml b/tests/genericxml2xmloutdata/cputune.xml
new file mode 100644
index 000000000000..f9f99a4846e6
--- /dev/null
+++ b/tests/genericxml2xmloutdata/cputune.xml
@@ -0,0 +1,40 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory unit='KiB'>219100</memory>
+  <currentMemory unit='KiB'>219100</currentMemory>
+  <vcpu placement='static'>4</vcpu>
+  <iothreads>4</iothreads>
+  <cputune>
+    <shares>2048</shares>
+    <period>1000000</period>
+    <quota>-1</quota>
+    <vcpupin vcpu='0' cpuset='0'/>
+    <vcpupin vcpu='1' cpuset='1'/>
+    <emulatorpin cpuset='1'/>
+    <emulatorsched scheduler='fifo' priority='2'/>
+    <vcpusched vcpus='0' scheduler='fifo' priority='1'/>
+    <vcpusched vcpus='1' scheduler='fifo' priority='1'/>
+    <vcpusched vcpus='2' scheduler='idle'/>
+    <vcpusched vcpus='3' scheduler='idle'/>
+    <iothreadsched iothreads='1' scheduler='batch'/>
+    <iothreadsched iothreads='2' scheduler='rr' priority='99'/>
+    <iothreadsched iothreads='3' scheduler='batch'/>
+  </cputune>
+  <os>
+    <type arch='x86_64' machine='q35'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <features>
+    <smm state='on'>
+      <tseg unit='MiB'>48</tseg>
+    </smm>
+  </features>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+  </devices>
+</domain>
diff --git a/tests/genericxml2xmltest.c b/tests/genericxml2xmltest.c
index 4393d444641d..1840d6e6a8f9 100644
--- a/tests/genericxml2xmltest.c
+++ b/tests/genericxml2xmltest.c
@@ -149,6 +149,8 @@ mymain(void)
 
     DO_TEST("launch-security-sev");
 
+    DO_TEST_DIFFERENT("cputune");
+
     virObjectUnref(caps);
     virObjectUnref(xmlopt);
 
-- 
2.21.0




More information about the libvir-list mailing list