User:Paolo Bonzini/Machine init sequence: Difference between revisions
(58 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== | == Tasks == | ||
# Convert -machine, -object, -accel from QemuOpts to keyval [Paolo] | |||
# Deprecate x-exit-preconfig, replacing it with cont/finish-machine-init/loadvm/migrate_incoming [Paolo] | |||
# Replace -qtest with "-object qtest,chardev=...,log=..." [Paolo] | |||
# Replace -m, -smp, -boot, -semihosting-config, -rtc with machine properties | |||
# Add machine-set and accel-set commands | |||
Independent pieces: | |||
* QAPIfy -display, add "-display add". | |||
* Make more commands available in preconfig (e.g. object-add, netdev-add, blockdev-add) | |||
== Basic phases == | |||
;PHASE_NO_MACHINE: | |||
:* Only backends can be created | |||
:* No machines have compat props that affect the backends, so that's good | |||
:QMP configuration flow starts here. machine-set command moves to the next step | |||
* | |||
;PHASE_MACHINE_CREATED: | |||
:* Backends can be connected to on-board devices (how?) | |||
:set-numa-options available here | |||
:accel-set (can only be invoked again if it fails) moves to the next step | |||
* | |||
* | ;PHASE_ACCEL_CREATED: | ||
:* vl.c sets up memory here, but that's not required | |||
:* migration_object_init() can be called | |||
:* plugins can be loaded | |||
* | :CLI configuration flow starts here (preconfig enters the monitor here; w/o preconfig, x-exit-preconfig is invoked immediately) | ||
:accel-set actually goes directly from PHASE_MACHINE_CREATED to the next step | |||
;PHASE_MACHINE_INITIALIZED: | |||
:* Devices can be created (including by x-exit-preconfig) | |||
:finish-machine-init, cont, migrate_incoming, x-exit-preconfig move to the next step | |||
* | |||
* | ;PHASE_MACHINE_READY | ||
* | :* everything after qdev_machine_creation_done() | ||
* | |||
* | |||
=== | == QMP configuration flow == | ||
* | === Existing commands === | ||
** | *Backend creation: netdev-add, object-add, blockdev-add, ... | ||
* | *Device creation: device-add | ||
* | *set-action (replaces -action and indirectly -watchdog-action, -no-reboot, -no-shutdown) | ||
* | === New commands === | ||
* | *machine-set (covers -M but also -smp, -boot, -m, -semihosting-config, -acpitable, -smbios, -fw_cfg, -option-rom, -rtc, maybe -cpu) | ||
=== | *accel-set (-accel) | ||
* | *something to replace -incoming defer?? | ||
** | === Non-QemuOpts options === | ||
* | * -k (should have replacement property in -display curses / -display vnc / -object input-barrier) | ||
* | * -uuid (should be added to -machine) | ||
* | * -qtest, -qtest-log (replaced by -object qtest) | ||
** | === Other command line options without QMP equivalent === | ||
* | Move to "missing commands" as you see fit or remark on whether it's not needed in the QMP configuration flow: | ||
*-display | |||
*-fsdev | |||
*-global | |||
*-icount (tcg accelerator options?) | |||
* -iscsi (obsoleted by -blockdev?) | |||
*-mon (just use stdio) | |||
*-msg | |||
* -overcommit | |||
*-plugin (plugin-add?) | |||
*-replay | |||
*-tpmdev | |||
== | == 6.0 cleaned up sequence == | ||
=== Early option parsing === | === Early option parsing === | ||
* Runstate is | * Runstate is RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE | ||
* | * qemu_process_sugar_options: -mem-prealloc, -watchdog | ||
* | * qemu_process_early_options: -pidfile, -sandbox, -name, -add-fd, -trace, -L, -incoming defer | ||
* qemu_process_help_options | |||
* qemu_maybe_daemonize | |||
=== Early initialization === | === Early initialization === | ||
* qemu_init_main_loop() | * qemu_init_main_loop() | ||
* cpu_timers_init() | * cpu_timers_init() | ||
=== | === Early command-line processing, machine creation === | ||
* Options: - | * Options: -global, -rtc, replay_configure | ||
* | * qemu_create_machine | ||
* | ** set_memory_options + current_machine is created (these two could be moved after early backend creation?) | ||
* | ** Set machine compat props | ||
** | * Handle default devices (qemu_disable_default_devices, qemu_create_default_devices) | ||
* Handle default devices | * Create default network | ||
* Create early backends | |||
* Create default network | |||
* Create backends | |||
** Create displays | ** Create displays | ||
** Create early objects | ** Create early objects | ||
Line 88: | Line 88: | ||
** Create fsdevs | ** Create fsdevs | ||
** Create audiodevs | ** Create audiodevs | ||
* | * qemu_apply_machine_options | ||
** -boot, smp, -semihosting-config | |||
** set current_migration->send_configuration as in migration_object_init | |||
=== | === Accelerator creation === | ||
* Accelerators created and properties set | * Accelerators created and properties set | ||
* | * migration_object_init() | ||
** blk_mig_init, ram_mig_init, dirty_bitmap_mig_init | |||
=== Late creation === | === Late creation === | ||
* net_init_clients | * Create late backends | ||
* Create late objects | ** qtest (needs chardev) | ||
* Create monitors | ** net_init_clients | ||
* Create backends for -serial/-parallel/-debugcon | ** Create late objects | ||
** Create monitors | |||
** Create backends for -serial/-parallel/-debugcon/semihosting | |||
* Determine ram_size | * Determine ram_size | ||
** qemu_resolve_machine_memdev() | |||
** parse_numa_opts() -> set_numa_options() | ** parse_numa_opts() -> set_numa_options() | ||
* | * Monitor entered here if preconfig, otherwise qemu_init invokes qmp_x_exit_preconfig | ||
=== | === Leaving preconfig === | ||
* CHECKPOINT_INIT | * CHECKPOINT_INIT | ||
* Options: -plugin (requires -smp, but must be before CPUs are created) | * Options: -plugin (requires -smp, but must be before CPUs are created) | ||
Line 118: | Line 116: | ||
** Requires accelerator to be initialized | ** Requires accelerator to be initialized | ||
* Devices cannot be realized before this point (buses don't exist) | * Devices cannot be realized before this point (buses don't exist) | ||
* | * cont/migrate_incoming/loadvm complete initialization of the machine | ||
** everything starting with cpu_synchronize_all_post_init | |||
** |
Latest revision as of 14:38, 7 October 2021
Tasks
- Convert -machine, -object, -accel from QemuOpts to keyval [Paolo]
- Deprecate x-exit-preconfig, replacing it with cont/finish-machine-init/loadvm/migrate_incoming [Paolo]
- Replace -qtest with "-object qtest,chardev=...,log=..." [Paolo]
- Replace -m, -smp, -boot, -semihosting-config, -rtc with machine properties
- Add machine-set and accel-set commands
Independent pieces:
- QAPIfy -display, add "-display add".
- Make more commands available in preconfig (e.g. object-add, netdev-add, blockdev-add)
Basic phases
- PHASE_NO_MACHINE
-
- Only backends can be created
- No machines have compat props that affect the backends, so that's good
- QMP configuration flow starts here. machine-set command moves to the next step
- PHASE_MACHINE_CREATED
-
- Backends can be connected to on-board devices (how?)
- set-numa-options available here
- accel-set (can only be invoked again if it fails) moves to the next step
- PHASE_ACCEL_CREATED
-
- vl.c sets up memory here, but that's not required
- migration_object_init() can be called
- plugins can be loaded
- CLI configuration flow starts here (preconfig enters the monitor here; w/o preconfig, x-exit-preconfig is invoked immediately)
- accel-set actually goes directly from PHASE_MACHINE_CREATED to the next step
- PHASE_MACHINE_INITIALIZED
-
- Devices can be created (including by x-exit-preconfig)
- finish-machine-init, cont, migrate_incoming, x-exit-preconfig move to the next step
- PHASE_MACHINE_READY
-
- everything after qdev_machine_creation_done()
QMP configuration flow
Existing commands
- Backend creation: netdev-add, object-add, blockdev-add, ...
- Device creation: device-add
- set-action (replaces -action and indirectly -watchdog-action, -no-reboot, -no-shutdown)
New commands
- machine-set (covers -M but also -smp, -boot, -m, -semihosting-config, -acpitable, -smbios, -fw_cfg, -option-rom, -rtc, maybe -cpu)
- accel-set (-accel)
- something to replace -incoming defer??
Non-QemuOpts options
- -k (should have replacement property in -display curses / -display vnc / -object input-barrier)
- -uuid (should be added to -machine)
- -qtest, -qtest-log (replaced by -object qtest)
Other command line options without QMP equivalent
Move to "missing commands" as you see fit or remark on whether it's not needed in the QMP configuration flow:
- -display
- -fsdev
- -global
- -icount (tcg accelerator options?)
- -iscsi (obsoleted by -blockdev?)
- -mon (just use stdio)
- -msg
- -overcommit
- -plugin (plugin-add?)
- -replay
- -tpmdev
6.0 cleaned up sequence
Early option parsing
- Runstate is RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE
- qemu_process_sugar_options: -mem-prealloc, -watchdog
- qemu_process_early_options: -pidfile, -sandbox, -name, -add-fd, -trace, -L, -incoming defer
- qemu_process_help_options
- qemu_maybe_daemonize
Early initialization
- qemu_init_main_loop()
- cpu_timers_init()
Early command-line processing, machine creation
- Options: -global, -rtc, replay_configure
- qemu_create_machine
- set_memory_options + current_machine is created (these two could be moved after early backend creation?)
- Set machine compat props
- Handle default devices (qemu_disable_default_devices, qemu_create_default_devices)
- Create default network
- Create early backends
- Create displays
- Create early objects
- Options: -spice
- Create chardevs
- Create fsdevs
- Create audiodevs
- qemu_apply_machine_options
- -boot, smp, -semihosting-config
- set current_migration->send_configuration as in migration_object_init
Accelerator creation
- Accelerators created and properties set
- migration_object_init()
- blk_mig_init, ram_mig_init, dirty_bitmap_mig_init
Late creation
- Create late backends
- qtest (needs chardev)
- net_init_clients
- Create late objects
- Create monitors
- Create backends for -serial/-parallel/-debugcon/semihosting
- Determine ram_size
- qemu_resolve_machine_memdev()
- parse_numa_opts() -> set_numa_options()
- Monitor entered here if preconfig, otherwise qemu_init invokes qmp_x_exit_preconfig
Leaving preconfig
- CHECKPOINT_INIT
- Options: -plugin (requires -smp, but must be before CPUs are created)
- machine_run_board_init(current_machine)
- On-board devices are created
- Requires accelerator to be initialized
- Devices cannot be realized before this point (buses don't exist)
- cont/migrate_incoming/loadvm complete initialization of the machine
- everything starting with cpu_synchronize_all_post_init