[libvirt] [PATCH 1/3] qemu_monitor: introduce new function to get QOM path
Pavel Hrdina
phrdina at redhat.com
Mon Jan 5 07:37:52 UTC 2015
On 12/16/2014 12:54 AM, John Ferlan wrote:
>
>
> On 12/11/2014 10:42 AM, Pavel Hrdina wrote:
>> The search is done recursively only through QOM object that has a type
>> prefixed with "child<" as this indicate that the QOM is a parent for
>> other QOM objects.
>>
>> The usage is that you give known device name with starting path where to
>> search.
>>
>> Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
>> ---
>> src/qemu/qemu_monitor.c | 173 ++++++++++++++++++++++++++++--------------------
>> 1 file changed, 102 insertions(+), 71 deletions(-)
>>
>> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
>> index c9c84f9..ee4460f 100644
>> --- a/src/qemu/qemu_monitor.c
>> +++ b/src/qemu/qemu_monitor.c
>> @@ -1008,22 +1008,90 @@ qemuMonitorSetOptions(qemuMonitorPtr mon, virJSONValuePtr options)
>> mon->options = options;
>> }
>>
>> -/* Search the qom objects for the balloon driver object by it's known name
>> - * of "virtio-balloon-pci". The entry for the driver will be found in the
>> - * returned 'type' field using the syntax "child<virtio-balloon-pci>".
>> - *
>> - * Once found, check the entry to ensure it has the correct property listed.
>> - * If it does not, then obtaining statistics from qemu will not be possible.
>> - * This feature was added to qemu 1.5.
>> +
>> +/**
>> + * Search the qom objects by it's known name. The name is compared against
>> + * filed 'type' formatted as 'link<%name>'.
>> *
>> * This procedure will be call recursively until found or the qom-list is
>> * exhausted.
>> *
>> * Returns:
>> *
>> - * 1 - Found
>> - * 0 - Not found still looking
>> + * 0 - Found
>> * -1 - Error bail out
>> + * -2 - Not found
>> + *
>> + * NOTE: This assumes we have already called qemuDomainObjEnterMonitor()
>> + */
>> +static int
>> +qemuMonitorFindObjectPath(qemuMonitorPtr mon,
>> + const char *curpath,
>> + const char *name,
>> + char **path)
>> +{
>> + ssize_t i, npaths = 0;
>> + int ret = -2;
>> + char *nextpath = NULL;
>> + char *type = NULL;
>> + qemuMonitorJSONListPathPtr *paths = NULL;
>> +
>> + if (virAsprintf(&type, "link<%s>", name) < 0)
>> + return -1;
>> +
>> + VIR_DEBUG("Searching for '%s' Object Path starting at '%s'", type, curpath);
>> +
>> + npaths = qemuMonitorJSONGetObjectListPaths(mon, curpath, &paths);
>> + if (npaths < 0)
>> + goto cleanup;
>> +
>> + for (i = 0; i < npaths && ret == -2; i++) {
>> +
>> + if (STREQ_NULLABLE(paths[i]->type, type)) {
>> + VIR_DEBUG("Path to '%s' is '%s/%s'", type, curpath, paths[i]->name);
>> + ret = 0;
>> + if (virAsprintf(path, "%s/%s", curpath, paths[i]->name) < 0) {
>> + *path = NULL;
>> + ret = -1;
>> + }
>> + goto cleanup;
>> + }
>> +
>> + /* Type entries that begin with "child<" are a branch that can be
>> + * traversed looking for more entries
>> + */
>> + if (paths[i]->type && STRPREFIX(paths[i]->type, "child<")) {
>> + if (virAsprintf(&nextpath, "%s/%s", curpath, paths[i]->name) < 0) {
>> + ret = -1;
>> + goto cleanup;
>> + }
>> +
>> + ret = qemuMonitorFindObjectPath(mon, nextpath, name, path);
>> + }
>> + }
>> +
>> + cleanup:
>> + for (i = 0; i < npaths; i++)
>> + qemuMonitorJSONListPathFree(paths[i]);
>> + VIR_FREE(paths);
>> + VIR_FREE(nextpath);
>> + VIR_FREE(type);
>> + return ret;
>> +}
>> +
>> +
>
> NIT: You added a /** as the comment opener previously, but not here.
I'll fix that :)
>
>> +/* Search the qom objects for the balloon driver object by it's known name
>> + * of "virtio-balloon-pci". The entry for the driver will be found by using
>> + * function "qemuMonitorFindObjectPath".
>> + *
>> + * Once found, check the entry to ensure it has the correct property listed.
>> + * If it does not, then obtaining statistics from QEMU will not be possible.
>> + * This feature was added to QEMU 1.5.
>> + *
>> + * Returns:
>> + *
>> + * 0 - Found
>> + * -1 - Not found or error
>> *
>> * NOTE: This assumes we have already called qemuDomainObjEnterMonitor()
>> */
>> @@ -1032,14 +1100,13 @@ qemuMonitorFindBalloonObjectPath(qemuMonitorPtr mon,
>> virDomainObjPtr vm,
>> const char *curpath)
>> {
>> - ssize_t i, j, npaths = 0, nprops = 0;
>> - int ret = 0;
>> - char *nextpath = NULL;
>> - qemuMonitorJSONListPathPtr *paths = NULL;
>> + ssize_t i, nprops = 0;
>> + int ret = -1;
>> + char *path = NULL;
>> qemuMonitorJSONListPathPtr *bprops = NULL;
>>
>> if (mon->balloonpath) {
>> - return 1;
>> + return 0;
>> } else if (mon->ballooninit) {
>> virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> _("Cannot determine balloon device path"));
>> @@ -1055,70 +1122,34 @@ qemuMonitorFindBalloonObjectPath(qemuMonitorPtr mon,
>> return -1;
>> }
>>
>> - VIR_DEBUG("Searching for Balloon Object Path starting at %s", curpath);
>> -
>> - npaths = qemuMonitorJSONGetObjectListPaths(mon, curpath, &paths);
>> - if (npaths < 0)
>> + if (qemuMonitorFindObjectPath(mon, curpath, "virtio-balloon-pci", &path) < 0)
>> return -1;
>>
>> - for (i = 0; i < npaths && ret == 0; i++) {
>> -
>> - if (STREQ_NULLABLE(paths[i]->type, "link<virtio-balloon-pci>")) {
>> - VIR_DEBUG("Path to <virtio-balloon-pci> is '%s/%s'",
>> - curpath, paths[i]->name);
>> - if (virAsprintf(&nextpath, "%s/%s", curpath, paths[i]->name) < 0) {
>> - ret = -1;
>> - goto cleanup;
>> - }
>> -
>> - /* Now look at the each of the property entries to determine
>> - * whether "guest-stats-polling-interval" exists. If not,
>> - * then this version of qemu/kvm does not support the feature.
>> - */
>> - nprops = qemuMonitorJSONGetObjectListPaths(mon, nextpath, &bprops);
>> - if (nprops < 0) {
>> - ret = -1;
>> - goto cleanup;
>> - }
>> -
>> - for (j = 0; j < nprops; j++) {
>> - if (STREQ(bprops[j]->name, "guest-stats-polling-interval")) {
>> - VIR_DEBUG("Found Balloon Object Path %s", nextpath);
>> - mon->balloonpath = nextpath;
>> - nextpath = NULL;
>> - ret = 1;
>> - goto cleanup;
>> - }
>> - }
>> -
>> - /* If we get here, we found the path, but not the property */
>> - virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> - _("Property 'guest-stats-polling-interval' "
>> - "not found on memory balloon driver."));
>> - ret = -1;
>> + nprops = qemuMonitorJSONGetObjectListPaths(mon, path, &bprops);
>> + if (nprops < 0)
>> + goto cleanup;
>> +
>> + for (i = 0; i < nprops; i++) {
>> + if (STREQ(bprops[i]->name, "guest-stats-polling-interval")) {
>> + VIR_DEBUG("Found Balloon Object Path %s", path);
>> + mon->balloonpath = path;
>> + path = NULL;
>> + ret = 0;
>> goto cleanup;
>> }
>> -
>> - /* Type entries that begin with "child<" are a branch that can be
>> - * traversed looking for more entries
>> - */
>> - if (paths[i]->type && STRPREFIX(paths[i]->type, "child<")) {
>> - if (virAsprintf(&nextpath, "%s/%s", curpath, paths[i]->name) < 0) {
>> - ret = -1;
>> - goto cleanup;
>> - }
>> - ret = qemuMonitorFindBalloonObjectPath(mon, vm, nextpath);
>> - }
>> }
>>
>> +
>> + /* If we get here, we found the path, but not the property */
>> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> + _("Property 'guest-stats-polling-interval' "
>> + "not found on memory balloon driver."));
>> +
>> cleanup:
>> - for (i = 0; i < npaths; i++)
>> - qemuMonitorJSONListPathFree(paths[i]);
>> - VIR_FREE(paths);
>> - for (j = 0; j < nprops; j++)
>> - qemuMonitorJSONListPathFree(bprops[j]);
>> + for (i = 0; i < nprops; i++)
>> + qemuMonitorJSONListPathFree(bprops[i]);
>> VIR_FREE(bprops);
>> - VIR_FREE(nextpath);
>> + VIR_FREE(path);
>> return ret;
>> }
>>
>> @@ -1660,7 +1691,7 @@ int qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon,
>> return -1;
>> }
>>
>> - if (qemuMonitorFindBalloonObjectPath(mon, mon->vm, "/") == 1) {
>> + if (qemuMonitorFindBalloonObjectPath(mon, mon->vm, "/") == 0) {
>
> A bit of a bikeshed, but the "/" could be moved into the called function
> - I say this only because in patch 3 you call qemuMonitorFindObjectPath
> with "/".
The reason to have this parameter is that you can pass non root path to
speed up the search.
>
> Could probably also just pass 'mon' and deref 'mon->vm' in the called
> routine.
This is a good point, I'll fix that.
Thanks for review
Pavel
> ACK,
>
> John
>
>> ret = qemuMonitorJSONSetMemoryStatsPeriod(mon, mon->balloonpath,
>> period);
>> }
>>
More information about the libvir-list
mailing list