Re: [PATCH 0/2] qemu: Add support for pauth Arm CPU feature

2024-07-15 Thread Michal Prívozník
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

2024-07-15 Thread Michal Prívozník
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

2024-07-15 Thread Michal Prívozník
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

2024-07-15 Thread Andrea Bolognani
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

2024-07-15 Thread Andrea Bolognani
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

2024-07-15 Thread Michal Prívozník
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

2024-07-15 Thread Michal Privoznik
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

2024-07-15 Thread Daniel P . Berrangé
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

2024-07-15 Thread Martin Kletzander
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

2024-07-15 Thread Nikolai Barybin via Devel
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

2024-07-15 Thread Nikolai Barybin via Devel
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

2024-07-15 Thread Nikolai Barybin via Devel
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

2024-07-15 Thread Nikolai Barybin via Devel
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

2024-07-15 Thread Nikolai Barybin via Devel
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