[libvirt] [PATCH 7/7] Convert libxl driver over to use virPortAllocator APIs

Daniel P. Berrange berrange at redhat.com
Fri Jan 11 12:13:11 UTC 2013


From: "Daniel P. Berrange" <berrange at redhat.com>

Replace the current libxl driver code for managing port
reservations with the new virPortAllocator APIs.
---
 src/libxl/libxl_conf.c   | 62 ++++--------------------------------------------
 src/libxl/libxl_conf.h   |  4 ++--
 src/libxl/libxl_driver.c | 13 +++++-----
 3 files changed, 14 insertions(+), 65 deletions(-)

diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 2705e65..9245a24 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -64,60 +64,6 @@ static const char *xen_cap_re = "(xen|hvm)-[[:digit:]]+\\.[[:digit:]]+-(x86_32|x
 static regex_t xen_cap_rec;
 
 
-static int
-libxlNextFreeVncPort(libxlDriverPrivatePtr driver, int startPort)
-{
-    int i;
-
-    for (i = startPort ; i < LIBXL_VNC_PORT_MAX; i++) {
-        int fd;
-        int reuse = 1;
-        struct sockaddr_in addr;
-        bool used = false;
-
-        if (virBitmapGetBit(driver->reservedVNCPorts,
-                            i - LIBXL_VNC_PORT_MIN, &used) < 0)
-            VIR_DEBUG("virBitmapGetBit failed on bit %d", i - LIBXL_VNC_PORT_MIN);
-
-        if (used)
-            continue;
-
-        addr.sin_family = AF_INET;
-        addr.sin_port = htons(i);
-        addr.sin_addr.s_addr = htonl(INADDR_ANY);
-        fd = socket(PF_INET, SOCK_STREAM, 0);
-        if (fd < 0)
-            return -1;
-
-        if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (void*)&reuse, sizeof(reuse)) < 0) {
-            VIR_FORCE_CLOSE(fd);
-            break;
-        }
-
-        if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) {
-            /* Not in use, lets grab it */
-            VIR_FORCE_CLOSE(fd);
-            /* Add port to bitmap of reserved ports */
-            if (virBitmapSetBit(driver->reservedVNCPorts,
-                                i - LIBXL_VNC_PORT_MIN) < 0) {
-                VIR_DEBUG("virBitmapSetBit failed on bit %d",
-                          i - LIBXL_VNC_PORT_MIN);
-            }
-            return i;
-        }
-        VIR_FORCE_CLOSE(fd);
-
-        if (errno == EADDRINUSE) {
-            /* In use, try next */
-            continue;
-        }
-        /* Some other bad failure, get out.. */
-        break;
-    }
-    return -1;
-}
-
-
 static int libxlDefaultConsoleType(const char *ostype,
                                    virArch arch ATTRIBUTE_UNUSED)
 {
@@ -712,7 +658,7 @@ libxlMakeVfb(libxlDriverPrivatePtr driver,
              virDomainGraphicsDefPtr l_vfb,
              libxl_device_vfb *x_vfb)
 {
-    int port;
+    unsigned short port;
     const char *listenAddr;
 
     switch (l_vfb->type) {
@@ -735,8 +681,10 @@ libxlMakeVfb(libxlDriverPrivatePtr driver,
             /* driver handles selection of free port */
             libxl_defbool_set(&x_vfb->vnc.findunused, 0);
             if (l_vfb->data.vnc.autoport) {
-                port = libxlNextFreeVncPort(driver, LIBXL_VNC_PORT_MIN);
-                if (port < 0) {
+
+                if (virPortAllocatorAcquire(driver->reservedVNCPorts, &port) < 0)
+                    return -1;
+                if (port == 0) {
                     virReportError(VIR_ERR_INTERNAL_ERROR,
                                    "%s", _("Unable to find an unused VNC port"));
                     return -1;
diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
index c8808a1..a3cce08 100644
--- a/src/libxl/libxl_conf.h
+++ b/src/libxl/libxl_conf.h
@@ -34,7 +34,7 @@
 # include "domain_event.h"
 # include "capabilities.h"
 # include "configmake.h"
-# include "virbitmap.h"
+# include "virportallocator.h"
 
 
 # define LIBXL_VNC_PORT_MIN  5900
@@ -60,7 +60,7 @@ struct _libxlDriverPrivate {
     /* libxl ctx for driver wide ops; getVersion, getNodeInfo, ... */
     libxl_ctx *ctx;
 
-    virBitmapPtr reservedVNCPorts;
+    virPortAllocatorPtr reservedVNCPorts;
 
     size_t nactive;
     virStateInhibitCallback inhibitCallback;
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 8017a4a..64a52fb 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -466,8 +466,8 @@ libxlVmCleanup(libxlDriverPrivatePtr driver,
         vm->def->graphics[0]->data.vnc.autoport) {
         vnc_port = vm->def->graphics[0]->data.vnc.port;
         if (vnc_port >= LIBXL_VNC_PORT_MIN) {
-            if (virBitmapClearBit(driver->reservedVNCPorts,
-                                  vnc_port - LIBXL_VNC_PORT_MIN) < 0)
+            if (virPortAllocatorRelease(driver->reservedVNCPorts,
+                                        vnc_port) < 0)
                 VIR_DEBUG("Could not mark port %d as unused", vnc_port);
         }
     }
@@ -923,7 +923,7 @@ libxlShutdown(void)
     if (libxl_driver->logger_file)
         VIR_FORCE_FCLOSE(libxl_driver->logger_file);
 
-    virBitmapFree(libxl_driver->reservedVNCPorts);
+    virObjectUnref(libxl_driver->reservedVNCPorts);
 
     VIR_FREE(libxl_driver->configDir);
     VIR_FREE(libxl_driver->autostartDir);
@@ -979,9 +979,10 @@ libxlStartup(bool privileged,
     libxlDriverLock(libxl_driver);
 
     /* Allocate bitmap for vnc port reservation */
-    if ((libxl_driver->reservedVNCPorts =
-         virBitmapNew(LIBXL_VNC_PORT_MAX - LIBXL_VNC_PORT_MIN)) == NULL)
-        goto out_of_memory;
+    if (!(libxl_driver->reservedVNCPorts =
+          virPortAllocatorNew(LIBXL_VNC_PORT_MIN,
+                              LIBXL_VNC_PORT_MAX)))
+        goto error;
 
     if (virDomainObjListInit(&libxl_driver->domains) < 0)
         goto out_of_memory;
-- 
1.8.0.1




More information about the libvir-list mailing list