]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuDomainAttachWatchdog: Use 'set-action' instead of 'watchdog-set-action' if supported
authorPeter Krempa <pkrempa@redhat.com>
Fri, 20 Aug 2021 12:54:37 +0000 (14:54 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 25 Aug 2021 13:32:44 +0000 (15:32 +0200)
If current qemu supports 'set-action' use it instead of the single-use
command.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_hotplug.c

index c3c49fe080af29b39d1fc8f5754204e1cc8dec50..64580b573b2c9209f54f2e662dda826083fce241 100644 (file)
@@ -3117,8 +3117,6 @@ qemuDomainAttachWatchdog(virQEMUDriver *driver,
     int ret = -1;
     qemuDomainObjPrivate *priv = vm->privateData;
     virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_WATCHDOG, { .watchdog = watchdog } };
-    virDomainWatchdogAction actualAction = watchdog->action;
-    const char *actionStr = NULL;
     g_autofree char *watchdogstr = NULL;
     bool releaseAddress = false;
     int rv;
@@ -3146,17 +3144,59 @@ qemuDomainAttachWatchdog(virQEMUDriver *driver,
     if (!(watchdogstr = qemuBuildWatchdogDevStr(vm->def, watchdog, priv->qemuCaps)))
         goto cleanup;
 
+    qemuDomainObjEnterMonitor(driver, vm);
+
     /* QEMU doesn't have a 'dump' action; we tell qemu to 'pause', then
        libvirt listens for the watchdog event, and we perform the dump
        ourselves. so convert 'dump' to 'pause' for the qemu cli */
-    if (actualAction == VIR_DOMAIN_WATCHDOG_ACTION_DUMP)
-        actualAction = VIR_DOMAIN_WATCHDOG_ACTION_PAUSE;
+    if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)) {
+        qemuMonitorActionWatchdog watchdogaction = QEMU_MONITOR_ACTION_WATCHDOG_KEEP;
 
-    actionStr = virDomainWatchdogActionTypeToString(actualAction);
+        switch (watchdog->action) {
+        case VIR_DOMAIN_WATCHDOG_ACTION_RESET:
+            watchdogaction = QEMU_MONITOR_ACTION_WATCHDOG_RESET;
+            break;
 
-    qemuDomainObjEnterMonitor(driver, vm);
+        case VIR_DOMAIN_WATCHDOG_ACTION_SHUTDOWN:
+            watchdogaction = QEMU_MONITOR_ACTION_WATCHDOG_SHUTDOWN;
+            break;
+
+        case VIR_DOMAIN_WATCHDOG_ACTION_POWEROFF:
+            watchdogaction = QEMU_MONITOR_ACTION_WATCHDOG_POWEROFF;
+            break;
+
+        case VIR_DOMAIN_WATCHDOG_ACTION_PAUSE:
+        case VIR_DOMAIN_WATCHDOG_ACTION_DUMP:
+            watchdogaction = QEMU_MONITOR_ACTION_WATCHDOG_PAUSE;
+            break;
+
+        case VIR_DOMAIN_WATCHDOG_ACTION_NONE:
+            watchdogaction = QEMU_MONITOR_ACTION_WATCHDOG_NONE;
+            break;
+
+        case VIR_DOMAIN_WATCHDOG_ACTION_INJECTNMI:
+            watchdogaction = QEMU_MONITOR_ACTION_WATCHDOG_INJECT_NMI;
+            break;
+
+        case VIR_DOMAIN_WATCHDOG_ACTION_LAST:
+        default:
+            break;
+        };
+
+        rv = qemuMonitorSetAction(priv->mon,
+                                  QEMU_MONITOR_ACTION_SHUTDOWN_KEEP,
+                                  QEMU_MONITOR_ACTION_REBOOT_KEEP,
+                                  watchdogaction,
+                                  QEMU_MONITOR_ACTION_PANIC_KEEP);
+    } else {
+        virDomainWatchdogAction actualAction = watchdog->action;
 
-    rv = qemuMonitorSetWatchdogAction(priv->mon, actionStr);
+        if (actualAction == VIR_DOMAIN_WATCHDOG_ACTION_DUMP)
+            actualAction = VIR_DOMAIN_WATCHDOG_ACTION_PAUSE;
+
+        rv = qemuMonitorSetWatchdogAction(priv->mon,
+                                          virDomainWatchdogActionTypeToString(actualAction));
+    }
 
     if (rv >= 0)
         rv = qemuMonitorAddDevice(priv->mon, watchdogstr);