[PATCH 0/6] qemu: Remove last HMP commands

RIP HMP use in libvirt: 2007-02-14 [1] - 2025-04-02 [1] 23ad665cb05ef9ce7d298cc34bff5efb95ef6948 Peter Krempa (6): qemu: domain: Don't check return value of 'virCPUDefCopy' qemuSnapshotCreateActiveInternal: Fix error logic qemu: snapshot: Always assume support for QEMU_CAPS_SNAPSHOT_INTERNAL_QMP qemu: Always revert internal snapshots via QMP rather than '-loadvm' qemu: monitor: Remove HMP monitor code qemu: capabilities: Retire QEMU_CAPS_SNAPSHOT_INTERNAL_QMP po/POTFILES | 1 - src/qemu/meson.build | 1 - src/qemu/qemu_capabilities.c | 3 +- src/qemu/qemu_capabilities.h | 2 +- src/qemu/qemu_command.c | 6 -- src/qemu/qemu_domain.c | 7 +- src/qemu/qemu_monitor.c | 25 ------ src/qemu/qemu_monitor.h | 3 - src/qemu/qemu_monitor_text.c | 88 ------------------- src/qemu/qemu_monitor_text.h | 29 ------ src/qemu/qemu_process.c | 3 +- src/qemu/qemu_snapshot.c | 49 ++--------- .../caps_10.0.0_s390x.xml | 1 - .../caps_10.0.0_x86_64+amdsev.xml | 1 - .../caps_10.0.0_x86_64.xml | 1 - .../qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 - .../caps_6.2.0_x86_64.xml | 1 - .../qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 - .../caps_7.0.0_x86_64.xml | 1 - .../qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 - .../caps_7.1.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 - .../caps_7.2.0_x86_64+hvf.xml | 1 - .../caps_7.2.0_x86_64.xml | 1 - .../caps_8.0.0_x86_64.xml | 1 - .../qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 - .../caps_8.1.0_x86_64.xml | 1 - .../caps_8.2.0_aarch64.xml | 1 - .../caps_8.2.0_armv7l.xml | 1 - .../caps_8.2.0_loongarch64.xml | 1 - .../qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 - .../caps_8.2.0_x86_64.xml | 1 - .../qemucapabilitiesdata/caps_9.0.0_sparc.xml | 1 - .../caps_9.0.0_x86_64.xml | 1 - .../caps_9.1.0_riscv64.xml | 1 - .../qemucapabilitiesdata/caps_9.1.0_s390x.xml | 1 - .../caps_9.1.0_x86_64.xml | 1 - .../caps_9.2.0_aarch64+hvf.xml | 1 - .../qemucapabilitiesdata/caps_9.2.0_s390x.xml | 1 - .../caps_9.2.0_x86_64+amdsev.xml | 1 - .../caps_9.2.0_x86_64.xml | 1 - 41 files changed, 15 insertions(+), 231 deletions(-) delete mode 100644 src/qemu/qemu_monitor_text.c delete mode 100644 src/qemu/qemu_monitor_text.h -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> As 'virCPUDefCopy' can't fail any more (without aborting) remove the last two return value checks. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_domain.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index e45eef4787..c3ca4b3040 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5321,8 +5321,7 @@ qemuDomainDefFormatBufInternal(virQEMUDriver *driver, */ if (origCPU) { virCPUDefFree(def->cpu); - if (!(def->cpu = virCPUDefCopy(origCPU))) - return -1; + def->cpu = virCPUDefCopy(origCPU); } if (def->cpu && @@ -9354,8 +9353,8 @@ qemuDomainSaveCookieNew(virDomainObj *vm) if (!(cookie = virObjectNew(qemuDomainSaveCookieClass))) return NULL; - if (priv->origCPU && !(cookie->cpu = virCPUDefCopy(vm->def->cpu))) - return NULL; + if (priv->origCPU) + cookie->cpu = virCPUDefCopy(vm->def->cpu); cookie->slirpHelper = qemuDomainGetSlirpHelperOk(vm); -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> The 'ret' variable is set to 0 before a call which can theoretically fail. Not in practice really as the failure scenarion includes only object initialization. Since the code already has another variable for checking monitor returns use that one properly so that the code makes sense. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_snapshot.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index ac05156e17..4f914b385c 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -592,16 +592,15 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver, goto cleanup; } - ret = 0; } else { if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0) { resume = false; goto cleanup; } - ret = qemuMonitorCreateSnapshot(priv->mon, snap->def->name); + rv = qemuMonitorCreateSnapshot(priv->mon, snap->def->name); qemuDomainObjExitMonitor(vm); - if (ret < 0) + if (rv < 0) goto cleanup; } @@ -617,6 +616,8 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver, resume = false; } + ret = 0; + cleanup: if (resume && virDomainObjIsActive(vm) && qemuProcessStartCPUs(driver, vm, -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> The 'snapshot-save' QMP command was introduced in 'qemu-6.0' and libvirt now requires at least 'qemu-6.2'. Thus we can assume that the QMP command can be used always. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_snapshot.c | 46 ++++++---------------------------------- 1 file changed, 7 insertions(+), 39 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 4f914b385c..f9b18f94b6 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -554,12 +554,12 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver, virDomainMomentObj *snap, unsigned int flags) { - qemuDomainObjPrivate *priv = vm->privateData; virObjectEvent *event = NULL; bool resume = false; virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap); int ret = -1; int rv = 0; + g_autoptr(qemuBlockJobData) job = NULL; if (!qemuMigrationSrcIsAllowed(vm, false, VIR_ASYNC_JOB_SNAPSHOT, 0)) goto cleanup; @@ -581,26 +581,11 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver, } } - if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) { - g_autoptr(qemuBlockJobData) job = NULL; - - if (!(job = qemuSnapshotCreateActiveInternalStart(vm, snapdef))) - goto cleanup; - - while ((rv = qemuSnapshotCreateActiveInternalDone(vm, job)) != 1) { - if (rv < 0 || qemuDomainObjWait(vm) < 0) - goto cleanup; - } + if (!(job = qemuSnapshotCreateActiveInternalStart(vm, snapdef))) + goto cleanup; - } else { - if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0) { - resume = false; - goto cleanup; - } - - rv = qemuMonitorCreateSnapshot(priv->mon, snap->def->name); - qemuDomainObjExitMonitor(vm); - if (rv < 0) + while ((rv = qemuSnapshotCreateActiveInternalDone(vm, job)) != 1) { + if (rv < 0 || qemuDomainObjWait(vm) < 0) goto cleanup; } @@ -944,7 +929,6 @@ qemuSnapshotPrepare(virDomainObj *vm, bool *has_manual, unsigned int *flags) { - qemuDomainObjPrivate *priv = vm->privateData; size_t i; bool active = virDomainObjIsActive(vm); bool reuse = (*flags & VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT) != 0; @@ -1065,13 +1049,6 @@ qemuSnapshotPrepare(virDomainObj *vm, * varstore is in qcow2 format. */ if (active && found_internal) { - if (virDomainDefHasOldStyleUEFI(vm->def) && - !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("internal snapshots of a VM with pflash based firmware are not supported with this qemu")); - return -1; - } - if (vm->def->os.loader && vm->def->os.loader->nvram && vm->def->os.loader->nvram->format != VIR_STORAGE_FILE_QCOW2) { @@ -4120,22 +4097,13 @@ qemuSnapshotDiscardImpl(virDomainObj *vm, return -1; } else { virDomainSnapshotDef *snapdef = virDomainSnapshotObjGetDef(snap); - qemuDomainObjPrivate *priv = vm->privateData; /* Similarly as internal snapshot creation we would use a regular job * here so set a mask to forbid any other job. */ qemuDomainObjSetAsyncJobMask(vm, VIR_JOB_NONE); - if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) { - if (qemuSnapshotDiscardActiveInternal(vm, snapdef) < 0) - return -1; - } else { - if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0) - return -1; - /* we continue on even in the face of error */ - qemuMonitorDeleteSnapshot(qemuDomainGetMonitor(vm), snap->def->name); - qemuDomainObjExitMonitor(vm); - } + if (qemuSnapshotDiscardActiveInternal(vm, snapdef) < 0) + return -1; qemuDomainObjSetAsyncJobMask(vm, VIR_JOB_DEFAULT_MASK); } -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> As all supported qemu versions now support the QMP internal snapshot commands (QEMU_CAPS_SNAPSHOT_INTERNAL_QMP is always present) we can remove the code for loading snapshots during startup via '-loadvm'. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_command.c | 6 ------ src/qemu/qemu_process.c | 3 +-- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 86eb52f197..e6d308534f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10685,12 +10685,6 @@ qemuBuildCommandLine(virDomainObj *vm, if (qemuBuildSecCommandLine(vm, cmd, def->sec) < 0) return NULL; - /* Internal snapshot reversion happens via QMP command after startup if - * supported */ - if (snapshot && - !virQEMUCapsGet(qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) - virCommandAddArgList(cmd, "-loadvm", snapshot->def->name, NULL); - if (def->namespaceData) { qemuDomainXmlNsDef *qemuxmlns; GStrv n; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 842f559439..015a98d035 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8239,8 +8239,7 @@ qemuProcessLaunch(virConnectPtr conn, qemuDomainVcpuPersistOrder(vm->def); - if (snapshot && - virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SNAPSHOT_INTERNAL_QMP)) { + if (snapshot) { VIR_DEBUG("reverting internal snapshot via QMP"); if (qemuSnapshotInternalRevert(vm, snapshot, asyncJob) < 0) goto cleanup; -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> Now that we've replaced the final two HMP commands used by libvirt we can fully drop the 'text' monitor support. The only thing we keep is the HMP passtrhough with 'virsh qemu-monitor-command'. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- po/POTFILES | 1 - src/qemu/meson.build | 1 - src/qemu/qemu_monitor.c | 25 ---------- src/qemu/qemu_monitor.h | 3 -- src/qemu/qemu_monitor_text.c | 88 ------------------------------------ src/qemu/qemu_monitor_text.h | 29 ------------ 6 files changed, 147 deletions(-) delete mode 100644 src/qemu/qemu_monitor_text.c delete mode 100644 src/qemu/qemu_monitor_text.h diff --git a/po/POTFILES b/po/POTFILES index 0c83affb44..9747c38951 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -188,7 +188,6 @@ src/qemu/qemu_migration_cookie.c src/qemu/qemu_migration_params.c src/qemu/qemu_monitor.c src/qemu/qemu_monitor_json.c -src/qemu/qemu_monitor_text.c src/qemu/qemu_namespace.c src/qemu/qemu_nbdkit.c src/qemu/qemu_passt.c diff --git a/src/qemu/meson.build b/src/qemu/meson.build index 7a07d4f2c4..5cf20f426f 100644 --- a/src/qemu/meson.build +++ b/src/qemu/meson.build @@ -27,7 +27,6 @@ qemu_driver_sources = [ 'qemu_migration_params.c', 'qemu_monitor.c', 'qemu_monitor_json.c', - 'qemu_monitor_text.c', 'qemu_namespace.c', 'qemu_nbdkit.c', 'qemu_passt.c', diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index fc215def13..6340f437dd 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -28,7 +28,6 @@ #include "qemu_alias.h" #include "qemu_monitor.h" -#include "qemu_monitor_text.h" #include "qemu_monitor_json.h" #include "qemu_domain.h" #include "qemu_capabilities.h" @@ -2745,30 +2744,6 @@ qemuMonitorDelObject(qemuMonitor *mon, } -int -qemuMonitorCreateSnapshot(qemuMonitor *mon, const char *name) -{ - VIR_DEBUG("name=%s", name); - - QEMU_CHECK_MONITOR(mon); - - /* there won't ever be a direct QMP replacement for this function */ - return qemuMonitorTextCreateSnapshot(mon, name); -} - - -int -qemuMonitorDeleteSnapshot(qemuMonitor *mon, const char *name) -{ - VIR_DEBUG("name=%s", name); - - QEMU_CHECK_MONITOR(mon); - - /* there won't ever be a direct QMP replacement for this function */ - return qemuMonitorTextDeleteSnapshot(mon, name); -} - - int qemuMonitorSnapshotSave(qemuMonitor *mon, const char *jobname, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 9a55b49472..db451c448b 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -976,9 +976,6 @@ int qemuMonitorDelObject(qemuMonitor *mon, const char *objalias, bool report_error); -int qemuMonitorCreateSnapshot(qemuMonitor *mon, const char *name); -int qemuMonitorDeleteSnapshot(qemuMonitor *mon, const char *name); - int qemuMonitorTransaction(qemuMonitor *mon, virJSONValue **actions) ATTRIBUTE_NONNULL(2); int qemuMonitorBlockdevMirror(qemuMonitor *mon, diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c deleted file mode 100644 index 3482972600..0000000000 --- a/src/qemu/qemu_monitor_text.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * qemu_monitor_text.c: interaction with QEMU monitor console - * - * Copyright (C) 2006-2014 Red Hat, Inc. - * Copyright (C) 2006 Daniel P. Berrange - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see - * <http://www.gnu.org/licenses/>. - */ - -#include <config.h> - - -#include "qemu_monitor_text.h" -#include "qemu_monitor_json.h" -#include "virlog.h" -#include "virerror.h" - -#define VIR_FROM_THIS VIR_FROM_QEMU - -VIR_LOG_INIT("qemu.qemu_monitor_text"); - -int -qemuMonitorTextCreateSnapshot(qemuMonitor *mon, - const char *name) -{ - g_autofree char *cmd = NULL; - g_autofree char *reply = NULL; - - cmd = g_strdup_printf("savevm \"%s\"", name); - - if (qemuMonitorJSONHumanCommand(mon, cmd, -1, &reply)) - return -1; - - if (strstr(reply, "Error while creating snapshot") || - strstr(reply, "Could not open VM state file") || - strstr(reply, "State blocked by non-migratable device") || - strstr(reply, "Error: ") || - (strstr(reply, "Error") && strstr(reply, "while writing VM"))) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Failed to take snapshot: %1$s"), reply); - return -1; - } else if (strstr(reply, "No block device can accept snapshots")) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("this domain does not have a device to take snapshots")); - return -1; - } - - return 0; -} - -int qemuMonitorTextDeleteSnapshot(qemuMonitor *mon, const char *name) -{ - g_autofree char *cmd = NULL; - g_autofree char *reply = NULL; - - cmd = g_strdup_printf("delvm \"%s\"", name); - if (qemuMonitorJSONHumanCommand(mon, cmd, -1, &reply)) - return -1; - - if (strstr(reply, "No block device supports snapshots")) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", - _("this domain does not have a device to delete snapshots")); - return -1; - } else if (strstr(reply, "Snapshots not supported on device")) { - virReportError(VIR_ERR_OPERATION_INVALID, "%s", reply); - return -1; - } else if (strstr(reply, "Error: ") || - (strstr(reply, "Error") && - strstr(reply, "while deleting snapshot"))) { - virReportError(VIR_ERR_OPERATION_FAILED, - _("Failed to delete snapshot: %1$s"), reply); - return -1; - } - - return 0; -} diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h deleted file mode 100644 index 27d0f061d3..0000000000 --- a/src/qemu/qemu_monitor_text.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * qemu_monitor_text.h: interaction with QEMU monitor console - * - * Copyright (C) 2006-2009, 2011-2012 Red Hat, Inc. - * Copyright (C) 2006 Daniel P. Berrange - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see - * <http://www.gnu.org/licenses/>. - */ - -#pragma once - -#include "internal.h" - -#include "qemu_monitor.h" - -int qemuMonitorTextCreateSnapshot(qemuMonitor *mon, const char *name); -int qemuMonitorTextDeleteSnapshot(qemuMonitor *mon, const char *name); -- 2.49.0

From: Peter Krempa <pkrempa@redhat.com> The code now always assumes support for the QMP internal snapshot commands so the capability is no longer needed. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_capabilities.c | 3 +-- src/qemu/qemu_capabilities.h | 2 +- tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml | 1 - tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml | 1 - tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 - tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 - tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 - tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 - tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml | 1 - tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 - tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 1 - tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml | 1 - tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml | 1 - tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 - tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml | 1 - tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml | 1 - tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml | 1 - tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml | 1 - tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml | 1 - tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml | 1 - tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml | 1 - tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml | 1 - 31 files changed, 2 insertions(+), 32 deletions(-) diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 67350f2300..665f5e225e 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -717,7 +717,7 @@ VIR_ENUM_IMPL(virQEMUCaps, "machine-i8042-opt", /* QEMU_CAPS_MACHINE_I8042_OPT */ /* 465 */ - "snapshot-internal-qmp", /* QEMU_CAPS_SNAPSHOT_INTERNAL_QMP */ + "snapshot-internal-qmp", /* X_QEMU_CAPS_SNAPSHOT_INTERNAL_QMP */ "chardev-reconnect-miliseconds", /* QEMU_CAPS_CHARDEV_RECONNECT_MILISECONDS */ "virtio-ccw.loadparm", /* QEMU_CAPS_VIRTIO_CCW_DEVICE_LOADPARM */ "netdev-stream-reconnect-miliseconds", /* QEMU_CAPS_NETDEV_STREAM_RECONNECT_MILISECONDS */ @@ -1251,7 +1251,6 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = { { "query-stats", QEMU_CAPS_QUERY_STATS }, { "query-stats-schemas", QEMU_CAPS_QUERY_STATS_SCHEMAS }, { "display-reload", QEMU_CAPS_DISPLAY_RELOAD }, - { "snapshot-save", QEMU_CAPS_SNAPSHOT_INTERNAL_QMP }, { "blockdev-set-active", QEMU_CAPS_BLOCKDEV_SET_ACTIVE }, }; diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h index 2c2433580c..685a938bbc 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -698,7 +698,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */ QEMU_CAPS_MACHINE_I8042_OPT, /* -machine xxx,i8042=on/off; use virQEMUCapsSupportsI8042Toggle() to query this capability */ /* 465 */ - QEMU_CAPS_SNAPSHOT_INTERNAL_QMP, /* internal snapshot support via QMP commands 'snapshot-save'/'snapshot-delete' */ + X_QEMU_CAPS_SNAPSHOT_INTERNAL_QMP, /* internal snapshot support via QMP commands 'snapshot-save'/'snapshot-delete' */ QEMU_CAPS_CHARDEV_RECONNECT_MILISECONDS, /* 'reconnect-ms' option for chardevs supported */ QEMU_CAPS_VIRTIO_CCW_DEVICE_LOADPARM, /* loadparm available on CCW device for multi device boot */ QEMU_CAPS_NETDEV_STREAM_RECONNECT_MILISECONDS, /* 'reconnect-ms' option for netdev stream supported */ diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml index 0600cbda62..4f3669ebb7 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml @@ -128,7 +128,6 @@ <flag name='usb-mtp'/> <flag name='virtio-sound'/> <flag name='netdev.user'/> - <flag name='snapshot-internal-qmp'/> <flag name='chardev-reconnect-miliseconds'/> <flag name='virtio-ccw.loadparm'/> <flag name='netdev-stream-reconnect-miliseconds'/> diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml index ad7bb7ebc8..eaf35bb703 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml @@ -201,7 +201,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <flag name='chardev-reconnect-miliseconds'/> <flag name='netdev-stream-reconnect-miliseconds'/> <flag name='migrate-incoming.exit-on-error'/> diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml index 529ec7fbe2..dea2e3fc89 100644 --- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml @@ -200,7 +200,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <flag name='chardev-reconnect-miliseconds'/> <flag name='netdev-stream-reconnect-miliseconds'/> <flag name='migrate-incoming.exit-on-error'/> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml index e080352a4c..cf5fc6b017 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml @@ -132,7 +132,6 @@ <flag name='display-reload'/> <flag name='usb-mtp'/> <flag name='netdev.user'/> - <flag name='snapshot-internal-qmp'/> <version>6002000</version> <microcodeVersion>42900244</microcodeVersion> <package>v6.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml index 1c7def169c..ed43c4767f 100644 --- a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml @@ -174,7 +174,6 @@ <flag name='display-reload'/> <flag name='usb-mtp'/> <flag name='netdev.user'/> - <flag name='snapshot-internal-qmp'/> <version>6002000</version> <microcodeVersion>43100244</microcodeVersion> <package>v6.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml index a5dbf4fb13..9a273e531e 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml @@ -151,7 +151,6 @@ <flag name='usb-mtp'/> <flag name='netdev.user'/> <flag name='acpi-erst'/> - <flag name='snapshot-internal-qmp'/> <version>7000000</version> <microcodeVersion>42900243</microcodeVersion> <package>v7.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml index 8e342bf4ad..3214f50be6 100644 --- a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml @@ -182,7 +182,6 @@ <flag name='netdev.user'/> <flag name='acpi-erst'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <version>7000000</version> <microcodeVersion>43100243</microcodeVersion> <package>v7.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml index 610ca193d0..46a93cadbc 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml @@ -152,7 +152,6 @@ <flag name='usb-mtp'/> <flag name='netdev.user'/> <flag name='acpi-erst'/> - <flag name='snapshot-internal-qmp'/> <version>7001000</version> <microcodeVersion>42900244</microcodeVersion> <package>v7.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml index 71e6c16e8f..eb5e35b904 100644 --- a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml @@ -187,7 +187,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <version>7001000</version> <microcodeVersion>43100244</microcodeVersion> <package>v7.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml index bba3376484..f8b79cc751 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml @@ -147,7 +147,6 @@ <flag name='usb-mtp'/> <flag name='netdev.user'/> <flag name='acpi-erst'/> - <flag name='snapshot-internal-qmp'/> <version>7002000</version> <microcodeVersion>0</microcodeVersion> <package>qemu-7.2.0-6.fc37</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml index 7bdeb00f9a..6ea91329bc 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml @@ -191,7 +191,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <version>7002000</version> <microcodeVersion>43100245</microcodeVersion> <package>v7.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml index 54c72521b0..dfecf16eaf 100644 --- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml @@ -191,7 +191,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <version>7002000</version> <microcodeVersion>43100245</microcodeVersion> <package>v7.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml index 54db96d9c7..09c9fbe17e 100644 --- a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml @@ -195,7 +195,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <version>8000000</version> <microcodeVersion>43100244</microcodeVersion> <package>v8.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml index 0de066b2d9..4127437fcc 100644 --- a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml @@ -115,7 +115,6 @@ <flag name='display-reload'/> <flag name='usb-mtp'/> <flag name='netdev.user'/> - <flag name='snapshot-internal-qmp'/> <version>8001000</version> <microcodeVersion>39100245</microcodeVersion> <package>v8.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml index 7d508a1601..eb03dd891a 100644 --- a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml @@ -197,7 +197,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <version>8001000</version> <microcodeVersion>43100245</microcodeVersion> <package>v8.1.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml index 047a08a20c..31757fcc4f 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml @@ -162,7 +162,6 @@ <flag name='virtio-sound'/> <flag name='netdev.user'/> <flag name='acpi-erst'/> - <flag name='snapshot-internal-qmp'/> <version>8002000</version> <microcodeVersion>61700246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml index 3bf741931d..af50e1acd2 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml @@ -169,7 +169,6 @@ <flag name='virtio-sound'/> <flag name='netdev.user'/> <flag name='acpi-erst'/> - <flag name='snapshot-internal-qmp'/> <version>8002000</version> <microcodeVersion>0</microcodeVersion> <package>qemu-8.2.0-7.fc39</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml index 73871a6880..067526a4f1 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml @@ -152,7 +152,6 @@ <flag name='virtio-sound'/> <flag name='netdev.user'/> <flag name='acpi-erst'/> - <flag name='snapshot-internal-qmp'/> <version>8002000</version> <microcodeVersion>106300246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml index d1f4bd300e..9b0b5bdd9d 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml @@ -116,7 +116,6 @@ <flag name='usb-mtp'/> <flag name='virtio-sound'/> <flag name='netdev.user'/> - <flag name='snapshot-internal-qmp'/> <version>8002000</version> <microcodeVersion>39100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml index 2da46d944d..e786f16ec1 100644 --- a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml @@ -200,7 +200,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <version>8002000</version> <microcodeVersion>43100246</microcodeVersion> <package>v8.2.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml index 698136134d..74d10dc744 100644 --- a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml +++ b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml @@ -72,7 +72,6 @@ <flag name='blockjob.backing-mask-protocol'/> <flag name='display-reload'/> <flag name='netdev.user'/> - <flag name='snapshot-internal-qmp'/> <version>9000000</version> <microcodeVersion>0</microcodeVersion> <package>qemu-9.0.0-1.fc40</package> diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml index b273193d35..ec71682150 100644 --- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml @@ -202,7 +202,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <version>9000000</version> <microcodeVersion>43100245</microcodeVersion> <package>v9.0.0</package> diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml index 60eeb04fe7..2fa5d84c24 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml @@ -160,7 +160,6 @@ <flag name='virtio-sound'/> <flag name='netdev.user'/> <flag name='acpi-erst'/> - <flag name='snapshot-internal-qmp'/> <flag name='migrate-incoming.exit-on-error'/> <flag name='machine.virt.aia'/> <version>9001000</version> diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml index 91738c0204..f2fb085af3 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml @@ -125,7 +125,6 @@ <flag name='usb-mtp'/> <flag name='virtio-sound'/> <flag name='netdev.user'/> - <flag name='snapshot-internal-qmp'/> <flag name='query-cpu-model-expansion.deprecated-props'/> <flag name='migrate-incoming.exit-on-error'/> <version>9001000</version> diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml index 6b995c2f26..08a4b24ae7 100644 --- a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml @@ -200,7 +200,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <flag name='migrate-incoming.exit-on-error'/> <version>9001000</version> <microcodeVersion>43100246</microcodeVersion> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml index a7bfc10168..7c9d245099 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml @@ -132,7 +132,6 @@ <flag name='virtio-sound'/> <flag name='netdev.user'/> <flag name='acpi-erst'/> - <flag name='snapshot-internal-qmp'/> <flag name='chardev-reconnect-miliseconds'/> <flag name='netdev-stream-reconnect-miliseconds'/> <flag name='migrate-incoming.exit-on-error'/> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml index 7427bab1e9..572e829208 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml @@ -125,7 +125,6 @@ <flag name='usb-mtp'/> <flag name='virtio-sound'/> <flag name='netdev.user'/> - <flag name='snapshot-internal-qmp'/> <flag name='chardev-reconnect-miliseconds'/> <flag name='virtio-ccw.loadparm'/> <flag name='netdev-stream-reconnect-miliseconds'/> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml index 2181b9432a..be235051e2 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml @@ -202,7 +202,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <flag name='chardev-reconnect-miliseconds'/> <flag name='netdev-stream-reconnect-miliseconds'/> <flag name='migrate-incoming.exit-on-error'/> diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml index 924f56d010..73b2897c22 100644 --- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml +++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml @@ -200,7 +200,6 @@ <flag name='acpi-erst'/> <flag name='intel-iommu.dma-translation'/> <flag name='machine-i8042-opt'/> - <flag name='snapshot-internal-qmp'/> <flag name='chardev-reconnect-miliseconds'/> <flag name='netdev-stream-reconnect-miliseconds'/> <flag name='migrate-incoming.exit-on-error'/> -- 2.49.0

On Wed, Apr 02, 2025 at 10:08:23AM +0200, Peter Krempa via Devel wrote:
RIP HMP use in libvirt:
2007-02-14 [1] - 2025-04-02
[1] 23ad665cb05ef9ce7d298cc34bff5efb95ef6948
Peter Krempa (6): qemu: domain: Don't check return value of 'virCPUDefCopy' qemuSnapshotCreateActiveInternal: Fix error logic qemu: snapshot: Always assume support for QEMU_CAPS_SNAPSHOT_INTERNAL_QMP qemu: Always revert internal snapshots via QMP rather than '-loadvm' qemu: monitor: Remove HMP monitor code qemu: capabilities: Retire QEMU_CAPS_SNAPSHOT_INTERNAL_QMP
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>

On a Wednesday in 2025, Peter Krempa via Devel wrote:
RIP HMP use in libvirt:
2007-02-14 [1] - 2025-04-02
[1] 23ad665cb05ef9ce7d298cc34bff5efb95ef6948
Peter Krempa (6): qemu: domain: Don't check return value of 'virCPUDefCopy' qemuSnapshotCreateActiveInternal: Fix error logic qemu: snapshot: Always assume support for QEMU_CAPS_SNAPSHOT_INTERNAL_QMP qemu: Always revert internal snapshots via QMP rather than '-loadvm' qemu: monitor: Remove HMP monitor code qemu: capabilities: Retire QEMU_CAPS_SNAPSHOT_INTERNAL_QMP
Reviewed-by: Ján Tomko <jtomko@redhat.com> Celebrated-by: Ján Tomko <jtomko@redhat.com> Jano
participants (3)
-
Ján Tomko
-
Pavel Hrdina
-
Peter Krempa