Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
include/libvirt/libvirt-domain.h | 8 ++++++++
src/qemu/qemu_domain.c | 6 ++++++
src/qemu/qemu_migration.c | 6 ++++++
src/qemu/qemu_monitor.h | 2 ++
src/qemu/qemu_monitor_json.c | 3 +++
tools/virsh-domain.c | 9 +++++++++
6 files changed, 34 insertions(+)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 0ca621b..5f41602 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -2985,6 +2985,14 @@ int virDomainAbortJob(virDomainPtr dom);
*/
# define VIR_DOMAIN_JOB_COMPRESSION_OVERFLOW "compression_overflow"
+/**
+ * VIR_DOMAIN_JOB_AUTO_CONVERGE_THROTTLE:
+ *
+ * virDomainGetJobStats field: current percentage guest CPUs are throttled
+ * to when auto-convergence decided migration was not converging, as
+ * VIR_TYPED_PARAM_INT.
+ */
+# define VIR_DOMAIN_JOB_AUTO_CONVERGE_THROTTLE "auto_converge_throttle"
/**
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 29f6b93..ab20e52 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -458,6 +458,12 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
goto error;
}
+ if (stats->cpu_throttle_percentage &&
+ virTypedParamsAddInt(&par, &npar, &maxpar,
+ VIR_DOMAIN_JOB_AUTO_CONVERGE_THROTTLE,
+ stats->cpu_throttle_percentage) < 0)
+ goto error;
+
*type = jobInfo->type;
*params = par;
*nparams = npar;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index b26f363..c411dab 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -807,6 +807,10 @@ qemuMigrationCookieStatisticsXMLFormat(virBufferPtr buf,
stats->xbzrle_overflow);
}
+ virBufferAsprintf(buf, "<%1$s>%2$d</%1$s>\n",
+ VIR_DOMAIN_JOB_AUTO_CONVERGE_THROTTLE,
+ stats->cpu_throttle_percentage);
+
virBufferAdjustIndent(buf, -2);
virBufferAddLit(buf, "</statistics>\n");
}
@@ -1152,6 +1156,8 @@ qemuMigrationCookieStatisticsXMLParse(xmlXPathContextPtr ctxt)
virXPathULongLong("string(./" VIR_DOMAIN_JOB_COMPRESSION_OVERFLOW
"[1])",
ctxt, &stats->xbzrle_overflow);
+ virXPathInt("string(./" VIR_DOMAIN_JOB_AUTO_CONVERGE_THROTTLE
"[1])",
+ ctxt, &stats->cpu_throttle_percentage);
cleanup:
ctxt->node = save_ctxt;
return jobInfo;
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 6fecca7..cb4cca8 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -562,6 +562,8 @@ struct _qemuMonitorMigrationStats {
unsigned long long xbzrle_pages;
unsigned long long xbzrle_cache_miss;
unsigned long long xbzrle_overflow;
+
+ int cpu_throttle_percentage;
};
int qemuMonitorGetMigrationStats(qemuMonitorPtr mon,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 66b9c4c..bb426dc 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -2673,6 +2673,9 @@ qemuMonitorJSONGetMigrationStatsReply(virJSONValuePtr reply,
&stats->setup_time) == 0)
stats->setup_time_set = true;
+ ignore_value(virJSONValueObjectGetNumberInt(ret,
"cpu-throttle-percentage",
+
&stats->cpu_throttle_percentage));
+
switch ((qemuMonitorMigrationStatus) stats->status) {
case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index f4d1156..81b1956 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -5759,6 +5759,7 @@ cmdDomjobinfo(vshControl *ctl, const vshCmd *cmd)
int nparams = 0;
unsigned long long value;
unsigned int flags = 0;
+ int ivalue;
int rc;
if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
@@ -5994,6 +5995,14 @@ cmdDomjobinfo(vshControl *ctl, const vshCmd *cmd)
vshPrint(ctl, "%-17s %-13llu\n", _("Compression overflows:"),
value);
}
+ if ((rc = virTypedParamsGetInt(params, nparams,
+ VIR_DOMAIN_JOB_AUTO_CONVERGE_THROTTLE,
+ &ivalue)) < 0) {
+ goto save_error;
+ } else if (rc) {
+ vshPrint(ctl, "%-17s %-13d\n", _("Auto converge throttle:"),
ivalue);
+ }
+
ret = true;
cleanup:
--
2.9.0