[PATCH] qemu: add support for dirty-sync-missed-zero-copy migration statistic

Tejus GK posted 1 patch 1 day, 5 hours ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20251003172954.1866201-1-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(+)
[PATCH] qemu: add support for dirty-sync-missed-zero-copy migration statistic
Posted by Tejus GK 1 day, 5 hours ago
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