Eduardo Habkost <ehabk...@redhat.com> writes: > On Fri, Nov 20, 2015 at 03:57:17PM +0100, Markus Armbruster wrote: >> Eduardo Habkost <ehabk...@redhat.com> writes: >> >> > On Fri, Nov 20, 2015 at 02:00:40PM +0100, Markus Armbruster wrote: >> >> qmp_query_memdev() doesn't fail. Instead, it returns an empty list. >> >> That's wrong. >> >> >> >> Two error paths: >> >> >> >> * When object_get_objects_root() returns null. It never does, so >> >> simply drop the useless error handling. >> >> >> >> * When query_memdev() fails. This can happen, and the error to return >> >> is the one that query_memdev() currently leaks. Passing the error >> >> from query_memdev() to qmp_query_memdev() isn't so simple, because >> >> object_child_foreach() is in the way. Fixable, but I'd rather not >> >> try it in hard freeze. Plug the leak, make up an error, and add a >> >> FIXME for the remaining work. >> >> >> >> Screwed up in commit 76b5d85 "qmp: add query-memdev". >> >> >> >> Signed-off-by: Markus Armbruster <arm...@redhat.com> >> > >> > Reviewed-by: Eduardo Habkost <ehabk...@redhat.com> >> > >> > Do you know how to trigger a query_memdev() error today, or is >> > just theoretical? >> >> Theoretical; I tested by injecting an error with gdb. >> >> query_memdev() fails exactly when some object_property_get_FOO() fails. >> If we decide such a failure would always be a programming error, we can >> pass &error_abort and simplify things. Opinions? > > The hostmem-backend property getters should never fail. Using > &error_abort on query_memdev() would make everything simpler. > > (I would even use the HostMemoryBackend struct fields directly, > instead of QOM properties. Is there a good reason to use QOM to > fetch the data that's readily available in the C struct?)
I can't see why not, sketch appended. Note that I still go through the property for host_nodes, because I couldn't see how to do that simpler. If you like this patch, I'll post it as v2. numa: Clean up query-memdev error handling qmp_query_memdev() has two error paths: * When object_get_objects_root() returns null. It never does, so simply drop the useless error handling. * When query_memdev() fails. It looks like it could, but that's just because its code is pointlessly complicated. Simplify it, and drop the useless error handling. Messed up in commit 76b5d85 "qmp: add query-memdev". Signed-off-by: Markus Armbruster <arm...@redhat.com> --- numa.c | 69 ++++++++++-------------------------------------------------------- 1 file changed, 10 insertions(+), 59 deletions(-) diff --git a/numa.c b/numa.c index fdfe294..4e9be9f 100644 --- a/numa.c +++ b/numa.c @@ -517,80 +517,31 @@ static int query_memdev(Object *obj, void *opaque) { MemdevList **list = opaque; MemdevList *m = NULL; - Error *err = NULL; if (object_dynamic_cast(obj, TYPE_MEMORY_BACKEND)) { + HostMemoryBackend *backend = MEMORY_BACKEND(obj); + m = g_malloc0(sizeof(*m)); - m->value = g_malloc0(sizeof(*m->value)); - - m->value->size = object_property_get_int(obj, "size", - &err); - if (err) { - goto error; - } - - m->value->merge = object_property_get_bool(obj, "merge", - &err); - if (err) { - goto error; - } - - m->value->dump = object_property_get_bool(obj, "dump", - &err); - if (err) { - goto error; - } - - m->value->prealloc = object_property_get_bool(obj, - "prealloc", &err); - if (err) { - goto error; - } - - m->value->policy = object_property_get_enum(obj, - "policy", - "HostMemPolicy", - &err); - if (err) { - goto error; - } - + m->value->size = backend->size; + m->value->merge = backend->merge; + m->value->dump = backend->dump; + m->value->prealloc = backend->prealloc; + m->value->policy = backend->policy; object_property_get_uint16List(obj, "host-nodes", - &m->value->host_nodes, &err); - if (err) { - goto error; - } - + &m->value->host_nodes, &error_abort); m->next = *list; *list = m; } return 0; -error: - g_free(m->value); - g_free(m); - - return -1; } MemdevList *qmp_query_memdev(Error **errp) { - Object *obj; + Object *obj = object_get_objects_root(); MemdevList *list = NULL; - obj = object_get_objects_root(); - if (obj == NULL) { - return NULL; - } - - if (object_child_foreach(obj, query_memdev, &list) != 0) { - goto error; - } - + object_child_foreach(obj, query_memdev, &list); return list; - -error: - qapi_free_MemdevList(list); - return NULL; } -- 2.4.3