
Stefano Stabellini wrote:
On Fri, 18 Feb 2011, Jim Fehlig wrote:
+static int +libxlMakeDiskList(virDomainDefPtr def, libxl_domain_config *d_config) +{ + virDomainDiskDefPtr *l_disks = def->disks; + int ndisks = def->ndisks; + libxl_device_disk *x_disks; + int i; + + if (VIR_ALLOC_N(x_disks, ndisks) < 0) { + virReportOOMError(); + return -1; + } + + for (i = 0; i < ndisks; i++) { + if (l_disks[i]->src && + (x_disks[i].physpath = strdup(l_disks[i]->src)) == NULL) { + virReportOOMError(); + goto error; + } + + if (l_disks[i]->dst && + (x_disks[i].virtpath = strdup(l_disks[i]->dst)) == NULL) { + virReportOOMError(); + goto error; + } + + if (l_disks[i]->driverName) { + if (STREQ(l_disks[i]->driverName, "tap") || + STREQ(l_disks[i]->driverName, "tap2")) { + if (l_disks[i]->driverType && + STREQ(l_disks[i]->driverType, "qcow2")) + x_disks[i].phystype = PHYSTYPE_QCOW2; + else if (l_disks[i]->driverType && + STREQ(l_disks[i]->driverType, "aio")) + x_disks[i].phystype = PHYSTYPE_AIO; + else if (l_disks[i]->driverType && + STREQ(l_disks[i]->driverType, "vhd")) + x_disks[i].phystype = PHYSTYPE_VHD; + } else if (STREQ(l_disks[i]->driverName, "file")) { + x_disks[i].phystype = PHYSTYPE_FILE; + } else if (STREQ(l_disks[i]->driverName, "phy")) { + x_disks[i].phystype = PHYSTYPE_PHY; + } + } else { + /* Default to file?? */ + x_disks[i].phystype = PHYSTYPE_FILE; + }
few days ago the patch that removes phystype and introduces backend and format has been applied, so this code needs an update
Thanks for the review and comments. I've posted a new version based on xen-unstable c/s 22940.
+static void libxlEventHandler(int watch, + int fd, + int events, + void *data) +{ + libxlDriverPrivatePtr driver = libxl_driver; + virDomainObjPtr vm = data; + libxlDomainObjPrivatePtr priv; + libxl_event event; + libxl_dominfo info; + + libxlDriverLock(driver); + virDomainObjLock(vm); + libxlDriverUnlock(driver); + + priv = vm->privateData; + + memset(&event, 0, sizeof(event)); + memset(&info, 0, sizeof(info)); + + if (priv->waiterFD != fd || priv->eventHdl != watch) { + virEventRemoveHandle(watch); + goto cleanup; + } + + if (!(events & VIR_EVENT_HANDLE_READABLE)) { + goto cleanup; + } + + if (libxl_get_event(&priv->ctx, &event)) { + goto cleanup; + } + + if (event.type == LIBXL_EVENT_DOMAIN_DEATH) { + /* libxl_event_get_domain_death_info returns 1 if death + * event was for this domid */ + if (libxl_event_get_domain_death_info(&priv->ctx, + vm->def->id, + &event, + &info) != 1) { + goto cleanup; + } + + virEventRemoveHandle(watch); + if (info.shutdown_reason == SHUTDOWN_poweroff) { + libxl_domain_destroy(&priv->ctx, vm->def->id, 0); + if (vm->persistent) { + vm->def->id = -1; + vm->state = VIR_DOMAIN_SHUTOFF; + } else { + libxl_free_waiter(priv->dWaiter); + VIR_FREE(priv->dWaiter); + virDomainRemoveInactive(&driver->domains, vm); + vm = NULL; + } + } else if (info.shutdown_reason == SHUTDOWN_reboot) { + libxl_domain_destroy(&priv->ctx, vm->def->id, 0); + vm->def->id = -1; + vm->state = VIR_DOMAIN_SHUTOFF; + sleep(1); + libxlVmStart(vm, 0);
we need to handle at least SHUTDOWN_suspend and SHUTDOWN_crash too
The updated patch handles SHUTDOWN_crash similar to SHUTDOWN_poweroff. I've ignored SHUTDOWN_suspend since the driver does not yet implement domainSave function. Also notice I've ignored any user-specified actions on these events, e.g. coredump and restart. But IMO, these type of improvements can be added incrementally. I'd like to get a basic driver upstream so others can easily contribute.
+ } else { + VIR_INFO("Unhandled shutdown_reason %d", info.shutdown_reason); + } + }
we should call libxl_free_event before returning, otherwise we leak two strings
Fixed in updated patch. [...]
+ + libxl_driver->caps->privateDataAllocFunc = libxlDomainObjPrivateAlloc; + libxl_driver->caps->privateDataFreeFunc = libxlDomainObjPrivateFree;
If I understand correctly privateDataAllocFunc is called at each domain creation
It is called when a domain is introduced to libvirt, either by defining a persistent domain (e.g. virsh define dom.xml) or creating a transient domain (e.g. virsh create dom.xml). The free func is called when a domain is removed from libvirt, either by undefining a persistent domain (e.g. virsh undefine dom-name) or poweroff of a transient domain. Starting/stopping a persistent domain does not invoke these functions. Regards, Jim