All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH qemu v3 0/2] qmp: Add qom-list-properties to list QOM object properties
@ 2018-03-01 13:09 Alexey Kardashevskiy
  2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo Alexey Kardashevskiy
  2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 2/2] qmp: Add qom-list-properties to list QOM object properties Alexey Kardashevskiy
  0 siblings, 2 replies; 9+ messages in thread
From: Alexey Kardashevskiy @ 2018-03-01 13:09 UTC (permalink / raw)
  To: qemu-devel
  Cc: Alexey Kardashevskiy, Paolo Bonzini, David Gibson, Eric Blake,
	Markus Armbruster, Andrea Bolognani

This adds a new QMP command to list any class/object properties,
not just devices.

Now comes in 2 patches.

Please comment. Thanks.



Alexey Kardashevskiy (2):
  qmp: Merge ObjectPropertyInfo and DevicePropertyInfo
  qmp: Add qom-list-properties to list QOM object properties

 qapi-schema.json     | 38 +++++++++++++++--------------
 include/qom/object.h | 16 ++++++++++++
 qdev-monitor.c       |  6 ++---
 qmp.c                | 69 ++++++++++++++++++++++++++++++++++++++++++++--------
 qom/object.c         |  7 ++++++
 5 files changed, 105 insertions(+), 31 deletions(-)

-- 
2.11.0

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo
  2018-03-01 13:09 [Qemu-devel] [PATCH qemu v3 0/2] qmp: Add qom-list-properties to list QOM object properties Alexey Kardashevskiy
@ 2018-03-01 13:09 ` Alexey Kardashevskiy
  2018-03-02  1:00   ` David Gibson
  2018-03-02 13:37   ` Eric Blake
  2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 2/2] qmp: Add qom-list-properties to list QOM object properties Alexey Kardashevskiy
  1 sibling, 2 replies; 9+ messages in thread
From: Alexey Kardashevskiy @ 2018-03-01 13:09 UTC (permalink / raw)
  To: qemu-devel
  Cc: Alexey Kardashevskiy, Paolo Bonzini, David Gibson, Eric Blake,
	Markus Armbruster, Andrea Bolognani

ObjectPropertyInfo is more generic and only missing @description.
This adds a description to ObjectPropertyInfo and removes
DevicePropertyInfo so the resulting ObjectPropertyInfo can be used
elsewhere.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 qapi-schema.json | 23 +++++------------------
 qdev-monitor.c   |  6 +++---
 qmp.c            | 20 ++++++++++----------
 3 files changed, 18 insertions(+), 31 deletions(-)

diff --git a/qapi-schema.json b/qapi-schema.json
index 0262b9f..87327e5 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -1266,10 +1266,12 @@
 #        3) A link type in the form 'link<subtype>' where subtype is a qdev
 #           device type name.  Link properties form the device model graph.
 #
+# @description: if specified, the description of the property.
+#
 # Since: 1.2
 ##
 { 'struct': 'ObjectPropertyInfo',
-  'data': { 'name': 'str', 'type': 'str' } }
+  'data': { 'name': 'str', 'type': 'str', '*description': 'str' } }
 
 ##
 # @qom-list:
@@ -1425,34 +1427,19 @@
   'returns': [ 'ObjectTypeInfo' ] }
 
 ##
-# @DevicePropertyInfo:
-#
-# Information about device properties.
-#
-# @name: the name of the property
-# @type: the typename of the property
-# @description: if specified, the description of the property.
-#               (since 2.2)
-#
-# Since: 1.2
-##
-{ 'struct': 'DevicePropertyInfo',
-  'data': { 'name': 'str', 'type': 'str', '*description': 'str' } }
-
-##
 # @device-list-properties:
 #
 # List properties associated with a device.
 #
 # @typename: the type name of a device
 #
-# Returns: a list of DevicePropertyInfo describing a devices properties
+# Returns: a list of ObjectPropertyInfo describing a devices properties
 #
 # Since: 1.2
 ##
 { 'command': 'device-list-properties',
   'data': { 'typename': 'str'},
-  'returns': [ 'DevicePropertyInfo' ] }
+  'returns': [ 'ObjectPropertyInfo' ] }
 
 ##
 # @xen-set-global-dirty-log:
diff --git a/qdev-monitor.c b/qdev-monitor.c
index 8462381..ab9c46c 100644
--- a/qdev-monitor.c
+++ b/qdev-monitor.c
@@ -258,8 +258,8 @@ int qdev_device_help(QemuOpts *opts)
 {
     Error *local_err = NULL;
     const char *driver;
-    DevicePropertyInfoList *prop_list;
-    DevicePropertyInfoList *prop;
+    ObjectPropertyInfoList *prop_list;
+    ObjectPropertyInfoList *prop;
 
     driver = qemu_opt_get(opts, "driver");
     if (driver && is_help_option(driver)) {
@@ -295,7 +295,7 @@ int qdev_device_help(QemuOpts *opts)
         }
     }
 
-    qapi_free_DevicePropertyInfoList(prop_list);
+    qapi_free_ObjectPropertyInfoList(prop_list);
     return 1;
 
 error:
diff --git a/qmp.c b/qmp.c
index 793f6f3..8a74038 100644
--- a/qmp.c
+++ b/qmp.c
@@ -463,12 +463,12 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
  *
  * The caller must free the return value.
  */
-static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
-                                                     const char *name,
-                                                     const char *default_type,
-                                                     const char *description)
+static ObjectPropertyInfo *make_device_property_info(ObjectClass *klass,
+                                                  const char *name,
+                                                  const char *default_type,
+                                                  const char *description)
 {
-    DevicePropertyInfo *info;
+    ObjectPropertyInfo *info;
     Property *prop;
 
     do {
@@ -508,14 +508,14 @@ static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
     return info;
 }
 
-DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
-                                                   Error **errp)
+ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
+                                                Error **errp)
 {
     ObjectClass *klass;
     Object *obj;
     ObjectProperty *prop;
     ObjectPropertyIterator iter;
-    DevicePropertyInfoList *prop_list = NULL;
+    ObjectPropertyInfoList *prop_list = NULL;
 
     klass = object_class_by_name(typename);
     if (klass == NULL) {
@@ -540,8 +540,8 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
 
     object_property_iter_init(&iter, obj);
     while ((prop = object_property_iter_next(&iter))) {
-        DevicePropertyInfo *info;
-        DevicePropertyInfoList *entry;
+        ObjectPropertyInfo *info;
+        ObjectPropertyInfoList *entry;
 
         /* Skip Object and DeviceState properties */
         if (strcmp(prop->name, "type") == 0 ||
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [Qemu-devel] [PATCH qemu v3 2/2] qmp: Add qom-list-properties to list QOM object properties
  2018-03-01 13:09 [Qemu-devel] [PATCH qemu v3 0/2] qmp: Add qom-list-properties to list QOM object properties Alexey Kardashevskiy
  2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo Alexey Kardashevskiy
@ 2018-03-01 13:09 ` Alexey Kardashevskiy
  2018-03-02  2:05   ` David Gibson
  1 sibling, 1 reply; 9+ messages in thread
From: Alexey Kardashevskiy @ 2018-03-01 13:09 UTC (permalink / raw)
  To: qemu-devel
  Cc: Alexey Kardashevskiy, Paolo Bonzini, David Gibson, Eric Blake,
	Markus Armbruster, Andrea Bolognani

There is already 'device-list-properties' which does most of the job,
however it does not handle everything returned by qom-list-types such
as machines as they inherit directly from TYPE_OBJECT and not TYPE_DEVICE.
It does not handle abstract classes either.

This adds a new qom-list-properties command which prints properties
of a specific class and its instance. It is pretty much a simplified copy
of the device-list-properties handler.

Since it creates an object instance, device properties should appear
in the output as they are copied to QOM properties at the instance_init
hook.

This adds a object_class_property_iter_init() helper to allow class
properties enumeration uses it in the new QMP command to allow properties
listing for abstract classes.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
Changes:
v3:
* Used ObjectPropertyInfo instead of QOMPropertyInfo

v2:
* added abstract classes support, now things like "pci-device" or
"spapr-machine" show properties, previously these would produce
an "abstract class" error

# Conflicts:
#	qapi-schema.json
---
 qapi-schema.json     | 15 +++++++++++++++
 include/qom/object.h | 16 ++++++++++++++++
 qmp.c                | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 qom/object.c         |  7 +++++++
 4 files changed, 87 insertions(+)

diff --git a/qapi-schema.json b/qapi-schema.json
index 87327e5..32e836f 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -1442,6 +1442,21 @@
   'returns': [ 'ObjectPropertyInfo' ] }
 
 ##
+# @qom-list-properties:
+#
+# List properties associated with a QOM object.
+#
+# @typename: the type name of an object
+#
+# Returns: a list of ObjectPropertyInfo describing object properties
+#
+# Since: 2.12
+##
+{ 'command': 'qom-list-properties',
+  'data': { 'typename': 'str'},
+  'returns': [ 'ObjectPropertyInfo' ] }
+
+##
 # @xen-set-global-dirty-log:
 #
 # Enable or disable the global dirty log mode.
diff --git a/include/qom/object.h b/include/qom/object.h
index dc73d59..ef07d78 100644
--- a/include/qom/object.h
+++ b/include/qom/object.h
@@ -1017,6 +1017,22 @@ void object_property_iter_init(ObjectPropertyIterator *iter,
                                Object *obj);
 
 /**
+ * object_class_property_iter_init:
+ * @klass: the class
+ *
+ * Initializes an iterator for traversing all properties
+ * registered against an object class and all parent classes.
+ *
+ * It is forbidden to modify the property list while iterating,
+ * whether removing or adding properties.
+ *
+ * This can be used on abstract classes as it does not create a temporary
+ * instance.
+ */
+void object_class_property_iter_init(ObjectPropertyIterator *iter,
+                                     ObjectClass *klass);
+
+/**
  * object_property_iter_next:
  * @iter: the iterator instance
  *
diff --git a/qmp.c b/qmp.c
index 8a74038..1f15f68 100644
--- a/qmp.c
+++ b/qmp.c
@@ -576,6 +576,55 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
     return prop_list;
 }
 
+ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
+                                             Error **errp)
+{
+    ObjectClass *klass;
+    Object *obj = NULL;
+    ObjectProperty *prop;
+    ObjectPropertyIterator iter;
+    ObjectPropertyInfoList *prop_list = NULL;
+
+    klass = object_class_by_name(typename);
+    if (klass == NULL) {
+        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
+                  "Class '%s' not found", typename);
+        return NULL;
+    }
+
+    klass = object_class_dynamic_cast(klass, TYPE_OBJECT);
+    if (klass == NULL) {
+        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename", TYPE_OBJECT);
+        return NULL;
+    }
+
+    if (object_class_is_abstract(klass)) {
+        object_class_property_iter_init(&iter, klass);
+    } else {
+        obj = object_new(typename);
+        object_property_iter_init(&iter, obj);
+    }
+    while ((prop = object_property_iter_next(&iter))) {
+        ObjectPropertyInfo *info;
+        ObjectPropertyInfoList *entry;
+
+        info = g_malloc0(sizeof(*info));
+        info->name = g_strdup(prop->name);
+        info->type = g_strdup(prop->type);
+        info->has_description = !!prop->description;
+        info->description = g_strdup(prop->description);
+
+        entry = g_malloc0(sizeof(*entry));
+        entry->value = info;
+        entry->next = prop_list;
+        prop_list = entry;
+    }
+
+    object_unref(obj);
+
+    return prop_list;
+}
+
 CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
 {
     return arch_query_cpu_definitions(errp);
diff --git a/qom/object.c b/qom/object.c
index 5dcee46..e7978bd 100644
--- a/qom/object.c
+++ b/qom/object.c
@@ -1037,6 +1037,13 @@ ObjectProperty *object_property_iter_next(ObjectPropertyIterator *iter)
     return val;
 }
 
+void object_class_property_iter_init(ObjectPropertyIterator *iter,
+                                     ObjectClass *klass)
+{
+    g_hash_table_iter_init(&iter->iter, klass->properties);
+    iter->nextclass = klass;
+}
+
 ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
                                            Error **errp)
 {
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo
  2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo Alexey Kardashevskiy
@ 2018-03-02  1:00   ` David Gibson
  2018-03-02 13:37   ` Eric Blake
  1 sibling, 0 replies; 9+ messages in thread
From: David Gibson @ 2018-03-02  1:00 UTC (permalink / raw)
  To: Alexey Kardashevskiy
  Cc: qemu-devel, Paolo Bonzini, Eric Blake, Markus Armbruster,
	Andrea Bolognani

[-- Attachment #1: Type: text/plain, Size: 5371 bytes --]

On Fri, Mar 02, 2018 at 12:09:38AM +1100, Alexey Kardashevskiy wrote:
> ObjectPropertyInfo is more generic and only missing @description.
> This adds a description to ObjectPropertyInfo and removes
> DevicePropertyInfo so the resulting ObjectPropertyInfo can be used
> elsewhere.
> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>

Reviewed-by: David Gibson <david@gibson.dropbear.id.au>

> ---
>  qapi-schema.json | 23 +++++------------------
>  qdev-monitor.c   |  6 +++---
>  qmp.c            | 20 ++++++++++----------
>  3 files changed, 18 insertions(+), 31 deletions(-)
> 
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 0262b9f..87327e5 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -1266,10 +1266,12 @@
>  #        3) A link type in the form 'link<subtype>' where subtype is a qdev
>  #           device type name.  Link properties form the device model graph.
>  #
> +# @description: if specified, the description of the property.
> +#
>  # Since: 1.2
>  ##
>  { 'struct': 'ObjectPropertyInfo',
> -  'data': { 'name': 'str', 'type': 'str' } }
> +  'data': { 'name': 'str', 'type': 'str', '*description': 'str' } }
>  
>  ##
>  # @qom-list:
> @@ -1425,34 +1427,19 @@
>    'returns': [ 'ObjectTypeInfo' ] }
>  
>  ##
> -# @DevicePropertyInfo:
> -#
> -# Information about device properties.
> -#
> -# @name: the name of the property
> -# @type: the typename of the property
> -# @description: if specified, the description of the property.
> -#               (since 2.2)
> -#
> -# Since: 1.2
> -##
> -{ 'struct': 'DevicePropertyInfo',
> -  'data': { 'name': 'str', 'type': 'str', '*description': 'str' } }
> -
> -##
>  # @device-list-properties:
>  #
>  # List properties associated with a device.
>  #
>  # @typename: the type name of a device
>  #
> -# Returns: a list of DevicePropertyInfo describing a devices properties
> +# Returns: a list of ObjectPropertyInfo describing a devices properties
>  #
>  # Since: 1.2
>  ##
>  { 'command': 'device-list-properties',
>    'data': { 'typename': 'str'},
> -  'returns': [ 'DevicePropertyInfo' ] }
> +  'returns': [ 'ObjectPropertyInfo' ] }
>  
>  ##
>  # @xen-set-global-dirty-log:
> diff --git a/qdev-monitor.c b/qdev-monitor.c
> index 8462381..ab9c46c 100644
> --- a/qdev-monitor.c
> +++ b/qdev-monitor.c
> @@ -258,8 +258,8 @@ int qdev_device_help(QemuOpts *opts)
>  {
>      Error *local_err = NULL;
>      const char *driver;
> -    DevicePropertyInfoList *prop_list;
> -    DevicePropertyInfoList *prop;
> +    ObjectPropertyInfoList *prop_list;
> +    ObjectPropertyInfoList *prop;
>  
>      driver = qemu_opt_get(opts, "driver");
>      if (driver && is_help_option(driver)) {
> @@ -295,7 +295,7 @@ int qdev_device_help(QemuOpts *opts)
>          }
>      }
>  
> -    qapi_free_DevicePropertyInfoList(prop_list);
> +    qapi_free_ObjectPropertyInfoList(prop_list);
>      return 1;
>  
>  error:
> diff --git a/qmp.c b/qmp.c
> index 793f6f3..8a74038 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -463,12 +463,12 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
>   *
>   * The caller must free the return value.
>   */
> -static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
> -                                                     const char *name,
> -                                                     const char *default_type,
> -                                                     const char *description)
> +static ObjectPropertyInfo *make_device_property_info(ObjectClass *klass,
> +                                                  const char *name,
> +                                                  const char *default_type,
> +                                                  const char *description)
>  {
> -    DevicePropertyInfo *info;
> +    ObjectPropertyInfo *info;
>      Property *prop;
>  
>      do {
> @@ -508,14 +508,14 @@ static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
>      return info;
>  }
>  
> -DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
> -                                                   Error **errp)
> +ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
> +                                                Error **errp)
>  {
>      ObjectClass *klass;
>      Object *obj;
>      ObjectProperty *prop;
>      ObjectPropertyIterator iter;
> -    DevicePropertyInfoList *prop_list = NULL;
> +    ObjectPropertyInfoList *prop_list = NULL;
>  
>      klass = object_class_by_name(typename);
>      if (klass == NULL) {
> @@ -540,8 +540,8 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
>  
>      object_property_iter_init(&iter, obj);
>      while ((prop = object_property_iter_next(&iter))) {
> -        DevicePropertyInfo *info;
> -        DevicePropertyInfoList *entry;
> +        ObjectPropertyInfo *info;
> +        ObjectPropertyInfoList *entry;
>  
>          /* Skip Object and DeviceState properties */
>          if (strcmp(prop->name, "type") == 0 ||

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH qemu v3 2/2] qmp: Add qom-list-properties to list QOM object properties
  2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 2/2] qmp: Add qom-list-properties to list QOM object properties Alexey Kardashevskiy
@ 2018-03-02  2:05   ` David Gibson
  0 siblings, 0 replies; 9+ messages in thread
From: David Gibson @ 2018-03-02  2:05 UTC (permalink / raw)
  To: Alexey Kardashevskiy
  Cc: qemu-devel, Paolo Bonzini, Eric Blake, Markus Armbruster,
	Andrea Bolognani

[-- Attachment #1: Type: text/plain, Size: 6084 bytes --]

On Fri, Mar 02, 2018 at 12:09:39AM +1100, Alexey Kardashevskiy wrote:
> There is already 'device-list-properties' which does most of the job,
> however it does not handle everything returned by qom-list-types such
> as machines as they inherit directly from TYPE_OBJECT and not TYPE_DEVICE.
> It does not handle abstract classes either.
> 
> This adds a new qom-list-properties command which prints properties
> of a specific class and its instance. It is pretty much a simplified copy
> of the device-list-properties handler.
> 
> Since it creates an object instance, device properties should appear
> in the output as they are copied to QOM properties at the instance_init
> hook.
> 
> This adds a object_class_property_iter_init() helper to allow class
> properties enumeration uses it in the new QMP command to allow properties
> listing for abstract classes.
> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> ---
> Changes:
> v3:
> * Used ObjectPropertyInfo instead of QOMPropertyInfo
> 
> v2:
> * added abstract classes support, now things like "pci-device" or
> "spapr-machine" show properties, previously these would produce
> an "abstract class" error
> 
> # Conflicts:
> #	qapi-schema.json
> ---
>  qapi-schema.json     | 15 +++++++++++++++
>  include/qom/object.h | 16 ++++++++++++++++
>  qmp.c                | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
>  qom/object.c         |  7 +++++++
>  4 files changed, 87 insertions(+)
> 
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 87327e5..32e836f 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -1442,6 +1442,21 @@
>    'returns': [ 'ObjectPropertyInfo' ] }
>  
>  ##
> +# @qom-list-properties:
> +#
> +# List properties associated with a QOM object.
> +#
> +# @typename: the type name of an object
> +#
> +# Returns: a list of ObjectPropertyInfo describing object properties
> +#
> +# Since: 2.12
> +##
> +{ 'command': 'qom-list-properties',
> +  'data': { 'typename': 'str'},
> +  'returns': [ 'ObjectPropertyInfo' ] }
> +
> +##
>  # @xen-set-global-dirty-log:
>  #
>  # Enable or disable the global dirty log mode.
> diff --git a/include/qom/object.h b/include/qom/object.h
> index dc73d59..ef07d78 100644
> --- a/include/qom/object.h
> +++ b/include/qom/object.h
> @@ -1017,6 +1017,22 @@ void object_property_iter_init(ObjectPropertyIterator *iter,
>                                 Object *obj);
>  
>  /**
> + * object_class_property_iter_init:
> + * @klass: the class
> + *
> + * Initializes an iterator for traversing all properties
> + * registered against an object class and all parent classes.
> + *
> + * It is forbidden to modify the property list while iterating,
> + * whether removing or adding properties.
> + *
> + * This can be used on abstract classes as it does not create a temporary
> + * instance.
> + */
> +void object_class_property_iter_init(ObjectPropertyIterator *iter,
> +                                     ObjectClass *klass);
> +
> +/**
>   * object_property_iter_next:
>   * @iter: the iterator instance
>   *
> diff --git a/qmp.c b/qmp.c
> index 8a74038..1f15f68 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -576,6 +576,55 @@ ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
>      return prop_list;
>  }
>  
> +ObjectPropertyInfoList *qmp_qom_list_properties(const char *typename,
> +                                             Error **errp)
> +{
> +    ObjectClass *klass;
> +    Object *obj = NULL;
> +    ObjectProperty *prop;
> +    ObjectPropertyIterator iter;
> +    ObjectPropertyInfoList *prop_list = NULL;
> +
> +    klass = object_class_by_name(typename);
> +    if (klass == NULL) {
> +        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
> +                  "Class '%s' not found", typename);
> +        return NULL;
> +    }
> +
> +    klass = object_class_dynamic_cast(klass, TYPE_OBJECT);
> +    if (klass == NULL) {
> +        error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "typename", TYPE_OBJECT);
> +        return NULL;
> +    }
> +
> +    if (object_class_is_abstract(klass)) {
> +        object_class_property_iter_init(&iter, klass);

I remain a bit concerned about the subtle difference in behaviour
between abstract and non-abstract classes.

> +    } else {
> +        obj = object_new(typename);
> +        object_property_iter_init(&iter, obj);
> +    }
> +    while ((prop = object_property_iter_next(&iter))) {
> +        ObjectPropertyInfo *info;
> +        ObjectPropertyInfoList *entry;
> +
> +        info = g_malloc0(sizeof(*info));
> +        info->name = g_strdup(prop->name);
> +        info->type = g_strdup(prop->type);
> +        info->has_description = !!prop->description;
> +        info->description = g_strdup(prop->description);
> +
> +        entry = g_malloc0(sizeof(*entry));
> +        entry->value = info;
> +        entry->next = prop_list;
> +        prop_list = entry;
> +    }
> +
> +    object_unref(obj);
> +
> +    return prop_list;
> +}
> +
>  CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
>  {
>      return arch_query_cpu_definitions(errp);
> diff --git a/qom/object.c b/qom/object.c
> index 5dcee46..e7978bd 100644
> --- a/qom/object.c
> +++ b/qom/object.c
> @@ -1037,6 +1037,13 @@ ObjectProperty *object_property_iter_next(ObjectPropertyIterator *iter)
>      return val;
>  }
>  
> +void object_class_property_iter_init(ObjectPropertyIterator *iter,
> +                                     ObjectClass *klass)
> +{
> +    g_hash_table_iter_init(&iter->iter, klass->properties);
> +    iter->nextclass = klass;
> +}
> +
>  ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name,
>                                             Error **errp)
>  {

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo
  2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo Alexey Kardashevskiy
  2018-03-02  1:00   ` David Gibson
@ 2018-03-02 13:37   ` Eric Blake
  2018-03-02 13:42     ` Paolo Bonzini
  2018-03-03  0:16     ` Alexey Kardashevskiy
  1 sibling, 2 replies; 9+ messages in thread
From: Eric Blake @ 2018-03-02 13:37 UTC (permalink / raw)
  To: Alexey Kardashevskiy, qemu-devel
  Cc: Paolo Bonzini, David Gibson, Markus Armbruster, Andrea Bolognani

On 03/01/2018 07:09 AM, Alexey Kardashevskiy wrote:
> ObjectPropertyInfo is more generic and only missing @description.
> This adds a description to ObjectPropertyInfo and removes
> DevicePropertyInfo so the resulting ObjectPropertyInfo can be used
> elsewhere.
> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
> ---
>   qapi-schema.json | 23 +++++------------------
>   qdev-monitor.c   |  6 +++---
>   qmp.c            | 20 ++++++++++----------
>   3 files changed, 18 insertions(+), 31 deletions(-)
> 
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 0262b9f..87327e5 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -1266,10 +1266,12 @@
>   #        3) A link type in the form 'link<subtype>' where subtype is a qdev
>   #           device type name.  Link properties form the device model graph.
>   #
> +# @description: if specified, the description of the property.

Missing a '(since 2.12)' tag.

> +#
>   # Since: 1.2
>   ##
>   { 'struct': 'ObjectPropertyInfo',
> -  'data': { 'name': 'str', 'type': 'str' } }
> +  'data': { 'name': 'str', 'type': 'str', '*description': 'str' } }
>   
> +++ b/qmp.c
> @@ -463,12 +463,12 @@ ObjectTypeInfoList *qmp_qom_list_types(bool has_implements,
>    *
>    * The caller must free the return value.
>    */
> -static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
> -                                                     const char *name,
> -                                                     const char *default_type,
> -                                                     const char *description)
> +static ObjectPropertyInfo *make_device_property_info(ObjectClass *klass,
> +                                                  const char *name,
> +                                                  const char *default_type,
> +                                                  const char *description)

Why the indentation change?

> @@ -508,14 +508,14 @@ static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
>       return info;
>   }
>   
> -DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
> -                                                   Error **errp)
> +ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
> +                                                Error **errp)

and again

Otherwise looks okay

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo
  2018-03-02 13:37   ` Eric Blake
@ 2018-03-02 13:42     ` Paolo Bonzini
  2018-03-02 14:10       ` Eric Blake
  2018-03-03  0:16     ` Alexey Kardashevskiy
  1 sibling, 1 reply; 9+ messages in thread
From: Paolo Bonzini @ 2018-03-02 13:42 UTC (permalink / raw)
  To: Eric Blake, Alexey Kardashevskiy, qemu-devel
  Cc: David Gibson, Markus Armbruster, Andrea Bolognani

On 02/03/2018 14:37, Eric Blake wrote:
>>
>> index 0262b9f..87327e5 100644
>> --- a/qapi-schema.json
>> +++ b/qapi-schema.json
>> @@ -1266,10 +1266,12 @@
>>   #        3) A link type in the form 'link<subtype>' where subtype is
>> a qdev
>>   #           device type name.  Link properties form the device model
>> graph.
>>   #
>> +# @description: if specified, the description of the property.
> 
> Missing a '(since 2.12)' tag.

Some of the users had it (in other types that are now unified) before
2.12.  I'm not sure whether it is more accurate to have the annotation
or not, especially considering that it is optional.  Protocol-wise it is
never an issue to add optional fields, since you cannot distinguish an
implementation that lacks the field from one that never fills it.

Paolo

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo
  2018-03-02 13:42     ` Paolo Bonzini
@ 2018-03-02 14:10       ` Eric Blake
  0 siblings, 0 replies; 9+ messages in thread
From: Eric Blake @ 2018-03-02 14:10 UTC (permalink / raw)
  To: Paolo Bonzini, Alexey Kardashevskiy, qemu-devel
  Cc: David Gibson, Markus Armbruster, Andrea Bolognani

On 03/02/2018 07:42 AM, Paolo Bonzini wrote:
> On 02/03/2018 14:37, Eric Blake wrote:
>>>
>>> index 0262b9f..87327e5 100644
>>> --- a/qapi-schema.json
>>> +++ b/qapi-schema.json
>>> @@ -1266,10 +1266,12 @@
>>>    #        3) A link type in the form 'link<subtype>' where subtype is
>>> a qdev
>>>    #           device type name.  Link properties form the device model
>>> graph.
>>>    #
>>> +# @description: if specified, the description of the property.
>>
>> Missing a '(since 2.12)' tag.
> 
> Some of the users had it (in other types that are now unified) before
> 2.12.  I'm not sure whether it is more accurate to have the annotation
> or not, especially considering that it is optional.  Protocol-wise it is
> never an issue to add optional fields, since you cannot distinguish an
> implementation that lacks the field from one that never fills it.

True; you could write it as '(since 2.2)', as that is the earliest 
version that provided the optional field between the structs that you 
are merging.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo
  2018-03-02 13:37   ` Eric Blake
  2018-03-02 13:42     ` Paolo Bonzini
@ 2018-03-03  0:16     ` Alexey Kardashevskiy
  1 sibling, 0 replies; 9+ messages in thread
From: Alexey Kardashevskiy @ 2018-03-03  0:16 UTC (permalink / raw)
  To: Eric Blake, qemu-devel
  Cc: Paolo Bonzini, David Gibson, Markus Armbruster, Andrea Bolognani

On 03/03/18 00:37, Eric Blake wrote:
> On 03/01/2018 07:09 AM, Alexey Kardashevskiy wrote:
>> ObjectPropertyInfo is more generic and only missing @description.
>> This adds a description to ObjectPropertyInfo and removes
>> DevicePropertyInfo so the resulting ObjectPropertyInfo can be used
>> elsewhere.
>>
>> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
>> ---
>>   qapi-schema.json | 23 +++++------------------
>>   qdev-monitor.c   |  6 +++---
>>   qmp.c            | 20 ++++++++++----------
>>   3 files changed, 18 insertions(+), 31 deletions(-)
>>
>> diff --git a/qapi-schema.json b/qapi-schema.json
>> index 0262b9f..87327e5 100644
>> --- a/qapi-schema.json
>> +++ b/qapi-schema.json
>> @@ -1266,10 +1266,12 @@
>>   #        3) A link type in the form 'link<subtype>' where subtype is a
>> qdev
>>   #           device type name.  Link properties form the device model
>> graph.
>>   #
>> +# @description: if specified, the description of the property.
> 
> Missing a '(since 2.12)' tag.
> 
>> +#
>>   # Since: 1.2
>>   ##
>>   { 'struct': 'ObjectPropertyInfo',
>> -  'data': { 'name': 'str', 'type': 'str' } }
>> +  'data': { 'name': 'str', 'type': 'str', '*description': 'str' } }
>>   +++ b/qmp.c
>> @@ -463,12 +463,12 @@ ObjectTypeInfoList *qmp_qom_list_types(bool
>> has_implements,
>>    *
>>    * The caller must free the return value.
>>    */
>> -static DevicePropertyInfo *make_device_property_info(ObjectClass *klass,
>> -                                                     const char *name,
>> -                                                     const char
>> *default_type,
>> -                                                     const char
>> *description)
>> +static ObjObjectPropertyInfoectPropertyInfo *make_device_property_info(ObjectClass *klass,
>> +                                                  const char *name,
>> +                                                  const char *default_type,
>> +                                                  const char *description)
> 
> Why the indentation change?


Oh. Leftover from DevicePropertyInfo->(non-existng) OOMPropertyInfo. I'll
repost.


> 
>> @@ -508,14 +508,14 @@ static DevicePropertyInfo
>> *make_device_property_info(ObjectClass *klass,
>>       return info;
>>   }
>>   -DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
>> -                                                   Error **errp)
>> +ObjectPropertyInfoList *qmp_device_list_properties(const char *typename,
>> +                                                Error **errp)
> 
> and again
> 
> Otherwise looks okay
> 


-- 
Alexey

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2018-03-03  0:16 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-01 13:09 [Qemu-devel] [PATCH qemu v3 0/2] qmp: Add qom-list-properties to list QOM object properties Alexey Kardashevskiy
2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 1/2] qmp: Merge ObjectPropertyInfo and DevicePropertyInfo Alexey Kardashevskiy
2018-03-02  1:00   ` David Gibson
2018-03-02 13:37   ` Eric Blake
2018-03-02 13:42     ` Paolo Bonzini
2018-03-02 14:10       ` Eric Blake
2018-03-03  0:16     ` Alexey Kardashevskiy
2018-03-01 13:09 ` [Qemu-devel] [PATCH qemu v3 2/2] qmp: Add qom-list-properties to list QOM object properties Alexey Kardashevskiy
2018-03-02  2:05   ` David Gibson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.