
On Thu, Jan 28, 2016 at 10:04:29 +0300, Nikolay Shirokovskiy wrote:
From: ShaoHe Feng <shaohe.feng@intel.com>
Current compression does not use all range of parameter values so let's use some of them as 'unspecified' values. These values will be used to mark parameters that were not specified on migrate command line. Thus we check that qemu does not use these values when we read parameters.
Signed-off-by: ShaoHe Feng <shaohe.feng@intel.com> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/qemu/qemu_monitor.c | 29 +++++++++++++ src/qemu/qemu_monitor.h | 16 +++++++ src/qemu/qemu_monitor_json.c | 87 +++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 5 +++ src/qemu/qemu_monitor_text.c | 100 +++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_text.h | 5 +++
Please, remove everything related to HMP monitor, multithreaded compression is not supported by any QEMU for which we would use text monitor.
6 files changed, 242 insertions(+)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index cf1cdfb..e9b1ce4 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -2116,6 +2116,35 @@ qemuMonitorSetMigrationCacheSize(qemuMonitorPtr mon,
int +qemuMonitorGetMigrationCompressParametersMT(qemuMonitorPtr mon, + qemuMonitorMigrationMTParametersPtr params)
I think a more general qemuMonitor[GS]etMigrationParameters [gs]etting all parameters at once would be a bit better. After all, it all boils down to query-migrate-parameters and migrate-set-parameters and having separate functions for each group of parameters would mean we'd have to call the QMP commands several times.
+{ + QEMU_CHECK_MONITOR(mon); + + if (mon->json) + return qemuMonitorJSONGetMigrationCompressParametersMT(mon, params); + else + return qemuMonitorTextGetMigrationCompressParametersMT(mon, params);
Since support for text monitor is not desirable, this function will be as simple as QEMU_CHECK_MONITOR_JSON(mon); return qemuMonitorJSON...;
+} + +int +qemuMonitorSetMigrationCompressParametersMT(qemuMonitorPtr mon, + qemuMonitorMigrationMTParametersPtr params) +{ + VIR_DEBUG("level=%d threads=%d dthreads=%d", params->level, + params->threads, + params->dthreads);
Either VIR_DEBUG("level=%d threads=%d dthreads=%d", params->level, params->threads, params->dthreads); or VIR_DEBUG("level=%d threads=%d dthreads=%d", params->level, params->threads, params->dthreads);
+ + QEMU_CHECK_MONITOR(mon); + + if (mon->json) + return qemuMonitorJSONSetMigrationCompressParametersMT(mon, params); + else + return qemuMonitorTextSetMigrationCompressParametersMT(mon, params); +} + + +int qemuMonitorGetMigrationStats(qemuMonitorPtr mon, qemuMonitorMigrationStatsPtr stats) { diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index c2a0ed6..5a5e0e2 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -463,6 +463,22 @@ int qemuMonitorGetMigrationCacheSize(qemuMonitorPtr mon, int qemuMonitorSetMigrationCacheSize(qemuMonitorPtr mon, unsigned long long cacheSize);
+typedef struct _qemuMonitorMigrationMTParameters qemuMonitorMigrationMTParameters; +typedef qemuMonitorMigrationMTParameters *qemuMonitorMigrationMTParametersPtr; +struct _qemuMonitorMigrationMTParameters { + /* -1 is value of unspecified */ + int level; + /* 0 is value of unspecified */ + unsigned int threads; + /* 0 is value of unspecified */ + unsigned int dthreads; +}; + +int qemuMonitorGetMigrationCompressParametersMT(qemuMonitorPtr mon, + qemuMonitorMigrationMTParametersPtr params); +int qemuMonitorSetMigrationCompressParametersMT(qemuMonitorPtr mon, + qemuMonitorMigrationMTParametersPtr params); + typedef enum { QEMU_MONITOR_MIGRATION_STATUS_INACTIVE, QEMU_MONITOR_MIGRATION_STATUS_SETUP, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 24a8865..62aba88 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2437,6 +2437,93 @@ qemuMonitorJSONSetMigrationCacheSize(qemuMonitorPtr mon, }
+int qemuMonitorJSONGetMigrationCompressParametersMT(qemuMonitorPtr mon, + qemuMonitorMigrationMTParametersPtr params) +{ + int ret = -1; + virJSONValuePtr result; + virJSONValuePtr cmd; + virJSONValuePtr reply = NULL; + + if ((cmd = qemuMonitorJSONMakeCommand("query-migrate-parameters", NULL)) == NULL) + return -1; + + if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0) + goto cleanup; + + if ((ret = qemuMonitorJSONCheckError(cmd, reply)) < 0) + goto cleanup; + + if (!(result = virJSONValueObjectGet(reply, "return"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-migrate-parameters reply was missing " + "'return' data")); + goto cleanup; + } + + if (virJSONValueObjectGetNumberInt(result, "compress-level", + ¶ms->level) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("malformed/missing compress-level " + "in migrate parameters")); + goto cleanup; + } + + if (virJSONValueObjectGetNumberUint(result, "compress-threads", + ¶ms->threads) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("malformed/missing compress-threads " + "in migrate parameters")); + goto cleanup; + } + + if (virJSONValueObjectGetNumberUint(result, "decompress-threads", + ¶ms->dthreads) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("malformed/missing decompress-threads " + "in migrate parameters")); + goto cleanup; + } + + if (params->level < 0 || params->threads < 1 || params->dthreads < 1) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("unexpected compress parameters")); + goto cleanup; + } + + ret = 0; + cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + +int qemuMonitorJSONSetMigrationCompressParametersMT(qemuMonitorPtr mon, + qemuMonitorMigrationMTParametersPtr params) +{ + int ret = -1; + virJSONValuePtr cmd; + virJSONValuePtr reply = NULL; + + cmd = qemuMonitorJSONMakeCommand("migrate-set-parameters", + "i:compress-level", params->level, + "u:compress-threads", params->threads, + "u:decompress-threads", params->dthreads, + NULL);
Is passing an "undefined" value for any of these parameters allowed (i.e., will QEMU use a default value) or do we always have to set all of them?
+ if (!cmd) + return -1; + + if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0) + goto cleanup; + + ret = qemuMonitorJSONCheckError(cmd, reply); + + cleanup: + virJSONValueFree(cmd); + virJSONValueFree(reply); + return ret; +} + ...
Jirka