>>> "Daniel P. Berrange" <berra...@redhat.com> 2016/9/26 星期一 下午 6:37 >>> >On Mon, Sep 26, 2016 at 06:16:25PM +0800, Lin Ma wrote: >> Signed-off-by: Lin Ma <l...@suse.com> >> --- >> qom/object_interfaces.c | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/qom/object_interfaces.c b/qom/object_interfaces.c >> index bf59846..9288242 100644 >> --- a/qom/object_interfaces.c >> +++ b/qom/object_interfaces.c >> @@ -217,6 +217,7 @@ static void register_types(void) >> static const TypeInfo uc_interface_info = { >> .name = TYPE_USER_CREATABLE, >> .parent = TYPE_INTERFACE, >> + .abstract = true, >> .class_size = sizeof(UserCreatableClass), >> }; > >This doesn't make any conceptual sense. UserCreatable is an inteface and >by definition all interfaces are abstract. > Sorry for the late reply, I was on vacation. oh...indeed, add '.abstract = true' for an interface is not a good idea.
>Were you trying to fix some particular real bug here ? If so, we almost >certainly need a different fix to what's suggested here, because QOM >should automatically treat all interfaces as abstract by their very >nature. > For other interfaces, say 'acpi-device-interface' or 'ipmi-interface', it's fine as they are not user creatable. but for 'user-creatable', when performing 'qemu-system-x86_64 -object user-creatable,id=foo', segfault happens: $ qemu-system-x86_64 -object user-creatable,id=foo ** ERROR:/work/armbru/qemu/qom/object.c:361:object_initialize_with_type: assertion failed (type->instance_size >= sizeof(Object)): (0 >= 40) Aborted (core dumped) How about the following changes to skip TYPE_USER_CREATABLE in function user_creatable_add_type ? @@ -102,7 +102,8 @@ Object *user_creatable_add_type(const char *type, const char *id, return NULL; } - if (!object_class_dynamic_cast(klass, TYPE_USER_CREATABLE)) { + if (!object_class_dynamic_cast(klass, TYPE_USER_CREATABLE) || + !strcmp(type, TYPE_USER_CREATABLE)) { error_setg(errp, "object type '%s' isn't supported by object-add", type); return NULL; ... @@ -229,7 +230,8 @@ int user_creatable_help_func(void *opaque, QemuOpts *opts, Error **errp) list = list->next) { const char *name; name = object_class_get_name(OBJECT_CLASS(list->data)); - printf("%s\n", name); + if (strcmp(name, TYPE_USER_CREATABLE)) + printf("%s\n", name); ... Thanks, Lin