User:Paolo Bonzini/Machine init sequence

From QEMU
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Tasks

  1. Convert -machine, -object, -accel from QemuOpts to keyval [Paolo]
  2. Deprecate x-exit-preconfig, replacing it with cont/finish-machine-init/loadvm/migrate_incoming [Paolo]
  3. Replace -qtest with "-object qtest,chardev=...,log=..." [Paolo]
  4. Replace -m, -smp, -boot, -semihosting-config, -rtc with machine properties
  5. 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