Skip to content

Commit

Permalink
qdev: Display warning about unused -global
Browse files Browse the repository at this point in the history
This can help a user understand why -global was ignored.

For example: with "-vga cirrus"; "-global vga.vgamem_mb=16" is just
ignored when "-global cirrus-vga.vgamem_mb=16" is not.

This is currently clear when the wrong property is provided:

out/x86_64-softmmu/qemu-system-x86_64 -global cirrus-vga.vram_size_mb=16 -monitor pty -vga cirrus
char device redirected to /dev/pts/20 (label compat_monitor0)
qemu-system-x86_64: Property '.vram_size_mb' not found
Aborted (core dumped)

vs

out/x86_64-softmmu/qemu-system-x86_64 -global vga.vram_size_mb=16 -monitor pty -vga cirrus
char device redirected to /dev/pts/20 (label compat_monitor0)
VNC server running on `::1:5900'
^Cqemu: terminating on signal 2

Signed-off-by: Don Slutz <dslutz@verizon.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
  • Loading branch information
Don Slutz authored and mstsirkin committed Jun 5, 2014
1 parent eb386aa commit 9f9260a
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 0 deletions.
16 changes: 16 additions & 0 deletions hw/core/qdev-properties-system.c
Expand Up @@ -439,11 +439,27 @@ PropertyInfo qdev_prop_iothread = {
static int qdev_add_one_global(QemuOpts *opts, void *opaque)
{
GlobalProperty *g;
ObjectClass *oc;

g = g_malloc0(sizeof(*g));
g->driver = qemu_opt_get(opts, "driver");
g->property = qemu_opt_get(opts, "property");
g->value = qemu_opt_get(opts, "value");
oc = object_class_by_name(g->driver);
if (oc) {
DeviceClass *dc = DEVICE_CLASS(oc);

if (dc->hotpluggable) {
/* If hotpluggable then skip not_used checking. */
g->not_used = false;
} else {
/* Maybe a typo. */
g->not_used = true;
}
} else {
/* Maybe a typo. */
g->not_used = true;
}
qdev_prop_register_global(g);
return 0;
}
Expand Down
18 changes: 18 additions & 0 deletions hw/core/qdev-properties.c
Expand Up @@ -955,6 +955,23 @@ void qdev_prop_register_global_list(GlobalProperty *props)
}
}

int qdev_prop_check_global(void)
{
GlobalProperty *prop;
int ret = 0;

QTAILQ_FOREACH(prop, &global_props, next) {
if (!prop->not_used) {
continue;
}
ret = 1;
error_report("Warning: \"-global %s.%s=%s\" not used",
prop->driver, prop->property, prop->value);

}
return ret;
}

void qdev_prop_set_globals_for_type(DeviceState *dev, const char *typename,
Error **errp)
{
Expand All @@ -966,6 +983,7 @@ void qdev_prop_set_globals_for_type(DeviceState *dev, const char *typename,
if (strcmp(typename, prop->driver) != 0) {
continue;
}
prop->not_used = false;
object_property_parse(OBJECT(dev), prop->value, prop->property, &err);
if (err != NULL) {
error_propagate(errp, err);
Expand Down
8 changes: 8 additions & 0 deletions include/hw/qdev-core.h
Expand Up @@ -231,10 +231,18 @@ struct PropertyInfo {
ObjectPropertyRelease *release;
};

/**
* GlobalProperty:
* @not_used: Track use of a global property. Defaults to false in all C99
* struct initializations.
*
* This prevents reports of .compat_props when they are not used.
*/
typedef struct GlobalProperty {
const char *driver;
const char *property;
const char *value;
bool not_used;
QTAILQ_ENTRY(GlobalProperty) next;
} GlobalProperty;

Expand Down
1 change: 1 addition & 0 deletions include/hw/qdev-properties.h
Expand Up @@ -180,6 +180,7 @@ void qdev_prop_set_ptr(DeviceState *dev, const char *name, void *value);

void qdev_prop_register_global(GlobalProperty *prop);
void qdev_prop_register_global_list(GlobalProperty *props);
int qdev_prop_check_global(void);
void qdev_prop_set_globals(DeviceState *dev, Error **errp);
void qdev_prop_set_globals_for_type(DeviceState *dev, const char *typename,
Error **errp);
Expand Down
2 changes: 2 additions & 0 deletions vl.c
Expand Up @@ -4532,6 +4532,8 @@ int main(int argc, char **argv, char **envp)
}
}

qdev_prop_check_global();

if (incoming) {
Error *local_err = NULL;
qemu_start_incoming_migration(incoming, &local_err);
Expand Down

0 comments on commit 9f9260a

Please sign in to comment.