[libvirt] [PATCH v3 09/13] conf: Fix how iothread scheduler info is stored

Peter Krempa pkrempa at redhat.com
Fri Feb 5 15:44:45 UTC 2016


Similarly to previous commit change the way how iothread scheduler info
is stored and clean up a lot of unnecessary code.
---
 src/conf/domain_conf.c                             | 141 +++++++--------------
 src/conf/domain_conf.h                             |   8 +-
 src/libvirt_private.syms                           |   1 -
 src/qemu/qemu_driver.c                             |   3 -
 src/qemu/qemu_process.c                            |  39 +-----
 .../qemuxml2xmlout-cputune-iothreadsched.xml       |   3 +-
 6 files changed, 53 insertions(+), 142 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c88af32..e4047f3 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2560,10 +2560,6 @@ void virDomainDefFree(virDomainDefPtr def)

     virBitmapFree(def->cputune.emulatorpin);

-    for (i = 0; i < def->cputune.niothreadsched; i++)
-        virBitmapFree(def->cputune.iothreadsched[i].ids);
-    VIR_FREE(def->cputune.iothreadsched);
-
     virDomainNumaFree(def->numa);

     virSysinfoDefFree(def->sysinfo);
@@ -14648,25 +14644,26 @@ virDomainVcpuThreadSchedParse(xmlNodePtr node,
 }


-static int
-virDomainThreadSchedParse(xmlNodePtr node,
-                          unsigned int minid,
-                          unsigned int maxid,
-                          const char *name,
-                          virDomainThreadSchedParamPtr sp)
-{
-    if (!(sp->ids = virDomainSchedulerParse(node, name, &sp->policy,
-                                            &sp->priority)))
-        return -1;
+static virDomainThreadSchedParamPtr
+virDomainDefGetIOThreadSched(virDomainDefPtr def,
+                             unsigned int iothread)
+{
+    virDomainIOThreadIDDefPtr iothrinfo;

-    if (virBitmapNextSetBit(sp->ids, -1) < minid ||
-        virBitmapLastSetBit(sp->ids) > maxid) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("%sched bitmap is out of range"), name);
-        return -1;
-    }
+    if (!(iothrinfo = virDomainIOThreadIDFind(def, iothread)))
+        return NULL;

-    return 0;
+    return &iothrinfo->sched;
+}
+
+
+static int
+virDomainIOThreadSchedParse(xmlNodePtr node,
+                            virDomainDefPtr def)
+{
+    return virDomainThreadSchedParseHelper(node, "iothreads",
+                                           virDomainDefGetIOThreadSched,
+                                           def);
 }


@@ -15215,46 +15212,10 @@ virDomainDefParseXML(xmlDocPtr xml,
                        _("cannot extract iothreadsched nodes"));
         goto error;
     }
-    if (n) {
-        if (n > def->niothreadids) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("too many iothreadsched nodes in cputune"));
-            goto error;
-        }

-        if (VIR_ALLOC_N(def->cputune.iothreadsched, n) < 0)
+    for (i = 0; i < n; i++) {
+        if (virDomainIOThreadSchedParse(nodes[i], def) < 0)
             goto error;
-        def->cputune.niothreadsched = n;
-
-        for (i = 0; i < def->cputune.niothreadsched; i++) {
-            ssize_t pos = -1;
-
-            if (virDomainThreadSchedParse(nodes[i],
-                                          1, UINT_MAX,
-                                          "iothreads",
-                                          &def->cputune.iothreadsched[i]) < 0)
-                goto error;
-
-            while ((pos = virBitmapNextSetBit(def->cputune.iothreadsched[i].ids,
-                                              pos)) > -1) {
-                if (!virDomainIOThreadIDFind(def, pos)) {
-                    virReportError(VIR_ERR_XML_DETAIL, "%s",
-                                   _("iothreadsched attribute 'iothreads' "
-                                     "uses undefined iothread ids"));
-                    goto error;
-                }
-            }
-
-            for (j = 0; j < i; j++) {
-                if (virBitmapOverlaps(def->cputune.iothreadsched[i].ids,
-                                      def->cputune.iothreadsched[j].ids)) {
-                    virReportError(VIR_ERR_XML_DETAIL, "%s",
-                                   _("iothreadsched attributes 'iothreads' "
-                                     "must not overlap"));
-                    goto error;
-                }
-            }
-        }
     }
     VIR_FREE(nodes);

@@ -18406,29 +18367,6 @@ virDomainIOThreadIDDel(virDomainDefPtr def,
     }
 }

-void
-virDomainIOThreadSchedDelId(virDomainDefPtr def,
-                            unsigned int iothreadid)
-{
-    size_t i;
-
-    if (!def->cputune.iothreadsched || !def->cputune.niothreadsched)
-        return;
-
-    for (i = 0; i < def->cputune.niothreadsched; i++) {
-        if (virBitmapIsBitSet(def->cputune.iothreadsched[i].ids, iothreadid)) {
-            ignore_value(virBitmapClearBit(def->cputune.iothreadsched[i].ids,
-                                           iothreadid));
-            if (virBitmapIsAllClear(def->cputune.iothreadsched[i].ids)) {
-                virBitmapFree(def->cputune.iothreadsched[i].ids);
-                VIR_DELETE_ELEMENT(def->cputune.iothreadsched, i,
-                                   def->cputune.niothreadsched);
-            }
-            return;
-        }
-    }
-}
-

 static int
 virDomainEventActionDefFormat(virBufferPtr buf,
@@ -21645,6 +21583,27 @@ virDomainFormatVcpuSchedDef(virDomainDefPtr def,


 static int
+virDomainFormatIOThreadSchedDef(virDomainDefPtr def,
+                                virBufferPtr buf)
+{
+    virBitmapPtr allthreadmap;
+    int ret;
+
+    if (def->niothreadids == 0)
+        return 0;
+
+    if (!(allthreadmap = virDomainIOThreadIDMap(def)))
+        return -1;
+
+    ret = virDomainFormatSchedDef(def, buf, "iothreads",
+                                  virDomainDefGetIOThreadSched, allthreadmap);
+
+    virBitmapFree(allthreadmap);
+    return ret;
+}
+
+
+static int
 virDomainCputuneDefFormat(virBufferPtr buf,
                           virDomainDefPtr def)
 {
@@ -21721,22 +21680,8 @@ virDomainCputuneDefFormat(virBufferPtr buf,
     if (virDomainFormatVcpuSchedDef(def, &childrenBuf) < 0)
         goto cleanup;

-    for (i = 0; i < def->cputune.niothreadsched; i++) {
-        virDomainThreadSchedParamPtr sp = &def->cputune.iothreadsched[i];
-        char *ids = NULL;
-
-        if (!(ids = virBitmapFormat(sp->ids)))
-            goto cleanup;
-
-        virBufferAsprintf(&childrenBuf, "<iothreadsched iothreads='%s' scheduler='%s'",
-                          ids, virProcessSchedPolicyTypeToString(sp->policy));
-        VIR_FREE(ids);
-
-        if (sp->policy == VIR_PROC_POLICY_FIFO ||
-            sp->policy == VIR_PROC_POLICY_RR)
-            virBufferAsprintf(&childrenBuf, " priority='%d'", sp->priority);
-        virBufferAddLit(&childrenBuf, "/>\n");
-    }
+    if (virDomainFormatIOThreadSchedDef(def, &childrenBuf) < 0)
+        goto cleanup;

     if (virBufferUse(&childrenBuf)) {
         virBufferAddLit(buf, "<cputune>\n");
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 3868c13..ba87fea 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1898,7 +1898,6 @@ typedef enum {
 typedef struct _virDomainThreadSchedParam virDomainThreadSchedParam;
 typedef virDomainThreadSchedParam *virDomainThreadSchedParamPtr;
 struct _virDomainThreadSchedParam {
-    virBitmapPtr ids;
     virProcessSchedPolicy policy;
     int priority;
 };
@@ -2095,6 +2094,8 @@ struct _virDomainIOThreadIDDef {
     unsigned int iothread_id;
     int thread_id;
     virBitmapPtr cpumask;
+
+    virDomainThreadSchedParam sched;
 };

 void virDomainIOThreadIDDefFree(virDomainIOThreadIDDefPtr def);
@@ -2111,9 +2112,6 @@ struct _virDomainCputune {
     unsigned long long emulator_period;
     long long emulator_quota;
     virBitmapPtr emulatorpin;
-
-    size_t niothreadsched;
-    virDomainThreadSchedParamPtr iothreadsched;
 };


@@ -2124,7 +2122,6 @@ struct _virDomainVcpuInfo {
     bool online;
     virBitmapPtr cpumask;

-    /* note: the sched.ids bitmap is unused so it doesn't have to be cleared */
     virDomainThreadSchedParam sched;
 };

@@ -2705,7 +2702,6 @@ virDomainIOThreadIDDefPtr virDomainIOThreadIDAdd(virDomainDefPtr def,
 virBitmapPtr virDomainIOThreadIDMap(virDomainDefPtr def)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 void virDomainIOThreadIDDel(virDomainDefPtr def, unsigned int iothread_id);
-void virDomainIOThreadSchedDelId(virDomainDefPtr def, unsigned int iothread_id);

 unsigned int virDomainDefFormatConvertXMLFlags(unsigned int flags);

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 12cc887..b15da38 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -346,7 +346,6 @@ virDomainIOThreadIDDefFree;
 virDomainIOThreadIDDel;
 virDomainIOThreadIDFind;
 virDomainIOThreadIDMap;
-virDomainIOThreadSchedDelId;
 virDomainKeyWrapCipherNameTypeFromString;
 virDomainKeyWrapCipherNameTypeToString;
 virDomainLeaseDefFree;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 21a050d..aaeeedb 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6143,8 +6143,6 @@ qemuDomainHotplugDelIOThread(virQEMUDriverPtr driver,

     virDomainIOThreadIDDel(vm->def, iothread_id);

-    virDomainIOThreadSchedDelId(vm->def, iothread_id);
-
     if (qemuDomainDelCgroupForThread(priv->cgroup,
                                      VIR_CGROUP_THREAD_IOTHREAD,
                                      iothread_id) < 0)
@@ -6234,7 +6232,6 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver,
             }

             virDomainIOThreadIDDel(persistentDef, iothread_id);
-            virDomainIOThreadSchedDelId(persistentDef, iothread_id);
             persistentDef->iothreads--;
         }

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 311a69c..69e618d 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2281,34 +2281,6 @@ qemuProcessSetIOThreadsAffinity(virDomainObjPtr vm)
     return ret;
 }

-/* Set Scheduler parameters for vCPU or I/O threads. */
-int
-qemuProcessSetSchedParams(int id,
-                          pid_t pid,
-                          size_t nsp,
-                          virDomainThreadSchedParamPtr sp)
-{
-    bool val = false;
-    size_t i = 0;
-    virDomainThreadSchedParamPtr s = NULL;
-
-    for (i = 0; i < nsp; i++) {
-        if (virBitmapGetBit(sp[i].ids, id, &val) < 0) {
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Cannot get bit from bitmap"));
-        }
-        if (val) {
-            s = &sp[i];
-            break;
-        }
-    }
-
-    if (!s)
-        return 0;
-
-    return virProcessSetScheduler(pid, s->policy, s->priority);
-}
-
 static int
 qemuProcessSetSchedulers(virDomainObjPtr vm)
 {
@@ -2327,10 +2299,13 @@ qemuProcessSetSchedulers(virDomainObjPtr vm)
     }

     for (i = 0; i < vm->def->niothreadids; i++) {
-        if (qemuProcessSetSchedParams(vm->def->iothreadids[i]->iothread_id,
-                                      vm->def->iothreadids[i]->thread_id,
-                                      vm->def->cputune.niothreadsched,
-                                      vm->def->cputune.iothreadsched) < 0)
+        virDomainIOThreadIDDefPtr info = vm->def->iothreadids[i];
+
+        if (info->sched.policy == VIR_PROC_POLICY_NONE)
+            continue;
+
+        if (virProcessSetScheduler(info->thread_id, info->sched.policy,
+                                   info->sched.priority) < 0)
             return -1;
     }

diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune-iothreadsched.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune-iothreadsched.xml
index 5177114..4d665e9 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune-iothreadsched.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cputune-iothreadsched.xml
@@ -13,8 +13,7 @@
     <vcpupin vcpu='1' cpuset='1'/>
     <emulatorpin cpuset='1'/>
     <vcpusched vcpus='0-1' scheduler='fifo' priority='1'/>
-    <iothreadsched iothreads='1,3' scheduler='batch'/>
-    <iothreadsched iothreads='2' scheduler='batch'/>
+    <iothreadsched iothreads='1-3' scheduler='batch'/>
   </cputune>
   <os>
     <type arch='i686' machine='pc'>hvm</type>
-- 
2.6.2




More information about the libvir-list mailing list