]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
ch: Introduce flags to virCHProcessStop()
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 9 Sep 2025 13:22:07 +0000 (15:22 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 10 Sep 2025 06:35:17 +0000 (08:35 +0200)
A caller (e.g. chDomainDestroyFlags()) might want to chose
whether to kill emulator process forcefully or gracefully (the
@force argument of virProcessKillPainfully()). Invent a flag to
virCHProcessStop() for this. And to keep consistent behaviour,
pass the flag everywhere for now.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/ch/ch_driver.c
src/ch/ch_events.c
src/ch/ch_process.c
src/ch/ch_process.h

index 760fccba829985650473a68e5efa86fdb91c4f0c..019994b202d9c348b29c3d99bd09832876080e6f 100644 (file)
@@ -686,8 +686,11 @@ chDomainDestroyFlags(virDomainPtr dom, unsigned int flags)
     if (virDomainObjCheckActive(vm) < 0)
         goto endjob;
 
-    if (virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED) < 0)
+    if (virCHProcessStop(driver, vm,
+                         VIR_DOMAIN_SHUTOFF_DESTROYED,
+                         VIR_CH_PROCESS_STOP_FORCE) < 0) {
         goto endjob;
+    }
 
     event = virDomainEventLifecycleNewFromObj(vm,
                                               VIR_DOMAIN_EVENT_STOPPED,
@@ -818,7 +821,8 @@ chDoDomainSave(virCHDriver *driver,
         goto end;
     }
 
-    if (virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SAVED) < 0) {
+    if (virCHProcessStop(driver, vm,
+                         VIR_DOMAIN_SHUTOFF_SAVED, VIR_CH_PROCESS_STOP_FORCE) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        _("Failed to shutoff after domain save"));
         goto end;
index 3d4e3c41e17b45677d71815b50f71115c7842390..be572dfde3e5d1cc2315dc2f0ba56aff26fd6fa7 100644 (file)
@@ -59,7 +59,7 @@ virCHEventStopProcess(virDomainObj *vm,
     virObjectLock(vm);
     if (virDomainObjBeginJob(vm, VIR_JOB_DESTROY))
         return -1;
-    virCHProcessStop(driver, vm, reason);
+    virCHProcessStop(driver, vm, reason, VIR_CH_PROCESS_STOP_FORCE);
     virDomainObjEndJob(vm);
     virObjectUnlock(vm);
 
index 6b779285e1e2e6ad6a8e3d947352dddd3aa8bf9f..54b21b0bafcd10d55a1f210cb210d576669881fd 100644 (file)
@@ -1003,7 +1003,9 @@ virCHProcessStart(virCHDriver *driver,
 
  cleanup:
     if (ret)
-        virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
+        virCHProcessStop(driver, vm,
+                         VIR_DOMAIN_SHUTOFF_FAILED,
+                         VIR_CH_PROCESS_STOP_FORCE);
 
     return ret;
 }
@@ -1011,7 +1013,8 @@ virCHProcessStart(virCHDriver *driver,
 int
 virCHProcessStop(virCHDriver *driver,
                  virDomainObj *vm,
-                 virDomainShutoffReason reason)
+                 virDomainShutoffReason reason,
+                 unsigned int flags)
 {
     g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(driver);
     int ret;
@@ -1022,13 +1025,18 @@ virCHProcessStop(virCHDriver *driver,
     virErrorPtr orig_err = NULL;
     size_t i;
 
-    VIR_DEBUG("Stopping VM name=%s pid=%d reason=%d",
-              vm->def->name, (int)vm->pid, (int)reason);
+    VIR_DEBUG("Stopping VM name=%s pid=%d reason=%d flags=0x%x",
+              vm->def->name, (int)vm->pid, (int)reason, flags);
 
     virErrorPreserveLast(&orig_err);
 
     if (priv->monitor) {
-        virProcessKillPainfully(vm->pid, true);
+        bool force = false;
+
+        if (flags & VIR_CH_PROCESS_STOP_FORCE)
+            force = true;
+
+        virProcessKillPainfully(vm->pid, force);
         g_clear_pointer(&priv->monitor, virCHMonitorClose);
     }
 
@@ -1180,6 +1188,8 @@ virCHProcessStartRestore(virCHDriver *driver, virDomainObj *vm, const char *from
     if (tapfds)
         chCloseFDs(tapfds, ntapfds);
     if (ret)
-        virCHProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
+        virCHProcessStop(driver, vm,
+                         VIR_DOMAIN_SHUTOFF_FAILED,
+                         VIR_CH_PROCESS_STOP_FORCE);
     return ret;
 }
index 70ae8f700da9a1416df7486160c623881d7a1ec3..a22790bb5c99dbdf987205177717ad814d73504d 100644 (file)
 int virCHProcessStart(virCHDriver *driver,
                       virDomainObj *vm,
                       virDomainRunningReason reason);
+
+typedef enum {
+    VIR_CH_PROCESS_STOP_FORCE = 1 << 0,
+} virCHProcessStopFlags;
+
 int virCHProcessStop(virCHDriver *driver,
                      virDomainObj *vm,
-                     virDomainShutoffReason reason);
+                     virDomainShutoffReason reason,
+                     unsigned int flags);
 
 int virCHProcessStartRestore(virCHDriver *driver,
                          virDomainObj *vm,