Re: [PATCH 0/2] qemu: Add support for pauth Arm CPU feature
On 7/12/24 16:21, Andrea Bolognani wrote: > > > Andrea Bolognani (2): > cpu_map: Add pauth Arm CPU feature > tests: Add coverage for pauth Arm CPU feature > > src/cpu_map/arm_features.xml | 3 ++ > ...aarch64-features-pauth.aarch64-latest.args | 31 +++ > .../aarch64-features-pauth.aarch64-latest.xml | 28 + > .../aarch64-features-pauth.xml| 17 ++ > tests/qemuxmlconftest.c | 1 + > 5 files changed, 80 insertions(+) > create mode 100644 > tests/qemuxmlconfdata/aarch64-features-pauth.aarch64-latest.args > create mode 100644 > tests/qemuxmlconfdata/aarch64-features-pauth.aarch64-latest.xml > create mode 100644 tests/qemuxmlconfdata/aarch64-features-pauth.xml > Sorry for letting this fall through cracks. Reviewed-by: Michal Privoznik Michal
Re: [PATCH] docs: use real examples for QEMU cli passthrough
On 7/12/24 17:18, Daniel P. Berrangé wrote: > User feedback has shown that the examples are not clear enough > to illustrate the cli passthrough concept in action. > > Signed-off-by: Daniel P. Berrangé > --- > docs/drvqemu.rst | 7 +-- > 1 file changed, 5 insertions(+), 2 deletions(-) > Trivial. Reviewed-by: Michal Privoznik Michal
Re: [PATCH 0/2] qemu: Add support for pauth Arm CPU feature
On 7/15/24 10:32, Michal Prívozník wrote: > On 7/12/24 16:21, Andrea Bolognani wrote: >> >> >> Andrea Bolognani (2): >> cpu_map: Add pauth Arm CPU feature >> tests: Add coverage for pauth Arm CPU feature >> >> src/cpu_map/arm_features.xml | 3 ++ >> ...aarch64-features-pauth.aarch64-latest.args | 31 +++ >> .../aarch64-features-pauth.aarch64-latest.xml | 28 + >> .../aarch64-features-pauth.xml| 17 ++ >> tests/qemuxmlconftest.c | 1 + >> 5 files changed, 80 insertions(+) >> create mode 100644 >> tests/qemuxmlconfdata/aarch64-features-pauth.aarch64-latest.args >> create mode 100644 >> tests/qemuxmlconfdata/aarch64-features-pauth.aarch64-latest.xml >> create mode 100644 tests/qemuxmlconfdata/aarch64-features-pauth.xml >> > > Sorry for letting this fall through cracks. Actually, I've misread the date this was sent in. It was sent only 3 days ago, so not sorry then :-P Michal
[PATCH 3/2] news: Mention pauth Arm CPU feature
Signed-off-by: Andrea Bolognani --- NEWS.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index 775f5904ea..2fdb52c607 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -17,6 +17,8 @@ v10.6.0 (unreleased) * **New features** + * qemu: Add support for the 'pauth' Arm CPU feature + * **Improvements** * **Bug fixes** -- 2.45.2
Re: [PATCH 0/2] qemu: Add support for pauth Arm CPU feature
On Mon, Jul 15, 2024 at 10:45:10AM GMT, Michal Prívozník wrote: > On 7/15/24 10:32, Michal Prívozník wrote: > > On 7/12/24 16:21, Andrea Bolognani wrote: > >> Andrea Bolognani (2): > >> cpu_map: Add pauth Arm CPU feature > >> tests: Add coverage for pauth Arm CPU feature > > > > Sorry for letting this fall through cracks. > > Actually, I've misread the date this was sent in. It was sent only 3 > days ago, so not sorry then :-P O:-) I just realized that I didn't update the release notes, so I've just posted a small patch for that too (messing up the threading in the process). Can I consider your R-b valid for patch 3/2 too? -- Andrea Bolognani / Red Hat / Virtualization
Re: [PATCH 3/2] news: Mention pauth Arm CPU feature
On 7/15/24 11:55, Andrea Bolognani wrote: > Signed-off-by: Andrea Bolognani > --- > NEWS.rst | 2 ++ > 1 file changed, 2 insertions(+) > Reviewed-by: Michal Privoznik Michal
[PATCH] ci: Refresh generated files
This is supposed to unstuck FreeBSD as it switched to Python-3.11. Signed-off-by: Michal Privoznik --- ci/cirrus/freebsd-13.vars | 2 +- ci/cirrus/freebsd-14.vars | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/cirrus/freebsd-13.vars b/ci/cirrus/freebsd-13.vars index 278b5834f6..f24b921300 100644 --- a/ci/cirrus/freebsd-13.vars +++ b/ci/cirrus/freebsd-13.vars @@ -11,6 +11,6 @@ MAKE='/usr/local/bin/gmake' NINJA='/usr/local/bin/ninja' PACKAGING_COMMAND='pkg' PIP3='/usr/local/bin/pip-3.8' -PKGS='augeas bash-completion ca_root_nss ccache codespell cppi curl cyrus-sasl diffutils fusefs-libs gettext git glib gmake gnugrep gnutls gsed libpcap libpciaccess libssh libssh2 libxml2 libxslt meson ninja perl5 pkgconf polkit py39-black py39-docutils py39-flake8 py39-pytest python3 qemu readline yajl' +PKGS='augeas bash-completion ca_root_nss ccache codespell cppi curl cyrus-sasl diffutils fusefs-libs gettext git glib gmake gnugrep gnutls gsed libpcap libpciaccess libssh libssh2 libxml2 libxslt meson ninja perl5 pkgconf polkit py311-black py311-docutils py311-flake8 py311-pytest python3 qemu readline yajl' PYPI_PKGS='' PYTHON='/usr/local/bin/python3' diff --git a/ci/cirrus/freebsd-14.vars b/ci/cirrus/freebsd-14.vars index 278b5834f6..f24b921300 100644 --- a/ci/cirrus/freebsd-14.vars +++ b/ci/cirrus/freebsd-14.vars @@ -11,6 +11,6 @@ MAKE='/usr/local/bin/gmake' NINJA='/usr/local/bin/ninja' PACKAGING_COMMAND='pkg' PIP3='/usr/local/bin/pip-3.8' -PKGS='augeas bash-completion ca_root_nss ccache codespell cppi curl cyrus-sasl diffutils fusefs-libs gettext git glib gmake gnugrep gnutls gsed libpcap libpciaccess libssh libssh2 libxml2 libxslt meson ninja perl5 pkgconf polkit py39-black py39-docutils py39-flake8 py39-pytest python3 qemu readline yajl' +PKGS='augeas bash-completion ca_root_nss ccache codespell cppi curl cyrus-sasl diffutils fusefs-libs gettext git glib gmake gnugrep gnutls gsed libpcap libpciaccess libssh libssh2 libxml2 libxslt meson ninja perl5 pkgconf polkit py311-black py311-docutils py311-flake8 py311-pytest python3 qemu readline yajl' PYPI_PKGS='' PYTHON='/usr/local/bin/python3' -- 2.44.2
Re: [PATCH] ci: Refresh generated files
On Mon, Jul 15, 2024 at 03:17:07PM +0200, Michal Privoznik wrote: > This is supposed to unstuck FreeBSD as it switched to > Python-3.11. > > Signed-off-by: Michal Privoznik > --- > ci/cirrus/freebsd-13.vars | 2 +- > ci/cirrus/freebsd-14.vars | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) Reviewed-by: Daniel P. Berrangé With regards, Daniel -- |: https://berrange.com -o-https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o-https://fstop138.berrange.com :| |: https://entangle-photo.org-o-https://www.instagram.com/dberrange :|
[PATCH] vmx: Be even more lax when trying to comprehend serial ports
So much can happen in the fileName field of the VMX that the easiest thing is to silently report a serial type="null". This effectively reverts commits de81bdb8d4cd and 62c53db0421a, but keeps the test files to show the fix is still in place. There is one instance where an error gets reset, but since that is a rare case on its own and on top of that does not happen in any of our long-running daemons with a logfile that might get monitored it should be fine to leave it there. Resolves: https://issues.redhat.com/browse/RHEL-32182 Signed-off-by: Martin Kletzander --- src/vmx/vmx.c | 30 +- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index e5bc2d793c66..227744d06258 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -2975,9 +2975,6 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port, char fileName_name[48] = ""; g_autofree char *fileName = NULL; -char vspc_name[48] = ""; -g_autofree char *vspc = NULL; - char network_endPoint_name[48] = ""; g_autofree char *network_endPoint = NULL; @@ -3000,7 +2997,6 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port, VMX_BUILD_NAME(startConnected); VMX_BUILD_NAME(fileType); VMX_BUILD_NAME(fileName); -VMX_BUILD_NAME(vspc); VMX_BUILD_NAME_EXTRA(network_endPoint, "network.endPoint"); /* vmx:present */ @@ -3030,10 +3026,6 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port, if (virVMXGetConfigString(conf, fileName_name, &fileName, true) < 0) goto cleanup; -/* vmx:fileName -> def:data.file.path */ -if (virVMXGetConfigString(conf, vspc_name, &vspc, true) < 0) -goto cleanup; - /* vmx:network.endPoint -> def:data.tcp.listen */ if (virVMXGetConfigString(conf, network_endPoint_name, &network_endPoint, true) < 0) { @@ -3065,21 +3057,25 @@ virVMXParseSerial(virVMXContext *ctx, virConf *conf, int port, (*def)->target.port = port; (*def)->source->type = VIR_DOMAIN_CHR_TYPE_PIPE; (*def)->source->data.file.path = g_steal_pointer(&fileName); -} else if (STRCASEEQ(fileType, "network") && (vspc || !fileName || STREQ(fileName, ""))) { -(*def)->target.port = port; -(*def)->source->type = VIR_DOMAIN_CHR_TYPE_NULL; } else if (STRCASEEQ(fileType, "network")) { (*def)->target.port = port; (*def)->source->type = VIR_DOMAIN_CHR_TYPE_TCP; -if (!(parsedUri = virURIParse(fileName))) -goto cleanup; +if (!(parsedUri = virURIParse(fileName))) { +/* + * Ignore anything we cannot parse since there are many variations + * that could lead to unusable or non-representable serial ports + * which are very commonly seen and the main consumer of this driver + * (virt-v2v) ignores them anyway, so let's at least not error out. + */ +virResetLastError(); +(*def)->source->type = VIR_DOMAIN_CHR_TYPE_NULL; +return 0; +} if (parsedUri->port == 0) { -virReportError(VIR_ERR_INTERNAL_ERROR, - _("VMX entry '%1$s' doesn't contain a port part"), - fileName_name); -goto cleanup; +(*def)->source->type = VIR_DOMAIN_CHR_TYPE_NULL; +return 0; } (*def)->source->data.tcp.host = g_strdup(parsedUri->server); -- 2.45.1
[PATCH 4/4] qemu monitor: reap qemu_monitor_text
Signed-off-by: Nikolai Barybin --- po/POTFILES | 1 - po/libvirt.pot | 18 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 7 files changed, 165 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 1ed4086d2c..28773c6d78 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -185,7 +185,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/po/libvirt.pot b/po/libvirt.pot index 30f9344015..15c0871352 100644 --- a/po/libvirt.pot +++ b/po/libvirt.pot @@ -8794,11 +8794,6 @@ msgstr "" msgid "Failed to delete snapshot %1$s" msgstr "" -#: src/qemu/qemu_monitor_text.c:83 -#, c-format -msgid "Failed to delete snapshot: %1$s" -msgstr "" - #: src/bhyve/bhyve_driver.c:389 src/libxl/libxl_driver.c:4670 #: src/lxc/lxc_driver.c:2495 src/network/bridge_driver.c:3618 #: src/qemu/qemu_driver.c:7793 src/storage/storage_driver.c:1399 @@ -10640,11 +10635,6 @@ msgstr "" msgid "Failed to symlink device %1$s to %2$s" msgstr "" -#: src/qemu/qemu_monitor_text.c:52 -#, c-format -msgid "Failed to take snapshot: %1$s" -msgstr "" - #: src/util/virprocess.c:424 src/util/virprocess.c:435 #, c-format msgid "Failed to terminate process %1$lld with SIG%2$s" @@ -44930,14 +44920,6 @@ msgstr "" msgid "this disk doesn't support update" msgstr "" -#: src/qemu/qemu_monitor_text.c:74 -msgid "this domain does not have a device to delete snapshots" -msgstr "" - -#: src/qemu/qemu_monitor_text.c:56 -msgid "this domain does not have a device to take snapshots" -msgstr "" - #: src/util/virerror.c:1042 msgid "this domain exists already" msgstr "" diff --git a/src/qemu/meson.build b/src/qemu/meson.build index 57356451e4..ec0572fdeb 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 53f5ecf223..ccd937361c 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" @@ -2739,30 +2738,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 27dbb78e06..7c9f014b61 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -960,9 +960,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..00 --- 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 cop
[PATCH 2/4] qemu blockjob: add snapshot-save/delete job types
Signed-off-by: Nikolai Barybin --- src/qemu/qemu_block.c| 2 ++ src/qemu/qemu_blockjob.c | 6 +- src/qemu/qemu_blockjob.h | 2 ++ src/qemu/qemu_domain.c | 4 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index d6cdf521c4..414803cff2 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -3766,6 +3766,8 @@ qemuBlockPivot(virDomainObj *vm, case QEMU_BLOCKJOB_TYPE_INTERNAL: case QEMU_BLOCKJOB_TYPE_CREATE: case QEMU_BLOCKJOB_TYPE_BROKEN: +case QEMU_BLOCKJOB_TYPE_SNAPSHOT_SAVE: +case QEMU_BLOCKJOB_TYPE_SNAPSHOT_DELETE: virReportError(VIR_ERR_OPERATION_INVALID, _("job type '%1$s' does not support pivot"), qemuBlockjobTypeToString(job->type)); diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 42856df6d4..0d4fdd64ca 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -68,7 +68,9 @@ VIR_ENUM_IMPL(qemuBlockjob, "backup", "", "create", - "broken"); + "broken", + "snapshot-save", + "snapshot-delete"); static virClass *qemuBlockJobDataClass; @@ -1450,6 +1452,8 @@ qemuBlockJobEventProcessConcludedTransition(qemuBlockJobData *job, break; case QEMU_BLOCKJOB_TYPE_BROKEN: +case QEMU_BLOCKJOB_TYPE_SNAPSHOT_SAVE: +case QEMU_BLOCKJOB_TYPE_SNAPSHOT_DELETE: case QEMU_BLOCKJOB_TYPE_NONE: case QEMU_BLOCKJOB_TYPE_INTERNAL: case QEMU_BLOCKJOB_TYPE_LAST: diff --git a/src/qemu/qemu_blockjob.h b/src/qemu/qemu_blockjob.h index f1ac43b4c7..d4a3677050 100644 --- a/src/qemu/qemu_blockjob.h +++ b/src/qemu/qemu_blockjob.h @@ -66,6 +66,8 @@ typedef enum { QEMU_BLOCKJOB_TYPE_INTERNAL, QEMU_BLOCKJOB_TYPE_CREATE, QEMU_BLOCKJOB_TYPE_BROKEN, +QEMU_BLOCKJOB_TYPE_SNAPSHOT_SAVE, +QEMU_BLOCKJOB_TYPE_SNAPSHOT_DELETE, QEMU_BLOCKJOB_TYPE_LAST } qemuBlockJobType; G_STATIC_ASSERT((int)QEMU_BLOCKJOB_TYPE_INTERNAL == VIR_DOMAIN_BLOCK_JOB_TYPE_LAST); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 2134b11038..f512921187 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2407,6 +2407,8 @@ qemuDomainObjPrivateXMLFormatBlockjobIterator(void *payload, break; case QEMU_BLOCKJOB_TYPE_BROKEN: +case QEMU_BLOCKJOB_TYPE_SNAPSHOT_SAVE: +case QEMU_BLOCKJOB_TYPE_SNAPSHOT_DELETE: case QEMU_BLOCKJOB_TYPE_NONE: case QEMU_BLOCKJOB_TYPE_INTERNAL: case QEMU_BLOCKJOB_TYPE_LAST: @@ -2958,6 +2960,8 @@ qemuDomainObjPrivateXMLParseBlockjobDataSpecific(qemuBlockJobData *job, break; case QEMU_BLOCKJOB_TYPE_BROKEN: +case QEMU_BLOCKJOB_TYPE_SNAPSHOT_SAVE: +case QEMU_BLOCKJOB_TYPE_SNAPSHOT_DELETE: case QEMU_BLOCKJOB_TYPE_NONE: case QEMU_BLOCKJOB_TYPE_INTERNAL: case QEMU_BLOCKJOB_TYPE_LAST: -- 2.43.5
[PATCH 3/4] qemu snapshot: use QMP snapshot-save/delete for internal snapshots
The usage of HMP commands are highly discouraged by qemu. Moreover, current snapshot creation routine does not provide flexibility in choosing target device for VM state snapshot. This patch makes use of QMP commands snapshot-save/delete and by default chooses first writable disk (if present) as target for VM state, NVRAM - otherwise. Signed-off-by: Nikolai Barybin --- src/qemu/qemu_snapshot.c | 158 --- 1 file changed, 148 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index f5260c4a22..83949a9a27 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -308,6 +308,96 @@ qemuSnapshotCreateInactiveExternal(virQEMUDriver *driver, return ret; } +static int +qemuSnapshotActiveInternalGetWrdevListHelper(virDomainObj *vm, + char **wrdevs) +{ +size_t wrdevCount = 0; +size_t i = 0; + +for (i = 0; i < vm->def->ndisks; i++) { +virDomainDiskDef *disk = vm->def->disks[i]; +if (!disk->src->readonly) { +wrdevs[wrdevCount] = g_strdup(disk->src->nodenameformat); +wrdevCount++; +} +} + +if (wrdevCount == 0) { +if (vm->def->os.loader->nvram) { +wrdevs[0] = g_strdup(vm->def->os.loader->nvram->nodenameformat); +} else { +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("no writable device for internal snapshot creation/deletion")); +return -1; +} +} + +return 0; +} + + +static int +qemuSnapshotCreateActiveInternalDone(virDomainObj *vm) +{ +qemuBlockJobData *job = NULL; +qemuDomainObjPrivate *priv = vm->privateData; + +if (!(job = virHashLookup(priv->blockjobs, g_strdup_printf("snapsave%d", vm->def->id { +virReportError(VIR_ERR_INTERNAL_ERROR, + _("failed to lookup blockjob 'snapsave%1$d'"), vm->def->id); +return -1; +} + +qemuBlockJobUpdate(vm, job, VIR_ASYNC_JOB_NONE); +if (job->state == VIR_DOMAIN_BLOCK_JOB_FAILED) { +virReportError(VIR_ERR_INTERNAL_ERROR, + _("snapshot-save job failed: %1$s"), NULLSTR(job->errmsg)); +return -1; +} + +return job->state == VIR_DOMAIN_BLOCK_JOB_COMPLETED ? 1 : 0; +} + + +static int +qemuSnapshotCreateActiveInternalStart(virDomainObj *vm, + const char *name) +{ +qemuBlockJobData *job = NULL; +g_autofree char** wrdevs = NULL; +int ret = -1; +int rc = 0; + +wrdevs = g_new0(char *, vm->def->ndisks + 1); +if (qemuSnapshotActiveInternalGetWrdevListHelper(vm, wrdevs) < 0) +return -1; + +if (!(job = qemuBlockJobDiskNew(vm, NULL, QEMU_BLOCKJOB_TYPE_SNAPSHOT_SAVE, +g_strdup_printf("snapsave%d", vm->def->id { +virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("failed to create new blockjob")); +return -1; +} + +qemuBlockJobSyncBegin(job); +if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0) { +ret = -1; +goto cleanup; +} + +rc = qemuMonitorSnapshotSave(qemuDomainGetMonitor(vm), job->name, + name, wrdevs[0], wrdevs); +qemuDomainObjExitMonitor(vm); +if (rc == 0) { +qemuBlockJobStarted(job, vm); +ret = 0; +} + + cleanup: +qemuBlockJobStartupFinalize(vm, job); +return ret; +} + /* The domain is expected to be locked and active. */ static int @@ -316,11 +406,11 @@ 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; if (!qemuMigrationSrcIsAllowed(vm, false, VIR_ASYNC_JOB_SNAPSHOT, 0)) goto cleanup; @@ -342,15 +432,17 @@ qemuSnapshotCreateActiveInternal(virQEMUDriver *driver, } } -if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_SNAPSHOT) < 0) { +if ((ret = qemuSnapshotCreateActiveInternalStart(vm, snap->def->name)) < 0) { resume = false; goto cleanup; } -ret = qemuMonitorCreateSnapshot(priv->mon, snap->def->name); -qemuDomainObjExitMonitor(vm); -if (ret < 0) -goto cleanup; +while ((rv = qemuSnapshotCreateActiveInternalDone(vm)) != 1) { +if (rv < 0 || qemuDomainObjWait(vm) < 0) { +ret = -1; +goto cleanup; +} +} if (!(snapdef->cookie = (virObject *) qemuDomainSaveCookieNew(vm))) goto cleanup; @@ -3603,6 +3695,55 @@ qemuSnapshotDiscardMetadata(virDomainObj *vm, } +static int +qemuSnapshotDiscardActiveInternal(virDomainObj *vm, +
[PATCH 0/4] Rework qemu internal active snapshots to use QMP
These patches make use of QMP recently added snapshot-save/delete commands and reaps HMP savevm/deletevm. The usage of HMP commands are highly discouraged by QEMU. Nikolai Barybin (4): qemu monitor: add snaphot-save/delete QMP commands qemu blockjob: add snapshot-save/delete job types qemu snapshot: use QMP snapshot-save/delete for internal snapshots qemu monitor: reap qemu_monitor_text po/POTFILES | 1 - po/libvirt.pot | 18 src/qemu/meson.build | 1 - src/qemu/qemu_block.c| 2 + src/qemu/qemu_blockjob.c | 6 +- src/qemu/qemu_blockjob.h | 2 + src/qemu/qemu_domain.c | 4 + src/qemu/qemu_monitor.c | 23 +++-- src/qemu/qemu_monitor.h | 16 +++- src/qemu/qemu_monitor_json.c | 66 +++ src/qemu/qemu_monitor_json.h | 13 +++ src/qemu/qemu_monitor_text.c | 88 --- src/qemu/qemu_monitor_text.h | 29 --- src/qemu/qemu_snapshot.c | 158 --- 14 files changed, 267 insertions(+), 160 deletions(-) delete mode 100644 src/qemu/qemu_monitor_text.c delete mode 100644 src/qemu/qemu_monitor_text.h -- 2.43.5
[PATCH 1/4] qemu monitor: add snaphot-save/delete QMP commands
Signed-off-by: Nikolai Barybin --- src/qemu/qemu_monitor.c | 30 src/qemu/qemu_monitor.h | 13 +++ src/qemu/qemu_monitor_json.c | 66 src/qemu/qemu_monitor_json.h | 13 +++ 4 files changed, 122 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index b1c0c6a064..53f5ecf223 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2763,6 +2763,36 @@ qemuMonitorDeleteSnapshot(qemuMonitor *mon, const char *name) } +int +qemuMonitorSnapshotSave(qemuMonitor *mon, +const char *jobname, +const char *snapshotName, +const char *vmstateDev, +char **wrdevs) +{ +VIR_DEBUG("jobname=%s, snapshotName=%s, vmstateDev=%s, wrdevs=%p", + jobname, snapshotName, vmstateDev, wrdevs); + +QEMU_CHECK_MONITOR(mon); + +return qemuMonitorJSONSnapshotSave(mon, jobname, snapshotName, vmstateDev, wrdevs); +} + + +int +qemuMonitorSnapshotDelete(qemuMonitor *mon, + const char *jobname, + const char *snapshotName, + char **wrdevs) +{ +VIR_DEBUG("jobname=%s, snapshotName=%s, wrdevs=%p", jobname, snapshotName, wrdevs); + +QEMU_CHECK_MONITOR(mon); + +return qemuMonitorJSONSnapshotDelete(mon, jobname, snapshotName, wrdevs); +} + + int qemuMonitorBlockdevMirror(qemuMonitor *mon, const char *jobname, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 76c859a888..27dbb78e06 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -1617,3 +1617,16 @@ int qemuMonitorDisplayReload(qemuMonitor *mon, const char *type, bool tlsCerts); + +int +qemuMonitorSnapshotSave(qemuMonitor *mon, +const char *jobname, +const char *snapshotName, +const char *vmstateDev, +char **wrdevs); + +int +qemuMonitorSnapshotDelete(qemuMonitor *mon, + const char *jobname, + const char *snapshotName, + char **wrdevs); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 8a20ce57e6..312a4aee04 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -8955,3 +8955,69 @@ int qemuMonitorJSONDisplayReload(qemuMonitor *mon, return 0; } + +int +qemuMonitorJSONSnapshotSave(qemuMonitor *mon, +const char *jobname, +const char *snapshotName, +const char *vmstateDev, +char **wrdevs) +{ +g_autoptr(virJSONValue) cmd = NULL; +g_autoptr(virJSONValue) reply = NULL; +g_autoptr(virJSONValue) wrdev_list = NULL; +size_t i = 0; + +if (wrdevs) { +wrdev_list = virJSONValueNewArray(); + +for (i = 0; wrdevs[i]; i++) +if (virJSONValueArrayAppendString(wrdev_list, wrdevs[i]) < 0) +return -1; +} + +if (!(cmd = qemuMonitorJSONMakeCommand("snapshot-save", + "s:job-id", jobname, + "s:tag", snapshotName, + "s:vmstate", vmstateDev, + "A:devices", &wrdev_list, + NULL))) +return -1; + +if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) +return -1; + +return qemuMonitorJSONCheckError(cmd, reply); +} + +int +qemuMonitorJSONSnapshotDelete(qemuMonitor *mon, + const char *jobname, + const char *snapshotName, + char **wrdevs) +{ +g_autoptr(virJSONValue) cmd = NULL; +g_autoptr(virJSONValue) reply = NULL; +g_autoptr(virJSONValue) wrdev_list = NULL; +size_t i = 0; + +if (wrdevs) { +wrdev_list = virJSONValueNewArray(); + +for (i = 0; wrdevs[i]; i++) +if (virJSONValueArrayAppendString(wrdev_list, wrdevs[i]) < 0) +return -1; +} + +if (!(cmd = qemuMonitorJSONMakeCommand("snapshot-delete", + "s:job-id", jobname, + "s:tag", snapshotName, + "A:devices", &wrdev_list, + NULL))) +return -1; + +if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0) +return -1; + +return qemuMonitorJSONCheckError(cmd, reply); +} diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 921dd34ed2..0245cd54fc 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -825,3 +825,16 @@ qemuMonitorJSONQueryS