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