
On 08/19/2016 10:38 AM, Peter Krempa wrote:
Add support for retrieving information regarding hotpluggable cpu units supported by qemu. Data returned by the command carries information needed to figure out the granularity of hotplug, the necessary cpu type name and the topology information.
Note that qemu doesn't specify any particular order of the entries thus it's necessary sort them by socket_id, core_id and thread_id to the order libvirt expects. ---
Notes: v2: - fixed alias string in comment - already ACKed
src/qemu/qemu_monitor.h | 16 ++++ src/qemu/qemu_monitor_json.c | 170 +++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_monitor_json.h | 5 ++ 3 files changed, 191 insertions(+)
[...]
+ +/** + * [{ + * "props": { + * "core-id": 0, + * "thread-id": 0, + * "socket-id": 0 + * }, + * "vcpus-count": 1, + * "qom-path": "/machine/unattached/device[0]", + * "type": "qemu64-x86_64-cpu" + * }, + * {...} + * ] + */ +static int +qemuMonitorJSONProcessHotpluggableCpusReply(virJSONValuePtr vcpu, + struct qemuMonitorQueryHotpluggableCpusEntry *entry) +{ + virJSONValuePtr props; + const char *tmp; + + if (!(tmp = virJSONValueObjectGetString(vcpu, "type"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-hotpluggable-cpus didn't return device type")); + return -1; + } + + if (VIR_STRDUP(entry->type, tmp) < 0) + return -1; + + if (virJSONValueObjectGetNumberUint(vcpu, "vcpus-count", &entry->vcpus) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-hotpluggable-cpus didn't return vcpus-count")); + return -1; + } + + if (!(props = virJSONValueObjectGetObject(vcpu, "props"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-hotpluggable-cpus didn't return device props")); + return -1; + } + + entry->node_id = -1; + entry->socket_id = -1; + entry->core_id = -1; + entry->thread_id = -1; + + ignore_value(virJSONValueObjectGetNumberInt(props, "node-id", &entry->node_id)); + ignore_value(virJSONValueObjectGetNumberInt(props, "socket-id", &entry->socket_id)); + ignore_value(virJSONValueObjectGetNumberInt(props, "core-id", &entry->core_id)); + ignore_value(virJSONValueObjectGetNumberInt(props, "thread-id", &entry->thread_id)); + + if (entry->node_id == -1 && entry->socket_id == -1 && + entry->core_id == -1 && entry->thread_id == -1) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("query-hotpluggable-cpus entry doesn't report " + "topology information")); + return -1; + } + + /* qom path is not present unless the vCPU is online */ + if ((tmp = virJSONValueObjectGetString(vcpu, "qom-path"))) { + if (VIR_STRDUP(entry->qom_path, tmp) < 0) + return -1; + + /* alias is the part after last slash having a "vcpu" prefix */ + if ((tmp = strrchr(tmp, '/')) && STRPREFIX(tmp + 1, "vcpu")) { + if (VIR_STRDUP(entry->alias, tmp + 1) < 0) + return -1;
Hmm... Just trying to understand... The example above has: "qom-path": "/machine/unattached/device[0]", So "/vcpuX" shows up when? IOW: How does an entry look that has that vcpu string in it? Ah - I see a couple patches later in the tests: qom_path='/machine/peripheral/vcpu0' I was also wondering why you extract this, but I see in later patches... John
+ } + } + + return 0; +} + +
[...]