[libvirt] [PATCH v2 08/23] qemu: monitor: Add algorithm for combining query-(hotpluggable-)-cpus data

John Ferlan jferlan at redhat.com
Fri Aug 19 18:37:49 UTC 2016



On 08/19/2016 02:33 PM, John Ferlan wrote:
> 
> 

[...]

>> +/**
>> + * qemuMonitorGetCPUInfoHotplug:
>> + *
>> + * This function stitches together data retrieved via query-hotpluggable-cpus
>> + * which returns entities on the hotpluggable level (which may describe more
>> + * than one guest logical vcpu) with the output of query-cpus, having an entry
>> + * per enabled guest logical vcpu.
>> + *
>> + * query-hotpluggable-cpus conveys following information:
>> + * - topology information and number of logical vcpus this entry creates
>> + * - device type name of the entry that needs to be used when hotplugging
>> + * - qom path in qemu which can be used to map the entry against query-cpus
>> + *
>> + * query-cpus conveys following information:
>> + * - thread id of a given guest logical vcpu
>> + * - order in which the vcpus were inserted
>> + * - qom path to allow mapping the two together
>> + *
>> + * The libvirt's internal structure has an entry for each possible (even
>> + * disabled) guest vcpu. The purpose is to map the data together so that we are
>> + * certain of the thread id mapping and the information required for vcpu
>> + * hotplug.
>> + *
>> + * This function returns 0 on success and -1 on error, but does not report
>> + * libvirt errors so that fallback approach can be used.
>> + */
>> +static int
>> +qemuMonitorGetCPUInfoHotplug(struct qemuMonitorQueryHotpluggableCpusEntry *hotplugvcpus,
>> +                             size_t nhotplugvcpus,
>> +                             struct qemuMonitorQueryCpusEntry *cpuentries,
>> +                             size_t ncpuentries,
>> +                             qemuMonitorCPUInfoPtr vcpus,
>> +                             size_t maxvcpus)
>> +{
>> +    int order = 1;
>> +    size_t totalvcpus = 0;
>> +    size_t i;
>> +    size_t j;
>> +
>> +    /* ensure that the total vcpu count reported by query-hotpluggable-cpus equals
>> +     * to the libvirt maximum cpu count */
>> +    for (i = 0; i < nhotplugvcpus; i++)
>> +        totalvcpus += hotplugvcpus[i].vcpus;
>> +
>> +    if (totalvcpus != maxvcpus) {
>> +        VIR_DEBUG("expected '%zu' total vcpus got '%zu'", maxvcpus, totalvcpus);
>> +        return -1;
>> +    }
> 
> Still trying to come to grips with 'nhotplugvcpus', 'ncpuentries', and
> 'maxvcpus'
> 
>> +
>> +    /* Note the order in which the hotpluggable entities are inserted by
>> +     * matching them to the query-cpus entries */
>> +    for (i = 0; i < ncpuentries; i++) {
>> +        for (j = 0; j < nhotplugvcpus; j++) {
>> +            if (!cpuentries[i].qom_path ||
>> +                !hotplugvcpus[j].qom_path ||
>> +                !STRPREFIX(cpuentries[i].qom_path, hotplugvcpus[j].qom_path))
>> +                continue;
>> +
>> +            /* add ordering info for hotpluggable entries */
>> +            if (hotplugvcpus[j].enable_id == 0)
>> +                hotplugvcpus[j].enable_id = order++;
>> +
>> +            break;
> 
> So enable_id always == 1 (or 0 I supposed) and order never gets beyond
> 2?  Or am I missing something not obvious.
> 

UGH - face palm Friday... break the inner loop.


John
> I guess I thought you were trying to figure out the order of
> nhotplugvcpus so that you could fill in vcpus in the correct order, but
> that doesn't match the subsequent algorithm.
> 
> John
>> +        }
>> +    }
>> +
[...]




More information about the libvir-list mailing list