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) | ||||
| { | ||||
|     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; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Marc-André Lureau
						Marc-André Lureau