commit e0241f334d4e8da2e36cda48c225d5a6edcc3a50 Author: Jim Fehlig Date: Tue Feb 1 17:03:11 2022 -0700 libxl: Set auto-allocated graphics ports to used on reconnect The libxl driver reconnects to all running VMs when libvirtd is restarted, but it failed to mark auto-allocated graphics ports as set in the port allocator. If many VMs are running that use port auto-allocation and libvirtd is restarted, the port allocator is likely to hand out a port already in use when a new VM is created that uses auto-allocation. VM creation will fail due to the port clash. When reconnecting to running VMs after a libvirtd restart, let the port allocator know about previously allocated ports. Signed-off-by: Jim Fehlig Reviewed-by: Ján Tomko Index: libvirt-8.0.0/src/libxl/libxl_driver.c =================================================================== --- libvirt-8.0.0.orig/src/libxl/libxl_driver.c +++ libvirt-8.0.0/src/libxl/libxl_driver.c @@ -393,6 +393,7 @@ libxlReconnectDomain(virDomainObj *vm, virHostdevManager *hostdev_mgr = driver->hostdevMgr; unsigned int hostdev_flags = VIR_HOSTDEV_SP_PCI; int ret = -1; + size_t i; hostdev_flags |= VIR_HOSTDEV_SP_USB; @@ -447,6 +448,28 @@ libxlReconnectDomain(virDomainObj *vm, libxlReconnectNotifyNets(vm->def); + /* Set any auto-allocated graphics ports to used */ + for (i = 0; i < vm->def->ngraphics; i++) { + virDomainGraphicsDef *graphics = vm->def->graphics[i]; + + switch (graphics->type) { + case VIR_DOMAIN_GRAPHICS_TYPE_VNC: + if (graphics->data.vnc.autoport) + virPortAllocatorSetUsed(graphics->data.vnc.port); + break; + case VIR_DOMAIN_GRAPHICS_TYPE_SPICE: + if (graphics->data.spice.autoport) + virPortAllocatorSetUsed(graphics->data.spice.port); + break; + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: + case VIR_DOMAIN_GRAPHICS_TYPE_RDP: + case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: + case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS: + case VIR_DOMAIN_GRAPHICS_TYPE_LAST: + break; + } + } + if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0) VIR_WARN("Cannot update XML for running Xen guest %s", vm->def->name);