[libvirt] [RFC PATCH 1/3] add new function virDomainGetVirtioMaxPort

Jonathan Lebon jlebon at redhat.com
Mon Jan 6 16:13:21 UTC 2014


This function is then used to simplify port assignment. It will also be
used in upcoming patches.
---
 src/conf/domain_conf.c | 30 ++++++++++++++++++++----------
 1 file changed, 20 insertions(+), 10 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e65f3e3..2bade1b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10896,6 +10896,21 @@ virDomainDefMaybeAddController(virDomainDefPtr def,
     return 0;
 }
 
+/* Returns the highest port number among all the virtio-serial channels
+ * using the controller with index idx (or -1 if no channel uses it). */
+static int
+virDomainGetVirtioSerialMaxPort(virDomainDefPtr def, int idx)
+{
+    size_t i;
+    int maxport = -1;
+    for (i = 0; i < def->nchannels; i++) {
+        if (def->channels[i]->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL &&
+            def->channels[i]->info.addr.vioserial.controller == idx &&
+            (int)def->channels[i]->info.addr.vioserial.port > maxport)
+            maxport = def->channels[i]->info.addr.vioserial.port;
+    }
+    return maxport;
+}
 
 /* Parse a memory element located at XPATH within CTXT, and store the
  * result into MEM.  If REQUIRED, then the value must exist;
@@ -12233,18 +12248,13 @@ virDomainDefParseXML(xmlDocPtr xml,
             chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
             chr->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL;
 
+        /* assign next port available on controller */
         if (chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL &&
             chr->info.addr.vioserial.port == 0) {
-            int maxport = 0;
-            size_t j;
-            for (j = 0; j < i; j++) {
-                virDomainChrDefPtr thischr = def->channels[j];
-                if (thischr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL &&
-                    thischr->info.addr.vioserial.controller == chr->info.addr.vioserial.controller &&
-                    thischr->info.addr.vioserial.bus == chr->info.addr.vioserial.bus &&
-                    (int)thischr->info.addr.vioserial.port > maxport)
-                    maxport = thischr->info.addr.vioserial.port;
-            }
+            int maxport = virDomainGetVirtioSerialMaxPort
+                            (def, chr->info.addr.vioserial.controller);
+            if (maxport < 0)
+                maxport = 0;
             chr->info.addr.vioserial.port = maxport + 1;
         }
     }
-- 
1.8.3.1




More information about the libvir-list mailing list