qom: Create system containers explicitly

Always explicitly create QEMU system containers upfront.

Root containers will be created when trying to fetch the root object the
1st time.  They are:

  /objects
  /chardevs
  /backend

Machine sub-containers will be created only until machine is being
initialized.  They are:

  /machine/unattached
  /machine/peripheral
  /machine/peripheral-anon

Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20241121192202.4155849-8-peterx@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
Peter Xu 2024-11-21 14:21:56 -05:00 committed by Philippe Mathieu-Daudé
parent 7c03a17c8d
commit 5cfd38a2e7
3 changed files with 39 additions and 4 deletions

View file

@ -1229,9 +1229,6 @@ static void machine_initfn(Object *obj)
MachineState *ms = MACHINE(obj); MachineState *ms = MACHINE(obj);
MachineClass *mc = MACHINE_GET_CLASS(obj); MachineClass *mc = MACHINE_GET_CLASS(obj);
container_get(obj, "/peripheral");
container_get(obj, "/peripheral-anon");
ms->dump_guest_core = true; ms->dump_guest_core = true;
ms->mem_merge = (QEMU_MADV_MERGEABLE != QEMU_MADV_INVALID); ms->mem_merge = (QEMU_MADV_MERGEABLE != QEMU_MADV_INVALID);
ms->enable_graphics = true; ms->enable_graphics = true;

View file

@ -1729,12 +1729,34 @@ const char *object_property_get_type(Object *obj, const char *name, Error **errp
return prop->type; return prop->type;
} }
static const char *const root_containers[] = {
"chardevs",
"objects",
"backend"
};
static Object *object_root_initialize(void)
{
Object *root = object_new(TYPE_CONTAINER);
int i;
/*
* Create all QEMU system containers. "machine" and its sub-containers
* are only created when machine initializes (qemu_create_machine()).
*/
for (i = 0; i < ARRAY_SIZE(root_containers); i++) {
object_property_add_new_container(root, root_containers[i]);
}
return root;
}
Object *object_get_root(void) Object *object_get_root(void)
{ {
static Object *root; static Object *root;
if (!root) { if (!root) {
root = object_new(TYPE_CONTAINER); root = object_root_initialize();
} }
return root; return root;

View file

@ -2113,6 +2113,21 @@ static void parse_memory_options(void)
loc_pop(&loc); loc_pop(&loc);
} }
static const char *const machine_containers[] = {
"unattached",
"peripheral",
"peripheral-anon"
};
static void qemu_create_machine_containers(Object *machine)
{
int i;
for (i = 0; i < ARRAY_SIZE(machine_containers); i++) {
object_property_add_new_container(machine, machine_containers[i]);
}
}
static void qemu_create_machine(QDict *qdict) static void qemu_create_machine(QDict *qdict)
{ {
MachineClass *machine_class = select_machine(qdict, &error_fatal); MachineClass *machine_class = select_machine(qdict, &error_fatal);
@ -2121,6 +2136,7 @@ static void qemu_create_machine(QDict *qdict)
current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class))); current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));
object_property_add_child(object_get_root(), "machine", object_property_add_child(object_get_root(), "machine",
OBJECT(current_machine)); OBJECT(current_machine));
qemu_create_machine_containers(OBJECT(current_machine));
object_property_add_child(container_get(OBJECT(current_machine), object_property_add_child(container_get(OBJECT(current_machine),
"/unattached"), "/unattached"),
"sysbus", OBJECT(sysbus_get_default())); "sysbus", OBJECT(sysbus_get_default()));