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:
parent
e59dbbac03
commit
ea9ce8934c
@ -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)
|
void accel_setup_post(MachineState *ms)
|
||||||
{
|
{
|
||||||
AccelState *accel = ms->accelerator;
|
AccelState *accel = ms->accelerator;
|
||||||
|
@ -972,6 +972,15 @@ static void device_initfn(Object *obj)
|
|||||||
|
|
||||||
static void device_post_init(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));
|
qdev_prop_set_globals(DEVICE(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,18 +174,21 @@ static GlobalProperty xen_compat_props[] = {
|
|||||||
.driver = "migration",
|
.driver = "migration",
|
||||||
.property = "send-section-footer",
|
.property = "send-section-footer",
|
||||||
.value = "off",
|
.value = "off",
|
||||||
},
|
}
|
||||||
{ /* end of list */ },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void xen_accel_class_init(ObjectClass *oc, void *data)
|
static void xen_accel_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
AccelClass *ac = ACCEL_CLASS(oc);
|
AccelClass *ac = ACCEL_CLASS(oc);
|
||||||
|
|
||||||
ac->name = "Xen";
|
ac->name = "Xen";
|
||||||
ac->init_machine = xen_init;
|
ac->init_machine = xen_init;
|
||||||
ac->setup_post = xen_setup_post;
|
ac->setup_post = xen_setup_post;
|
||||||
ac->allowed = &xen_allowed;
|
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")
|
#define TYPE_XEN_ACCEL ACCEL_CLASS_NAME("xen")
|
||||||
|
@ -267,6 +267,16 @@ typedef struct GlobalProperty {
|
|||||||
Error **errp;
|
Error **errp;
|
||||||
} GlobalProperty;
|
} 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. ***/
|
/*** Board API. This should go away once we have a machine config file. ***/
|
||||||
|
|
||||||
DeviceState *qdev_create(BusState *bus, const char *name);
|
DeviceState *qdev_create(BusState *bus, const char *name);
|
||||||
|
@ -675,6 +675,9 @@ Object *object_new_with_propv(const char *typename,
|
|||||||
Error **errp,
|
Error **errp,
|
||||||
va_list vargs);
|
va_list vargs);
|
||||||
|
|
||||||
|
void object_apply_global_props(Object *obj, const GPtrArray *props,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* object_set_props:
|
* object_set_props:
|
||||||
* @obj: the object instance to set properties on
|
* @obj: the object instance to set properties on
|
||||||
|
@ -49,7 +49,7 @@ typedef struct AccelClass {
|
|||||||
* global properties may be overridden by machine-type
|
* global properties may be overridden by machine-type
|
||||||
* compat_props or user-provided global properties.
|
* compat_props or user-provided global properties.
|
||||||
*/
|
*/
|
||||||
GlobalProperty *global_props;
|
GPtrArray *compat_props;
|
||||||
} AccelClass;
|
} AccelClass;
|
||||||
|
|
||||||
#define TYPE_ACCEL "accel"
|
#define TYPE_ACCEL "accel"
|
||||||
@ -67,8 +67,6 @@ typedef struct AccelClass {
|
|||||||
extern unsigned long tcg_tb_size;
|
extern unsigned long tcg_tb_size;
|
||||||
|
|
||||||
void configure_accelerator(MachineState *ms);
|
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) */
|
/* Called just before os_setup_post (ie just before drop OS privs) */
|
||||||
void accel_setup_post(MachineState *ms);
|
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)
|
static void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
|
||||||
{
|
{
|
||||||
Object *obj = data;
|
Object *obj = data;
|
||||||
|
1
vl.c
1
vl.c
@ -2996,7 +2996,6 @@ static void user_register_global_props(void)
|
|||||||
*/
|
*/
|
||||||
static void register_global_properties(MachineState *ms)
|
static void register_global_properties(MachineState *ms)
|
||||||
{
|
{
|
||||||
accel_register_compat_props(ms->accelerator);
|
|
||||||
machine_register_compat_props(ms);
|
machine_register_compat_props(ms);
|
||||||
user_register_global_props();
|
user_register_global_props();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user