On Tue, Feb 21, 2017 at 23:11:54 -0500, John Ferlan wrote:
On 02/15/2017 11:44 AM, Jiri Denemark wrote:
> The static CPU model expansion is designed to return only canonical
> names of all CPU properties. TO maintain backward compatibility libvirt
s/TO/To
> is stuck with different spelling of some of the features, which is only
> returned by the full expansion. But in addition to returned all spelling
s/returned/returning
> variants for all properties the full expansion will contain properties
> which are not guaranteed to be migration compatible. We need to combine
> both expansions. First we need to call the static expansion to limit the
> result to migratable properties. Then we can use the result of the
> static expansion as an input to the full expansion to get both canonical
> names and their aliases.
...
> diff --git a/src/qemu/qemu_monitor_json.c
b/src/qemu/qemu_monitor_json.c
> index dd7907482..0454571c1 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -5026,7 +5026,7 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
> qemuMonitorCPUModelInfoPtr *model_info)
> {
> int ret = -1;
> - virJSONValuePtr model;
> + virJSONValuePtr model = NULL;
> virJSONValuePtr cmd = NULL;
> virJSONValuePtr reply = NULL;
> virJSONValuePtr data;
> @@ -5038,16 +5038,24 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
>
> *model_info = NULL;
>
> - if (!(model = virJSONValueNewObject()))
> - goto cleanup;
> + retry:
> + if (!model) {
> + if (!(model = virJSONValueNewObject()))
> + goto cleanup;
>
> - if (virJSONValueObjectAppendString(model, "name", model_name) <
0)
> - goto cleanup;
> + if (virJSONValueObjectAppendString(model, "name", model_name)
< 0)
> + goto cleanup;
> + }
>
> switch (type) {
> case QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC:
> + case QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL:
> typeStr = "static";
> break;
> +
> + case QEMU_MONITOR_CPU_MODEL_EXPANSION_FULL:
> + typeStr = "full";
> + break;
> }
>
> if (!(cmd = qemuMonitorJSONMakeCommand("query-cpu-model-expansion",
> @@ -5084,6 +5092,16 @@ qemuMonitorJSONGetCPUModelExpansion(qemuMonitorPtr mon,
> goto cleanup;
> }
>
> + if (type == QEMU_MONITOR_CPU_MODEL_EXPANSION_STATIC_FULL) {
> + if (!(model = virJSONValueCopy(cpu_model)))
> + goto cleanup;
> +
> + virJSONValueFree(cmd);
> + virJSONValueFree(reply);
> + type = QEMU_MONITOR_CPU_MODEL_EXPANSION_FULL;
> + goto retry;
When you get here, model must be set.. The retry label tests for not
set, which cannot be true - so why would the retry label be on the
switch statement? If it did move, then the move of the AppendString
inside the "if" wouldn't be necessary.
Sure, no idea what I was thinking about :-)
> + }
> +
This just seems odd - it's not really a retry, it's like piling on. To
me retry is like trying again because something failed. In this case you
get static, but then add on the full afterwards. I don't have a better
suggestion for a label name.
I used "retry" since it's a common name for backward jumps. Anyway I
think a small comment explaining why we are jumping back will help...
Jirka