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:
Marc-André Lureau 2018-11-26 22:04:32 +04:00
parent e59dbbac03
commit ea9ce8934c
8 changed files with 54 additions and 19 deletions

View File

@ -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;

View File

@ -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));
}

View File

@ -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")

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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;

1
vl.c
View File

@ -2996,7 +2996,6 @@ static void user_register_global_props(void)
*/
static void register_global_properties(MachineState *ms)
{
accel_register_compat_props(ms->accelerator);
machine_register_compat_props(ms);
user_register_global_props();
}