monitor: fix qmp/hmp query-memdev not reporting IDs of memory backends
Considering 'id' is mandatory for user_creatable objects/backends and user_creatable_add_type() always has it as an argument regardless of where from it is called CLI/monitor or QMP, Fix issue by adding 'id' property to hostmem backends and set it in user_creatable_add_type() for every object that implements 'id' property. Then later at query-memdev time get 'id' from object directly. Signed-off-by: Igor Mammedov <imammedo@redhat.com> Message-Id: <1484052795-158195-4-git-send-email-imammedo@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
		
							parent
							
								
									3a4641054e
								
							
						
					
					
						commit
						e1ff3c67e8
					
				| 
						 | 
				
			
			@ -348,6 +348,24 @@ host_memory_backend_can_be_deleted(UserCreatable *uc, Error **errp)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char *get_id(Object *o, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    HostMemoryBackend *backend = MEMORY_BACKEND(o);
 | 
			
		||||
 | 
			
		||||
    return g_strdup(backend->id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void set_id(Object *o, const char *str, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    HostMemoryBackend *backend = MEMORY_BACKEND(o);
 | 
			
		||||
 | 
			
		||||
    if (backend->id) {
 | 
			
		||||
        error_setg(errp, "cannot change property value");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    backend->id = g_strdup(str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
host_memory_backend_class_init(ObjectClass *oc, void *data)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -377,6 +395,13 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
 | 
			
		|||
        HostMemPolicy_lookup,
 | 
			
		||||
        host_memory_backend_get_policy,
 | 
			
		||||
        host_memory_backend_set_policy, &error_abort);
 | 
			
		||||
    object_class_property_add_str(oc, "id", get_id, set_id, &error_abort);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void host_memory_backend_finalize(Object *o)
 | 
			
		||||
{
 | 
			
		||||
    HostMemoryBackend *backend = MEMORY_BACKEND(o);
 | 
			
		||||
    g_free(backend->id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const TypeInfo host_memory_backend_info = {
 | 
			
		||||
| 
						 | 
				
			
			@ -387,6 +412,7 @@ static const TypeInfo host_memory_backend_info = {
 | 
			
		|||
    .class_init = host_memory_backend_class_init,
 | 
			
		||||
    .instance_size = sizeof(HostMemoryBackend),
 | 
			
		||||
    .instance_init = host_memory_backend_init,
 | 
			
		||||
    .instance_finalize = host_memory_backend_finalize,
 | 
			
		||||
    .interfaces = (InterfaceInfo[]) {
 | 
			
		||||
        { TYPE_USER_CREATABLE },
 | 
			
		||||
        { }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3529,6 +3529,7 @@ Example (1):
 | 
			
		|||
         "policy": "bind"
 | 
			
		||||
       },
 | 
			
		||||
       {
 | 
			
		||||
         "id": "mem1",
 | 
			
		||||
         "size": 536870912,
 | 
			
		||||
         "merge": false,
 | 
			
		||||
         "dump": true,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								hmp.c
								
								
								
								
							
							
						
						
									
										5
									
								
								hmp.c
								
								
								
								
							| 
						 | 
				
			
			@ -2078,13 +2078,11 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
 | 
			
		|||
    MemdevList *m = memdev_list;
 | 
			
		||||
    Visitor *v;
 | 
			
		||||
    char *str;
 | 
			
		||||
    int i = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    while (m) {
 | 
			
		||||
        v = string_output_visitor_new(false, &str);
 | 
			
		||||
        visit_type_uint16List(v, NULL, &m->value->host_nodes, NULL);
 | 
			
		||||
        monitor_printf(mon, "memory backend: %d\n", i);
 | 
			
		||||
        monitor_printf(mon, "memory backend: %s\n", m->value->id);
 | 
			
		||||
        monitor_printf(mon, "  size:  %" PRId64 "\n", m->value->size);
 | 
			
		||||
        monitor_printf(mon, "  merge: %s\n",
 | 
			
		||||
                       m->value->merge ? "true" : "false");
 | 
			
		||||
| 
						 | 
				
			
			@ -2100,7 +2098,6 @@ void hmp_info_memdev(Monitor *mon, const QDict *qdict)
 | 
			
		|||
        g_free(str);
 | 
			
		||||
        visit_free(v);
 | 
			
		||||
        m = m->next;
 | 
			
		||||
        i++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    monitor_printf(mon, "\n");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,6 +52,7 @@ struct HostMemoryBackend {
 | 
			
		|||
    Object parent;
 | 
			
		||||
 | 
			
		||||
    /* protected */
 | 
			
		||||
    char *id;
 | 
			
		||||
    uint64_t size;
 | 
			
		||||
    bool merge, dump;
 | 
			
		||||
    bool prealloc, force_prealloc, is_mapped;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								numa.c
								
								
								
								
							
							
						
						
									
										3
									
								
								numa.c
								
								
								
								
							| 
						 | 
				
			
			@ -518,6 +518,9 @@ static int query_memdev(Object *obj, void *opaque)
 | 
			
		|||
 | 
			
		||||
        m->value = g_malloc0(sizeof(*m->value));
 | 
			
		||||
 | 
			
		||||
        m->value->id = object_property_get_str(obj, "id", NULL);
 | 
			
		||||
        m->value->has_id = !!m->value->id;
 | 
			
		||||
 | 
			
		||||
        m->value->size = object_property_get_int(obj, "size",
 | 
			
		||||
                                                 &error_abort);
 | 
			
		||||
        m->value->merge = object_property_get_bool(obj, "merge",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4457,6 +4457,8 @@
 | 
			
		|||
#
 | 
			
		||||
# Information about memory backend
 | 
			
		||||
#
 | 
			
		||||
# @id: #optional backend's ID if backend has 'id' property (since 2.9)
 | 
			
		||||
#
 | 
			
		||||
# @size: memory backend size
 | 
			
		||||
#
 | 
			
		||||
# @merge: enables or disables memory merge support
 | 
			
		||||
| 
						 | 
				
			
			@ -4473,6 +4475,7 @@
 | 
			
		|||
##
 | 
			
		||||
{ 'struct': 'Memdev',
 | 
			
		||||
  'data': {
 | 
			
		||||
    '*id':        'str',
 | 
			
		||||
    'size':       'size',
 | 
			
		||||
    'merge':      'bool',
 | 
			
		||||
    'dump':       'bool',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,6 +62,12 @@ Object *user_creatable_add_type(const char *type, const char *id,
 | 
			
		|||
 | 
			
		||||
    assert(qdict);
 | 
			
		||||
    obj = object_new(type);
 | 
			
		||||
    if (object_property_find(obj, "id", NULL)) {
 | 
			
		||||
        object_property_set_str(obj, id, "id", &local_err);
 | 
			
		||||
        if (local_err) {
 | 
			
		||||
            goto out;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    visit_start_struct(v, NULL, NULL, 0, &local_err);
 | 
			
		||||
    if (local_err) {
 | 
			
		||||
        goto out;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue