File e0241f33-libxl-mark-allocated-graphics-ports.patch of Package libvirt.25654

commit e0241f334d4e8da2e36cda48c225d5a6edcc3a50
Author: Jim Fehlig <jfehlig@suse.com>
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 <jfehlig@suse.com>
    Reviewed-by: Ján Tomko <jtomko@redhat.com>

Index: libvirt-7.1.0/src/libxl/libxl_driver.c
===================================================================
--- libvirt-7.1.0.orig/src/libxl/libxl_driver.c
+++ libvirt-7.1.0/src/libxl/libxl_driver.c
@@ -394,6 +394,7 @@ libxlReconnectDomain(virDomainObjPtr vm,
     virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
     unsigned int hostdev_flags = VIR_HOSTDEV_SP_PCI;
     int ret = -1;
+    size_t i;
 
 #ifdef LIBXL_HAVE_PVUSB
     hostdev_flags |= VIR_HOSTDEV_SP_USB;
@@ -450,6 +451,28 @@ libxlReconnectDomain(virDomainObjPtr vm,
 
     libxlReconnectNotifyNets(vm->def);
 
+    /* Set any auto-allocated graphics ports to used */
+    for (i = 0; i < vm->def->ngraphics; i++) {
+        virDomainGraphicsDefPtr 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);
 
openSUSE Build Service is sponsored by