[libvirt] [PATCHv2 2/6] qemu: use query-cpus-fast in JSON monitor
Viktor Mihajlovski
mihajlov at linux.vnet.ibm.com
Mon Mar 26 08:12:55 UTC 2018
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
More information about the libvir-list
mailing list