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 <[email protected]>
---
 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 56bd085ef5..25465524e4 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -6168,6 +6168,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 83d702a96c..2e0bbb66a5 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1017,6 +1017,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 c7d291a201..d4187bc145 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -3219,6 +3219,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

Reply via email to