include/libvirt/libvirt-domain.h | 9 +++++++++ src/qemu/qemu_domainjob.c | 6 ++++++ src/qemu/qemu_monitor.h | 1 + src/qemu/qemu_monitor_json.c | 2 ++ 4 files changed, 18 insertions(+)
QEMU can report how many times a zerocopy send got deferred during a
live migration with VIR_MIGRATE_ZEROCOPY enabled. Support the stat in
libvirt as part of virDomainGetJobStats
Signed-off-by: Tejus GK <tejus.gk@nutanix.com>
---
include/libvirt/libvirt-domain.h | 9 +++++++++
src/qemu/qemu_domainjob.c | 6 ++++++
src/qemu/qemu_monitor.h | 1 +
src/qemu/qemu_monitor_json.c | 2 ++
4 files changed, 18 insertions(+)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 71bb49fe6c..2959f692bb 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -5842,6 +5842,15 @@ typedef enum {
*/
# define VIR_DOMAIN_JOB_VFIO_DATA_TRANSFERRED "vfio_data_transferred"
+/**
+ * VIR_DOMAIN_JOB_MEMORY_MISSED_ZERO_COPY:
+ * virDomainGetJobStats field: number of times zerocopy send failed
+ * during a live migration, as VIR_TYPED_PARAM_ULLONG.
+ *
+ * Since: 11.9.0
+ */
+# define VIR_DOMAIN_JOB_MEMORY_MISSED_ZERO_COPY "memory_missed_zero_copy"
+
/**
* virConnectDomainEventGenericCallback:
* @conn: the connection pointer
diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c
index afea1ea57a..61441888e9 100644
--- a/src/qemu/qemu_domainjob.c
+++ b/src/qemu/qemu_domainjob.c
@@ -420,6 +420,12 @@ qemuDomainMigrationJobDataToParams(virDomainJobData *jobData,
stats->vfio_data_transferred) < 0)
goto error;
+ if (stats->ram_missed_zero_copy &&
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
+ VIR_DOMAIN_JOB_MEMORY_MISSED_ZERO_COPY,
+ stats->ram_missed_zero_copy) < 0)
+ goto error;
+
done:
*type = virDomainJobStatusToType(jobData->status);
*params = par;
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 8ef85ceb0a..90e6efaf09 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -838,6 +838,7 @@ struct _qemuMonitorMigrationStats {
unsigned long long ram_page_size;
unsigned long long ram_iteration;
unsigned long long ram_postcopy_reqs;
+ unsigned long long ram_missed_zero_copy;
unsigned long long disk_transferred;
unsigned long long disk_remaining;
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 9caade7bc9..2b418d6cad 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -3129,6 +3129,8 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValue *reply,
&stats->ram_iteration));
ignore_value(virJSONValueObjectGetNumberUlong(ram, "postcopy-requests",
&stats->ram_postcopy_reqs));
+ ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-sync-missed-zero-copy",
+ &stats->ram_missed_zero_copy));
}
disk = virJSONValueObjectGetObject(ret, "disk");
--
2.43.7
> On 3 Oct 2025, at 10:59 PM, Tejus GK <tejus.gk@nutanix.com> wrote:
>
> QEMU can report how many times a zerocopy send got deferred during a
> live migration with VIR_MIGRATE_ZEROCOPY enabled. Support the stat in
> libvirt as part of virDomainGetJobStats
>
> Signed-off-by: Tejus GK <tejus.gk@nutanix.com>
> ---
> include/libvirt/libvirt-domain.h | 9 +++++++++
> src/qemu/qemu_domainjob.c | 6 ++++++
> src/qemu/qemu_monitor.h | 1 +
> src/qemu/qemu_monitor_json.c | 2 ++
> 4 files changed, 18 insertions(+)
>
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index 71bb49fe6c..2959f692bb 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -5842,6 +5842,15 @@ typedef enum {
> */
> # define VIR_DOMAIN_JOB_VFIO_DATA_TRANSFERRED "vfio_data_transferred"
>
> +/**
> + * VIR_DOMAIN_JOB_MEMORY_MISSED_ZERO_COPY:
> + * virDomainGetJobStats field: number of times zerocopy send failed
> + * during a live migration, as VIR_TYPED_PARAM_ULLONG.
> + *
> + * Since: 11.9.0
> + */
> +# define VIR_DOMAIN_JOB_MEMORY_MISSED_ZERO_COPY "memory_missed_zero_copy"
> +
> /**
> * virConnectDomainEventGenericCallback:
> * @conn: the connection pointer
> diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c
> index afea1ea57a..61441888e9 100644
> --- a/src/qemu/qemu_domainjob.c
> +++ b/src/qemu/qemu_domainjob.c
> @@ -420,6 +420,12 @@ qemuDomainMigrationJobDataToParams(virDomainJobData *jobData,
> stats->vfio_data_transferred) < 0)
> goto error;
>
> + if (stats->ram_missed_zero_copy &&
> + virTypedParamsAddULLong(&par, &npar, &maxpar,
> + VIR_DOMAIN_JOB_MEMORY_MISSED_ZERO_COPY,
> + stats->ram_missed_zero_copy) < 0)
> + goto error;
> +
> done:
> *type = virDomainJobStatusToType(jobData->status);
> *params = par;
> diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
> index 8ef85ceb0a..90e6efaf09 100644
> --- a/src/qemu/qemu_monitor.h
> +++ b/src/qemu/qemu_monitor.h
> @@ -838,6 +838,7 @@ struct _qemuMonitorMigrationStats {
> unsigned long long ram_page_size;
> unsigned long long ram_iteration;
> unsigned long long ram_postcopy_reqs;
> + unsigned long long ram_missed_zero_copy;
>
> unsigned long long disk_transferred;
> unsigned long long disk_remaining;
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 9caade7bc9..2b418d6cad 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -3129,6 +3129,8 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValue *reply,
> &stats->ram_iteration));
> ignore_value(virJSONValueObjectGetNumberUlong(ram, "postcopy-requests",
> &stats->ram_postcopy_reqs));
> + ignore_value(virJSONValueObjectGetNumberUlong(ram, "dirty-sync-missed-zero-copy",
> + &stats->ram_missed_zero_copy));
> }
>
> disk = virJSONValueObjectGetObject(ret, "disk");
> --
> 2.43.7
>
ping, for reviews.
regards,
Tejus
© 2016 - 2026 Red Hat, Inc.