User:Paolo Bonzini/Machine init sequence: Difference between revisions

From QEMU
Line 24: Line 24:
:* everything after qdev_machine_creation_done()
:* everything after qdev_machine_creation_done()


== Missing commands ==
== New commands ==
*machine-set (covers -smp, -boot, -m, -semihosting-config, maybe -cpu)
Ccan be added to QEMU already:
*accel-set
*display-add (incl. -vnc, -spice)
*display-add
== New commands (specific to QMP configuration flow) ==
*qtest server needs to be QOMified
*machine-set (covers -M but also -smp, -boot, -m, -semihosting-config, maybe -cpu)
*accel-set (-accel)
== Non-QemuOpts options ==
* -k (should have replacement property in -display curses / -display vnc)
* -uuid (should be added to -machine)
* -watchdog-action, -no-reboot, -no-shutdown (should be QemuOpts-ified as -action)
== Other 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:
*-acpitable
*-fsdev
*-fw_cfg
*-global
*-icount
* -iscsi (obsoleted by -blockdev?)
*-mon
* -option-rom
* -overcommit/-realtime
*-plugin (plugin-add?)
*-qtest (QOMify?)
*-rtc
*-replay
*-smbios
*-tpmdev


== Current machine init sequence ==
== Current machine init sequence ==

Revision as of 11:06, 28 October 2020

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()

New commands

Ccan be added to QEMU already:

  • display-add (incl. -vnc, -spice)

New commands (specific to QMP configuration flow)

  • machine-set (covers -M but also -smp, -boot, -m, -semihosting-config, maybe -cpu)
  • accel-set (-accel)

Non-QemuOpts options

  • -k (should have replacement property in -display curses / -display vnc)
  • -uuid (should be added to -machine)
  • -watchdog-action, -no-reboot, -no-shutdown (should be QemuOpts-ified as -action)

Other 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:

  • -acpitable
  • -fsdev
  • -fw_cfg
  • -global
  • -icount
  • -iscsi (obsoleted by -blockdev?)
  • -mon
  • -option-rom
  • -overcommit/-realtime
  • -plugin (plugin-add?)
  • -qtest (QOMify?)
  • -rtc
  • -replay
  • -smbios
  • -tpmdev

Current machine init sequence

Up to CHECKPOINT_INIT

  • Runstate is RUN_STATE_PRECONFIG or RUN_STATE_INMIGRATE
  • Get machine_class
  • Set machine compat props
  • set_memory_options
  • Options: -global
  • replay_configure
  • Options: -rtc
  • Option: -pidfile
  • qemu_init_main_loop
  • Options: -sandbox, -name, -add-fd
  • current_machine is created
  • Options: -trace, -L
  • Options: -smp
  • Options: -mem-prealloc (requires current_machine->smp.cpus, but could look at -smp cpus directly)
  • Options: -plugin (requires -smp)
  • Handle default devices
    • Default device check (needs machine_class)
    • A bunch of checks for -daemonize
    • Add default devices to device_configs
  • Create backends
    • Create displays
    • Create early objects
    • Options: -spice
    • Create chardevs
    • Create fsdevs
    • Create audiodevs
  • Machine properties set
  • Accelerators created and properties set
  • migration_object_init
    • Wants current_machine->enforce_config_section, but that part can be done later though
  • Initialize qtest server (QOMify)
  • Parse bootorder and -machine kernel_filename/initrd_filename/kernel_cmdline
  • cpu_timers_init() (can be done earlier)
  • Create default network (move with other device_configs operations)
  • net_init_clients
  • Create late objects
  • blk_mig_init, ram_mig_init, dirty_bitmap_mig_init (move to migration_object_init())
  • Create monitors (why so late?)
  • Create backends for -serial/-parallel/-debugcon
  • get_default_vga_model, select_vgahw, select_watchdog

After CHECKPOINT_INIT

  • qdev_machine_init()
    • Only creates /machine/peripheral and /machine/peripheral-anon
  • Determine ram_size
  • parse_numa_opts() -> set_numa_options()
  • Preconfig monitor
    • set_numa_options (same as -numa but more powerful)

RUN_STATE_PRELAUNCH

  • 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)
  • Start VM
    • loadvm or incoming migration
    • Otherwise, vm_start()

First attempt at cleaned up sequence

Early option parsing

  • Runstate is RUN_STATE_PRELAUNCH or RUN_STATE_INMIGRATE
  • Desugaring: -mem-prealloc, -watchdog
  • Options: -pidfile, -sandbox, -name, -add-fd, -trace, -L, -incoming defer
  • replay_configure

Early initialization

  • qemu_init_main_loop()
  • cpu_timers_init()

Command-line processing part one

  • Options: -global, -rtc
  • Get machine_class
  • Set machine compat props
  • Handle default devices
    • Default device check (needs machine_class but not MS)
    • A bunch of checks for -daemonize
    • Add default devices to device_configs
  • Create default network
  • Create backends
    • Create displays
    • Create early objects
    • Options: -spice
    • Create chardevs
    • Create fsdevs
    • Create audiodevs
  • Initialize qtest server

Machine creation

  • set_memory_options
  • current_machine is created
    • qdev_machine_init()
  • Options: -smp
  • Machine properties set
    • set current_migration->send_configuration as in migration_object_init

Accelerator creation

  • Accelerators created and properties set
  • Parse bootorder and -machine kernel_filename/initrd_filename/kernel_cmdline
  • migration_object_init()
    • blk_mig_init, ram_mig_init, dirty_bitmap_mig_init

Late creation

  • Options: -boot
  • net_init_clients
  • Create late objects
  • Create monitors
  • Create backends for -serial/-parallel/-debugcon
  • get_default_vga_model, select_vgahw, select_watchdog
  • Determine ram_size
    • parse_numa_opts() -> set_numa_options()

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