Convert libxl driver over to use virPortAllocator APIs

Replace the current libxl driver code for managing port
reservations with the new virPortAllocator APIs.
This commit is contained in:
Daniel P. Berrange 2013-01-11 12:09:53 +00:00
parent dfb1022c72
commit 0995b00084
3 changed files with 14 additions and 65 deletions

View File

@ -64,60 +64,6 @@ static const char *xen_cap_re = "(xen|hvm)-[[:digit:]]+\\.[[:digit:]]+-(x86_32|x
static regex_t xen_cap_rec; 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, static int libxlDefaultConsoleType(const char *ostype,
virArch arch ATTRIBUTE_UNUSED) virArch arch ATTRIBUTE_UNUSED)
{ {
@ -712,7 +658,7 @@ libxlMakeVfb(libxlDriverPrivatePtr driver,
virDomainGraphicsDefPtr l_vfb, virDomainGraphicsDefPtr l_vfb,
libxl_device_vfb *x_vfb) libxl_device_vfb *x_vfb)
{ {
int port; unsigned short port;
const char *listenAddr; const char *listenAddr;
switch (l_vfb->type) { switch (l_vfb->type) {
@ -735,8 +681,10 @@ libxlMakeVfb(libxlDriverPrivatePtr driver,
/* driver handles selection of free port */ /* driver handles selection of free port */
libxl_defbool_set(&x_vfb->vnc.findunused, 0); libxl_defbool_set(&x_vfb->vnc.findunused, 0);
if (l_vfb->data.vnc.autoport) { 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, virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("Unable to find an unused VNC port")); "%s", _("Unable to find an unused VNC port"));
return -1; return -1;

View File

@ -34,7 +34,7 @@
# include "domain_event.h" # include "domain_event.h"
# include "capabilities.h" # include "capabilities.h"
# include "configmake.h" # include "configmake.h"
# include "virbitmap.h" # include "virportallocator.h"
# define LIBXL_VNC_PORT_MIN 5900 # define LIBXL_VNC_PORT_MIN 5900
@ -60,7 +60,7 @@ struct _libxlDriverPrivate {
/* libxl ctx for driver wide ops; getVersion, getNodeInfo, ... */ /* libxl ctx for driver wide ops; getVersion, getNodeInfo, ... */
libxl_ctx *ctx; libxl_ctx *ctx;
virBitmapPtr reservedVNCPorts; virPortAllocatorPtr reservedVNCPorts;
size_t nactive; size_t nactive;
virStateInhibitCallback inhibitCallback; virStateInhibitCallback inhibitCallback;

View File

@ -466,8 +466,8 @@ libxlVmCleanup(libxlDriverPrivatePtr driver,
vm->def->graphics[0]->data.vnc.autoport) { vm->def->graphics[0]->data.vnc.autoport) {
vnc_port = vm->def->graphics[0]->data.vnc.port; vnc_port = vm->def->graphics[0]->data.vnc.port;
if (vnc_port >= LIBXL_VNC_PORT_MIN) { if (vnc_port >= LIBXL_VNC_PORT_MIN) {
if (virBitmapClearBit(driver->reservedVNCPorts, if (virPortAllocatorRelease(driver->reservedVNCPorts,
vnc_port - LIBXL_VNC_PORT_MIN) < 0) vnc_port) < 0)
VIR_DEBUG("Could not mark port %d as unused", vnc_port); VIR_DEBUG("Could not mark port %d as unused", vnc_port);
} }
} }
@ -923,7 +923,7 @@ libxlShutdown(void)
if (libxl_driver->logger_file) if (libxl_driver->logger_file)
VIR_FORCE_FCLOSE(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->configDir);
VIR_FREE(libxl_driver->autostartDir); VIR_FREE(libxl_driver->autostartDir);
@ -979,9 +979,10 @@ libxlStartup(bool privileged,
libxlDriverLock(libxl_driver); libxlDriverLock(libxl_driver);
/* Allocate bitmap for vnc port reservation */ /* Allocate bitmap for vnc port reservation */
if ((libxl_driver->reservedVNCPorts = if (!(libxl_driver->reservedVNCPorts =
virBitmapNew(LIBXL_VNC_PORT_MAX - LIBXL_VNC_PORT_MIN)) == NULL) virPortAllocatorNew(LIBXL_VNC_PORT_MIN,
goto out_of_memory; LIBXL_VNC_PORT_MAX)))
goto error;
if (virDomainObjListInit(&libxl_driver->domains) < 0) if (virDomainObjListInit(&libxl_driver->domains) < 0)
goto out_of_memory; goto out_of_memory;