qom: Allow optional sugar props

Global properties have an @optional field, which allows to apply a given
property to a given type even if one of its subclasses doesn't support
it. This is especially used in the compat code when dealing with the
"disable-modern" and "disable-legacy" properties and the "virtio-pci"
type.

Allow object_register_sugar_prop() to set this field as well.

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <159738953558.377274.16617742952571083440.stgit@bahia.lan>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
This commit is contained in:
Greg Kurz 2020-08-14 09:24:50 +02:00 committed by David Gibson
parent 5b19cb63d9
commit a8dc82ce82
4 changed files with 18 additions and 9 deletions

View File

@ -638,7 +638,8 @@ bool object_apply_global_props(Object *obj, const GPtrArray *props,
Error **errp); Error **errp);
void object_set_machine_compat_props(GPtrArray *compat_props); void object_set_machine_compat_props(GPtrArray *compat_props);
void object_set_accelerator_compat_props(GPtrArray *compat_props); void object_set_accelerator_compat_props(GPtrArray *compat_props);
void object_register_sugar_prop(const char *driver, const char *prop, const char *value); void object_register_sugar_prop(const char *driver, const char *prop,
const char *value, bool optional);
void object_apply_compat_props(Object *obj); void object_apply_compat_props(Object *obj);
/** /**

View File

@ -442,7 +442,8 @@ static GPtrArray *object_compat_props[3];
* other than "-global". These are generally used for syntactic * other than "-global". These are generally used for syntactic
* sugar and legacy command line options. * sugar and legacy command line options.
*/ */
void object_register_sugar_prop(const char *driver, const char *prop, const char *value) void object_register_sugar_prop(const char *driver, const char *prop,
const char *value, bool optional)
{ {
GlobalProperty *g; GlobalProperty *g;
if (!object_compat_props[2]) { if (!object_compat_props[2]) {
@ -452,6 +453,7 @@ void object_register_sugar_prop(const char *driver, const char *prop, const char
g->driver = g_strdup(driver); g->driver = g_strdup(driver);
g->property = g_strdup(prop); g->property = g_strdup(prop);
g->value = g_strdup(value); g->value = g_strdup(value);
g->optional = optional;
g_ptr_array_add(object_compat_props[2], g); g_ptr_array_add(object_compat_props[2], g);
} }

View File

@ -179,7 +179,8 @@ void configure_rtc(QemuOpts *opts)
if (!strcmp(value, "slew")) { if (!strcmp(value, "slew")) {
object_register_sugar_prop("mc146818rtc", object_register_sugar_prop("mc146818rtc",
"lost_tick_policy", "lost_tick_policy",
"slew"); "slew",
false);
} else if (!strcmp(value, "none")) { } else if (!strcmp(value, "none")) {
/* discard is default */ /* discard is default */
} else { } else {

View File

@ -1663,16 +1663,20 @@ static int machine_set_property(void *opaque,
return 0; return 0;
} }
if (g_str_equal(qom_name, "igd-passthru")) { if (g_str_equal(qom_name, "igd-passthru")) {
object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), qom_name, value); object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), qom_name, value,
false);
return 0; return 0;
} }
if (g_str_equal(qom_name, "kvm-shadow-mem")) { if (g_str_equal(qom_name, "kvm-shadow-mem")) {
object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), qom_name, value); object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), qom_name, value,
false);
return 0; return 0;
} }
if (g_str_equal(qom_name, "kernel-irqchip")) { if (g_str_equal(qom_name, "kernel-irqchip")) {
object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), qom_name, value); object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), qom_name, value,
object_register_sugar_prop(ACCEL_CLASS_NAME("whpx"), qom_name, value); false);
object_register_sugar_prop(ACCEL_CLASS_NAME("whpx"), qom_name, value,
false);
return 0; return 0;
} }
@ -2298,9 +2302,10 @@ static void qemu_process_sugar_options(void)
val = g_strdup_printf("%d", val = g_strdup_printf("%d",
(uint32_t) qemu_opt_get_number(qemu_find_opts_singleton("smp-opts"), "cpus", 1)); (uint32_t) qemu_opt_get_number(qemu_find_opts_singleton("smp-opts"), "cpus", 1));
object_register_sugar_prop("memory-backend", "prealloc-threads", val); object_register_sugar_prop("memory-backend", "prealloc-threads", val,
false);
g_free(val); g_free(val);
object_register_sugar_prop("memory-backend", "prealloc", "on"); object_register_sugar_prop("memory-backend", "prealloc", "on", false);
} }
if (watchdog) { if (watchdog) {