On 23.03.2018 17:05, John Ferlan wrote:
[...]
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 8b4efc8..4079fb3 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -8683,7 +8683,12 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver,
> if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
> return -1;
>
> - rc = qemuMonitorGetCPUInfo(qemuDomainGetMonitor(vm), &info, maxvcpus,
hotplug);
> + rc = qemuMonitorGetCPUInfo(qemuDomainGetMonitor(vm),
> + &info,
> + maxvcpus,
> + hotplug,
> + virQEMUCapsGet(QEMU_DOMAIN_PRIVATE(vm)->qemuCaps,
> + QEMU_CAPS_QUERY_CPUS_FAST));
Perhaps we should create a qemuMonitorGetCPUInfoFast API since we should
also be able to return the @props {core-id, thread-id, socket-id} and
report them. I'm not steadfast on this suggestion - maybe Peter has a
stronger opinion one way or the other. Still it allows future
adjustments and additions to -fast to be more easily "handled".
It would seem those values could be useful although I do see there could
be some "impact" with how hotplug works and the default setting to -1 of
the values by qemuMonitorCPUInfoClear.
Actually, query-cpus[-fast] is not reporting
the topology (socket, core,
thread). The reported thread id is referring to the QEMU CPU thread.
FWIW: Below this point as the returned @info structure is parsed,
there's a comment about query-cpus that would then of course not
necessarily be true or at the very least "adjusted properly" for this
new -fast model.
Agreed, this one escaped me. Will change.
>
> if (qemuDomainObjExitMonitor(driver, vm) < 0)
> goto cleanup;
> @@ -8803,7 +8808,10 @@ qemuDomainRefreshVcpuHalted(virQEMUDriverPtr driver,
> if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
> return -1;
>
> - haltedmap = qemuMonitorGetCpuHalted(qemuDomainGetMonitor(vm), maxvcpus);
> + haltedmap = qemuMonitorGetCpuHalted(qemuDomainGetMonitor(vm),
> + maxvcpus,
> +
virQEMUCapsGet(QEMU_DOMAIN_PRIVATE(vm)->qemuCaps,
> + QEMU_CAPS_QUERY_CPUS_FAST));
Maybe this one should pass 'false' for now until patch 4 comes along to
add the code that fetches the cpu-state and alters halted for the -fast
model. Depending on how one feels about larger patches vs having a 2
patch gap to not have the support for -fast... I dunno, I could see
reason to merge patch 4 here too in order to be in a patch feature for
feature compatible.>
FWIW, I intended to make the patches deprecation-safe, i.e.
prevent
calling query-cpus on a QEMU not supporting it anymore. I see your point
though and would have no principal objections to merging patches 2 and 4
(plus the testcase patches 3 and 5). Would be great to hear more opinions...
>
> if (qemuDomainObjExitMonitor(driver, vm) < 0 || !haltedmap)
> goto cleanup;
[...]
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index a09e93e..6a5fb12 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -1466,7 +1466,8 @@ int qemuMonitorJSONSystemReset(qemuMonitorPtr mon)
> static int
> qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
> struct qemuMonitorQueryCpusEntry **entries,
> - size_t *nentries)
> + size_t *nentries,
> + bool fast)
> {
> struct qemuMonitorQueryCpusEntry *cpus = NULL;
> int ret = -1;
> @@ -1491,11 +1492,19 @@ qemuMonitorJSONExtractCPUInfo(virJSONValuePtr data,
> }
>
> /* Some older qemu versions don't report the thread_id so treat this as
> - * non-fatal, simply returning no data */
> - ignore_value(virJSONValueObjectGetNumberInt(entry, "CPU",
&cpuid));
> - ignore_value(virJSONValueObjectGetNumberInt(entry, "thread_id",
&thread));
> - ignore_value(virJSONValueObjectGetBoolean(entry, "halted",
&halted));
> - qom_path = virJSONValueObjectGetString(entry, "qom_path");
> + * non-fatal, simply returning no data.
> + * The return data of query-cpus-fast has different field names
> + */
> + if (fast) {
> + ignore_value(virJSONValueObjectGetNumberInt(entry,
"cpu-index", &cpuid));
> + ignore_value(virJSONValueObjectGetNumberInt(entry,
"thread-id", &thread));
> + qom_path = virJSONValueObjectGetString(entry, "qom-path");
> + } else {
> + ignore_value(virJSONValueObjectGetNumberInt(entry, "CPU",
&cpuid));
> + ignore_value(virJSONValueObjectGetNumberInt(entry,
"thread_id", &thread));
> + ignore_value(virJSONValueObjectGetBoolean(entry, "halted",
&halted));
> + qom_path = virJSONValueObjectGetString(entry, "qom_path");
> + }
So query-fast doesn't report "halted" which means we default to false
for every arch other than s390 which gets fixed in 2 patches. IIRC other
arches weren't ever reporting halted = true for the not fast and only
our test environment had the halted set. Although I could be wrong -
Peter was much more involved in that code, so I assume he'd have a more
definitive answer.
Halted was reported at least for x86, and a value of true was
rather
common ony multi-core systems. However, defaulting to false doesn't hurt
(beyond the temporary impact on s390), because the user visible halted
value is a tristate for a while now.
Anyway, from the 0/6 cover, I see:
"query-cpus-fast doesn't return the halted state for a virtual CPU,
meaning that the vcpu.<n>.halted value won't be reported with
'virsh domstats' anymore. This is OK, as stats values are not
guaranteed to be reported under all circumstances and on all
architectures."
That's not really the case here since halted defaults to false, but
figured I'd ask just to be sure. If not reporting it was the desire,
then "bool halted" would need to to turn into a virTristateBool in
qemuMonitorQueryCpusEntry and _qemuMonitorCPUInfo. That way it would be
either properly reported as halted or not and if not provided, it would
not be printed. But that may cause issues for other code that uses
halted... Of course I'm not sure
>
> cpus[i].qemu_id = cpuid;
> cpus[i].tid = thread;
John
--
Regards,
Viktor Mihajlovski