[libvirt] [PATCH 2/2] virDomainFormatSchedDef: Check @schedMap bounds

Michal Privoznik mprivozn at redhat.com
Wed Feb 10 10:37:38 UTC 2016


In the function, @schedMap is a bitmap used to track pinning of
scheduling units (e.g. vcpu, iothreads). However, as a corner
case it may happen that it's empty but the scheduler is set to
either RR or FIFO. If that's the case we may get -1 when asking
for the next bit set in @schedMap and proceed with that. The code
is able to deal with that because we are ignoring some errors
afterwards, but it's safer to check upfront.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/conf/domain_conf.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 67415fa..a842ee4 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -21485,20 +21485,21 @@ 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);
-                sched = func(def, nextprio);
-                priority = sched->priority;
-
-                ignore_value(virBitmapSetBit(prioMap, nextprio));
-
-                while ((nextprio = virBitmapNextSetBit(schedMap, nextprio)) > -1) {
+                if ((nextprio = virBitmapNextSetBit(schedMap, -1)) > -1) {
                     sched = func(def, nextprio);
-                    if (sched->priority == priority)
-                        ignore_value(virBitmapSetBit(prioMap, nextprio));
+                    priority = sched->priority;
+                    hasPriority = true;
+
+                    ignore_value(virBitmapSetBit(prioMap, nextprio));
+
+                    while ((nextprio = virBitmapNextSetBit(schedMap, nextprio)) > -1) {
+                        sched = func(def, nextprio);
+                        if (sched->priority == priority)
+                            ignore_value(virBitmapSetBit(prioMap, nextprio));
+                    }
                 }
 
                 currentMap = prioMap;
-- 
2.4.10




More information about the libvir-list mailing list