File 23b51d7b-libxl-disable-death-event.patch of Package libvirt.23594

commit 23b51d7b8ec885e97a9277cf0a6c2833db4636e8
Author: Jim Fehlig <jfehlig@suse.com>
Date:   Fri Oct 29 14:16:33 2021 -0600

    libxl: Disable death events after receiving a shutdown event
    
    The libxl driver will handle all domain destruction and cleanup
    when receiving a domain shutdown event from libxl. Commit fa30ee04a2a
    introduced the ignoreDeathEvent boolean in the DomainObjPrivate struct
    to ignore subsequent death events from libxl. But libxl already provides
    a mechanism to disable death events via libxl_evdisable_domain_death.
    
    This patch partially reverts commit fa30ee04a2a and instead uses
    libxl_evdisable_domain_death to disable subsequent death events when
    processing a shutdown event.
    
    Signed-off-by: Jim Fehlig <jfehlig@suse.com>
    Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
    Reviewed-by: Ján Tomko <jtomko@redhat.com>

Index: libvirt-7.1.0/src/libxl/libxl_domain.c
===================================================================
--- libvirt-7.1.0.orig/src/libxl/libxl_domain.c
+++ libvirt-7.1.0/src/libxl/libxl_domain.c
@@ -614,12 +614,6 @@ static void
 libxlDomainHandleDeath(libxlDriverPrivatePtr driver, virDomainObjPtr vm)
 {
     virObjectEventPtr dom_event = NULL;
-    libxlDomainObjPrivatePtr priv = vm->privateData;
-
-    if (priv->ignoreDeathEvent) {
-        priv->ignoreDeathEvent = false;
-        return;
-    }
 
     if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
         return;
@@ -669,7 +663,6 @@ libxlDomainEventHandler(void *data, VIR_
     }
 
     if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
-        libxlDomainObjPrivatePtr priv = vm->privateData;
         struct libxlShutdownThreadInfo *shutdown_info = NULL;
         virThread thread;
         g_autofree char *name = NULL;
@@ -686,12 +679,9 @@ libxlDomainEventHandler(void *data, VIR_
         name = g_strdup_printf("ev-%d", event->domid);
         /*
          * Cleanup will be handled by the shutdown thread.
-         * Ignore the forthcoming death event from libxl
          */
-        priv->ignoreDeathEvent = true;
         if (virThreadCreateFull(&thread, false, libxlDomainShutdownThread,
                                 name, false, shutdown_info) < 0) {
-             priv->ignoreDeathEvent = false;
             /*
              * Not much we can do on error here except log it.
              */
@@ -812,18 +802,17 @@ libxlDomainDestroyInternal(libxlDriverPr
     libxlDomainObjPrivatePtr priv = vm->privateData;
     int ret = -1;
 
-    /* Ignore next LIBXL_EVENT_TYPE_DOMAIN_DEATH as the caller will handle
-     * domain death appropriately already (having more info, like the reason).
-     */
-    priv->ignoreDeathEvent = true;
+    if (priv->deathW) {
+        libxl_evdisable_domain_death(cfg->ctx, priv->deathW);
+        priv->deathW = NULL;
+    }
+
     /* Unlock virDomainObj during destroy, which can take considerable
      * time on large memory domains.
      */
     virObjectUnlock(vm);
     ret = libxl_domain_destroy(cfg->ctx, vm->def->id, NULL);
     virObjectLock(vm);
-    if (ret)
-        priv->ignoreDeathEvent = false;
 
     return ret;
 }
@@ -883,8 +872,6 @@ libxlDomainCleanup(libxlDriverPrivatePtr
         priv->deathW = NULL;
     }
 
-    priv->ignoreDeathEvent = false;
-
     if (!!g_atomic_int_dec_and_test(&driver->nactive) && driver->inhibitCallback)
         driver->inhibitCallback(false, driver->inhibitOpaque);
 
Index: libvirt-7.1.0/src/libxl/libxl_domain.h
===================================================================
--- libvirt-7.1.0.orig/src/libxl/libxl_domain.h
+++ libvirt-7.1.0/src/libxl/libxl_domain.h
@@ -62,9 +62,6 @@ struct _libxlDomainObjPrivate {
     /* console */
     virChrdevsPtr devs;
     libxl_evgen_domain_death *deathW;
-    /* Flag to indicate the upcoming LIBXL_EVENT_TYPE_DOMAIN_DEATH is caused
-     * by libvirt and should not be handled separately */
-    bool ignoreDeathEvent;
     virThreadPtr migrationDstReceiveThr;
     unsigned short migrationPort;
     char *lockState;
openSUSE Build Service is sponsored by