hw: apply accel compat properties without touching globals
Instead of registering compat properties as globals, let's keep them in their own array, to avoid mixing with user globals. Introduce object_apply_global_props() function, to apply compatibility properties from a GPtrArray. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Acked-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
		@@ -119,18 +119,6 @@ void configure_accelerator(MachineState *ms)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void accel_register_compat_props(AccelState *accel)
 | 
			
		||||
{
 | 
			
		||||
    AccelClass *class = ACCEL_GET_CLASS(accel);
 | 
			
		||||
    GlobalProperty *prop = class->global_props;
 | 
			
		||||
 | 
			
		||||
    for (; prop && prop->driver; prop++) {
 | 
			
		||||
        /* Any compat_props must never cause error */
 | 
			
		||||
        prop->errp = &error_abort;
 | 
			
		||||
        qdev_prop_register_global(prop);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void accel_setup_post(MachineState *ms)
 | 
			
		||||
{
 | 
			
		||||
    AccelState *accel = ms->accelerator;
 | 
			
		||||
 
 | 
			
		||||
@@ -972,6 +972,15 @@ static void device_initfn(Object *obj)
 | 
			
		||||
 | 
			
		||||
static void device_post_init(Object *obj)
 | 
			
		||||
{
 | 
			
		||||
    if (object_dynamic_cast(qdev_get_machine(), TYPE_MACHINE)) {
 | 
			
		||||
        MachineState *m = MACHINE(qdev_get_machine());
 | 
			
		||||
        AccelClass *ac = ACCEL_GET_CLASS(m->accelerator);
 | 
			
		||||
 | 
			
		||||
        if (ac->compat_props) {
 | 
			
		||||
            object_apply_global_props(obj, ac->compat_props, &error_abort);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    qdev_prop_set_globals(DEVICE(obj));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -174,18 +174,21 @@ static GlobalProperty xen_compat_props[] = {
 | 
			
		||||
        .driver = "migration",
 | 
			
		||||
        .property = "send-section-footer",
 | 
			
		||||
        .value = "off",
 | 
			
		||||
    },
 | 
			
		||||
    { /* end of list */ },
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void xen_accel_class_init(ObjectClass *oc, void *data)
 | 
			
		||||
{
 | 
			
		||||
    AccelClass *ac = ACCEL_CLASS(oc);
 | 
			
		||||
 | 
			
		||||
    ac->name = "Xen";
 | 
			
		||||
    ac->init_machine = xen_init;
 | 
			
		||||
    ac->setup_post = xen_setup_post;
 | 
			
		||||
    ac->allowed = &xen_allowed;
 | 
			
		||||
    ac->global_props = xen_compat_props;
 | 
			
		||||
    ac->compat_props = g_ptr_array_new();
 | 
			
		||||
 | 
			
		||||
    compat_props_add(ac->compat_props,
 | 
			
		||||
                     xen_compat_props, G_N_ELEMENTS(xen_compat_props));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
 | 
			
		||||
 
 | 
			
		||||
@@ -267,6 +267,16 @@ typedef struct GlobalProperty {
 | 
			
		||||
    Error **errp;
 | 
			
		||||
} GlobalProperty;
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
compat_props_add(GPtrArray *arr,
 | 
			
		||||
                 GlobalProperty props[], size_t nelem)
 | 
			
		||||
{
 | 
			
		||||
    int i;
 | 
			
		||||
    for (i = 0; i < nelem; i++) {
 | 
			
		||||
        g_ptr_array_add(arr, (void *)&props[i]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*** Board API.  This should go away once we have a machine config file.  ***/
 | 
			
		||||
 | 
			
		||||
DeviceState *qdev_create(BusState *bus, const char *name);
 | 
			
		||||
 
 | 
			
		||||
@@ -675,6 +675,9 @@ Object *object_new_with_propv(const char *typename,
 | 
			
		||||
                              Error **errp,
 | 
			
		||||
                              va_list vargs);
 | 
			
		||||
 | 
			
		||||
void object_apply_global_props(Object *obj, const GPtrArray *props,
 | 
			
		||||
                               Error **errp);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * object_set_props:
 | 
			
		||||
 * @obj: the object instance to set properties on
 | 
			
		||||
 
 | 
			
		||||
@@ -49,7 +49,7 @@ typedef struct AccelClass {
 | 
			
		||||
     * global properties may be overridden by machine-type
 | 
			
		||||
     * compat_props or user-provided global properties.
 | 
			
		||||
     */
 | 
			
		||||
    GlobalProperty *global_props;
 | 
			
		||||
    GPtrArray *compat_props;
 | 
			
		||||
} AccelClass;
 | 
			
		||||
 | 
			
		||||
#define TYPE_ACCEL "accel"
 | 
			
		||||
@@ -67,8 +67,6 @@ typedef struct AccelClass {
 | 
			
		||||
extern unsigned long tcg_tb_size;
 | 
			
		||||
 | 
			
		||||
void configure_accelerator(MachineState *ms);
 | 
			
		||||
/* Register accelerator specific global properties */
 | 
			
		||||
void accel_register_compat_props(AccelState *accel);
 | 
			
		||||
/* Called just before os_setup_post (ie just before drop OS privs) */
 | 
			
		||||
void accel_setup_post(MachineState *ms);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								qom/object.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								qom/object.c
									
									
									
									
									
								
							@@ -370,6 +370,31 @@ static void object_post_init_with_type(Object *obj, TypeImpl *ti)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void object_apply_global_props(Object *obj, const GPtrArray *props, Error **errp)
 | 
			
		||||
{
 | 
			
		||||
    Error *err = NULL;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    if (!props) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < props->len; i++) {
 | 
			
		||||
        GlobalProperty *p = g_ptr_array_index(props, i);
 | 
			
		||||
 | 
			
		||||
        if (object_dynamic_cast(obj, p->driver) == NULL) {
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
        p->used = true;
 | 
			
		||||
        object_property_parse(obj, p->value, p->property, &err);
 | 
			
		||||
        if (err != NULL) {
 | 
			
		||||
            error_prepend(&err, "can't apply global %s.%s=%s: ",
 | 
			
		||||
                          p->driver, p->property, p->value);
 | 
			
		||||
            error_propagate(errp, err);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
 | 
			
		||||
{
 | 
			
		||||
    Object *obj = data;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user