[libvirt] [PATCH 3/6] virDomainFormatSchedDef: factor out subset code
Martin Kletzander
mkletzan at redhat.com
Thu Nov 10 15:24:43 UTC 2016
On Mon, Nov 07, 2016 at 10:01:14AM +0100, Martin Polednik wrote:
>The code within the function is too specific for priority attribute of
>RT schedulers. To allow addition of schedulers that group by different
>properties, we factor out the logic to calculate cpu subset. Instead
>of comparing by priority, the new code accepts comparator for the 2
>sched structs.
>---
> src/conf/domain_conf.c | 77 +++++++++++++++++++++++++++++++++++---------------
> 1 file changed, 55 insertions(+), 22 deletions(-)
>
>diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>index ca0fdfd..0ed755c 100644
>--- a/src/conf/domain_conf.c
>+++ b/src/conf/domain_conf.c
>@@ -23058,6 +23058,47 @@ virDomainDefHasCapabilitiesFeatures(virDomainDefPtr def)
> return false;
> }
>
>+static bool
>+virDomainSchedPriorityComparator(virDomainThreadSchedParamPtr baseSched,
>+ virDomainThreadSchedParamPtr sched)
>+{
>+ bool ret = false;
>+ ret = (baseSched->priority == sched->priority);
>+
>+ return ret;
Just return (baseSched->priority == sched->priority); all else is not
needed here.
>+}
>+
>+static virDomainThreadSchedParamPtr
>+virDomainSchedSubsetCharacteristic(virDomainDefPtr def,
>+ virBitmapPtr schedMap,
>+ virBitmapPtr subsetMap,
>+ virDomainThreadSchedParamPtr (*func)(virDomainDefPtr, unsigned int),
>+ bool (*comparator)(virDomainThreadSchedParamPtr,
>+ virDomainThreadSchedParamPtr))
>+{
>+ ssize_t nextidx;
>+ virDomainThreadSchedParamPtr sched;
>+ virDomainThreadSchedParamPtr baseSched = NULL;
>+
>+ virBitmapClearAll(subsetMap);
>+
>+ /* we need to find a subset of vCPUs with the given scheduler
>+ * that share the priority */
>+ nextidx = virBitmapNextSetBit(schedMap, -1);
>+ if (!(sched = func(def, nextidx)))
>+ return NULL;
>+
>+ baseSched = sched;
>+ ignore_value(virBitmapSetBit(subsetMap, nextidx));
>+
>+ while ((nextidx = virBitmapNextSetBit(schedMap, nextidx)) > -1) {
>+ sched = func(def, nextidx);
>+ if (sched && comparator(baseSched, sched))
>+ ignore_value(virBitmapSetBit(subsetMap, nextidx));
>+ }
>+
>+ return baseSched;
>+}
>
> /**
> * virDomainFormatSchedDef:
>@@ -23082,8 +23123,9 @@ virDomainFormatSchedDef(virDomainDefPtr def,
> virBitmapPtr resourceMap)
> {
> virBitmapPtr schedMap = NULL;
>- virBitmapPtr prioMap = NULL;
>+ virBitmapPtr subsetMap = NULL;
> virDomainThreadSchedParamPtr sched;
>+ virDomainThreadSchedParamPtr baseSched;
> char *tmp = NULL;
> ssize_t next;
> size_t i;
>@@ -23098,7 +23140,7 @@ virDomainFormatSchedDef(virDomainDefPtr def,
> */
>
> if (!(schedMap = virBitmapNew(VIR_DOMAIN_CPUMASK_LEN)) ||
>- !(prioMap = virBitmapNew(VIR_DOMAIN_CPUMASK_LEN)))
>+ !(subsetMap = virBitmapNew(VIR_DOMAIN_CPUMASK_LEN)))
> goto cleanup;
>
> for (i = VIR_PROC_POLICY_NONE + 1; i < VIR_PROC_POLICY_LAST; i++) {
>@@ -23117,9 +23159,8 @@ virDomainFormatSchedDef(virDomainDefPtr def,
> * have them */
> while (!virBitmapIsAllClear(schedMap)) {
> virBitmapPtr currentMap = NULL;
>- ssize_t nextprio;
> bool hasPriority = false;
>- int priority = 0;
>+ baseSched = NULL;
>
> switch ((virProcessSchedPolicy) i) {
> case VIR_PROC_POLICY_NONE:
>@@ -23132,25 +23173,17 @@ virDomainFormatSchedDef(virDomainDefPtr def,
>
> case VIR_PROC_POLICY_FIFO:
> case VIR_PROC_POLICY_RR:
>- virBitmapClearAll(prioMap);
> hasPriority = true;
>
>- /* we need to find a subset of vCPUs with the given scheduler
>- * that share the priority */
>- nextprio = virBitmapNextSetBit(schedMap, -1);
>- if (!(sched = func(def, nextprio)))
>+ baseSched = virDomainSchedSubsetCharacteristic(def,
>+ schedMap,
>+ subsetMap,
>+ func,
>+ virDomainSchedPriorityComparator);
>+ if (baseSched == NULL)
> goto cleanup;
>
>- priority = sched->priority;
>- ignore_value(virBitmapSetBit(prioMap, nextprio));
>-
>- while ((nextprio = virBitmapNextSetBit(schedMap, nextprio)) > -1) {
>- sched = func(def, nextprio);
>- if (sched && sched->priority == priority)
>- ignore_value(virBitmapSetBit(prioMap, nextprio));
>- }
>-
>- currentMap = prioMap;
>+ currentMap = subsetMap;
> break;
This looks like it was factored out but with the combination of renaming
the variable with the same patch makes it weird to review.
>@@ -23164,8 +23197,8 @@ virDomainFormatSchedDef(virDomainDefPtr def,
> virProcessSchedPolicyTypeToString(i));
> VIR_FREE(tmp);
>
>- if (hasPriority)
>- virBufferAsprintf(buf, " priority='%d'", priority);
>+ if (hasPriority && baseSched != NULL)
>+ virBufferAsprintf(buf, " priority='%d'", baseSched->priority);
>
> virBufferAddLit(buf, "/>\n");
>
>@@ -23178,7 +23211,7 @@ virDomainFormatSchedDef(virDomainDefPtr def,
>
> cleanup:
> virBitmapFree(schedMap);
>- virBitmapFree(prioMap);
>+ virBitmapFree(subsetMap);
> return ret;
> }
>
>--
>2.8.1
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20161110/fffffdaf/attachment-0001.sig>
More information about the libvir-list
mailing list