vl: extract qemu_init_subsystems

Group a bunch of subsystem initializations that can be done right
after command line parsing.  Remove initializations that can be done
simply as global variable initializers.

Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2020-10-21 05:33:40 -04:00
parent e0d17dfd22
commit efd7ab22fb
1 changed files with 43 additions and 51 deletions

View File

@ -128,7 +128,7 @@ bool enable_mlock = false;
bool enable_cpu_pm = false; bool enable_cpu_pm = false;
int nb_nics; int nb_nics;
NICInfo nd_table[MAX_NICS]; NICInfo nd_table[MAX_NICS];
int autostart; int autostart = 1;
static enum { static enum {
RTC_BASE_UTC, RTC_BASE_UTC,
RTC_BASE_LOCALTIME, RTC_BASE_LOCALTIME,
@ -1228,7 +1228,8 @@ struct VMChangeStateEntry {
int priority; int priority;
}; };
static QTAILQ_HEAD(, VMChangeStateEntry) vm_change_state_head; static QTAILQ_HEAD(, VMChangeStateEntry) vm_change_state_head =
QTAILQ_HEAD_INITIALIZER(vm_change_state_head);
/** /**
* qemu_add_vm_change_state_handler_prio: * qemu_add_vm_change_state_handler_prio:
@ -2968,11 +2969,44 @@ static void qemu_maybe_daemonize(const char *pid_file)
qemu_add_exit_notifier(&qemu_unlink_pidfile_notifier); qemu_add_exit_notifier(&qemu_unlink_pidfile_notifier);
} }
static void qemu_init_subsystems(void)
{
Error *err;
os_set_line_buffering();
module_call_init(MODULE_INIT_TRACE);
qemu_init_cpu_list();
qemu_init_cpu_loop();
qemu_mutex_lock_iothread();
atexit(qemu_run_exit_notifiers);
module_call_init(MODULE_INIT_QOM);
module_call_init(MODULE_INIT_MIGRATION);
runstate_init();
precopy_infrastructure_init();
postcopy_infrastructure_init();
monitor_init_globals();
if (qcrypto_init(&err) < 0) {
error_reportf_err(err, "cannot initialize crypto: ");
exit(1);
}
os_setup_early_signal_handling();
bdrv_init_with_whitelist();
socket_init();
}
void qemu_init(int argc, char **argv, char **envp) void qemu_init(int argc, char **argv, char **envp)
{ {
int i; int i;
int snapshot, linux_boot; int snapshot = 0;
int linux_boot;
const char *initrd_filename; const char *initrd_filename;
const char *kernel_filename, *kernel_cmdline; const char *kernel_filename, *kernel_cmdline;
const char *boot_order = NULL; const char *boot_order = NULL;
@ -2993,7 +3027,6 @@ void qemu_init(int argc, char **argv, char **envp)
ram_addr_t maxram_size; ram_addr_t maxram_size;
uint64_t ram_slots = 0; uint64_t ram_slots = 0;
FILE *vmstate_dump_file = NULL; FILE *vmstate_dump_file = NULL;
Error *main_loop_err = NULL;
Error *err = NULL; Error *err = NULL;
const char *mem_path = NULL; const char *mem_path = NULL;
bool have_custom_ram_size; bool have_custom_ram_size;
@ -3001,22 +3034,6 @@ void qemu_init(int argc, char **argv, char **envp)
QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list); QemuPluginList plugin_list = QTAILQ_HEAD_INITIALIZER(plugin_list);
int mem_prealloc = 0; /* force preallocation of physical target memory */ int mem_prealloc = 0; /* force preallocation of physical target memory */
os_set_line_buffering();
error_init(argv[0]);
module_call_init(MODULE_INIT_TRACE);
qemu_init_cpu_list();
qemu_init_cpu_loop();
qemu_mutex_lock_iothread();
atexit(qemu_run_exit_notifiers);
qemu_init_exec_dir(argv[0]);
module_call_init(MODULE_INIT_QOM);
module_call_init(MODULE_INIT_MIGRATION);
qemu_add_opts(&qemu_drive_opts); qemu_add_opts(&qemu_drive_opts);
qemu_add_drive_opts(&qemu_legacy_drive_opts); qemu_add_drive_opts(&qemu_legacy_drive_opts);
qemu_add_drive_opts(&qemu_common_drive_opts); qemu_add_drive_opts(&qemu_common_drive_opts);
@ -3051,27 +3068,10 @@ void qemu_init(int argc, char **argv, char **envp)
qemu_add_opts(&qemu_fw_cfg_opts); qemu_add_opts(&qemu_fw_cfg_opts);
module_call_init(MODULE_INIT_OPTS); module_call_init(MODULE_INIT_OPTS);
runstate_init(); error_init(argv[0]);
precopy_infrastructure_init(); qemu_init_exec_dir(argv[0]);
postcopy_infrastructure_init();
monitor_init_globals();
if (qcrypto_init(&err) < 0) { qemu_init_subsystems();
error_reportf_err(err, "cannot initialize crypto: ");
exit(1);
}
QTAILQ_INIT(&vm_change_state_head);
os_setup_early_signal_handling();
cpu_option = NULL;
snapshot = 0;
nb_nics = 0;
bdrv_init_with_whitelist();
autostart = 1;
/* first pass of option parsing */ /* first pass of option parsing */
optind = 1; optind = 1;
@ -3952,13 +3952,10 @@ void qemu_init(int argc, char **argv, char **envp)
qemu_process_help_options(); qemu_process_help_options();
qemu_maybe_daemonize(pid_file); qemu_maybe_daemonize(pid_file);
if (qemu_init_main_loop(&main_loop_err)) { qemu_init_main_loop(&error_fatal);
error_report_err(main_loop_err); cpu_timers_init();
exit(1);
}
user_register_global_props(); user_register_global_props();
replay_configure(icount_opts); replay_configure(icount_opts);
if (incoming && !preconfig_exit_requested) { if (incoming && !preconfig_exit_requested) {
@ -3995,6 +3992,7 @@ void qemu_init(int argc, char **argv, char **envp)
} }
cpu_exec_init_all(); cpu_exec_init_all();
page_size_init();
if (machine_class->hw_version) { if (machine_class->hw_version) {
qemu_set_hw_version(machine_class->hw_version); qemu_set_hw_version(machine_class->hw_version);
@ -4137,9 +4135,6 @@ void qemu_init(int argc, char **argv, char **envp)
exit(1); exit(1);
} }
page_size_init();
socket_init();
qemu_opts_foreach(qemu_find_opts("object"), qemu_opts_foreach(qemu_find_opts("object"),
user_creatable_add_opts_foreach, user_creatable_add_opts_foreach,
object_create_initial, &error_fatal); object_create_initial, &error_fatal);
@ -4256,9 +4251,6 @@ void qemu_init(int argc, char **argv, char **envp)
semihosting_arg_fallback(kernel_filename, kernel_cmdline); semihosting_arg_fallback(kernel_filename, kernel_cmdline);
} }
/* initialize cpu timers and VCPU throttle modules */
cpu_timers_init();
if (default_net) { if (default_net) {
QemuOptsList *net = qemu_find_opts("net"); QemuOptsList *net = qemu_find_opts("net");
qemu_opts_set(net, NULL, "type", "nic", &error_abort); qemu_opts_set(net, NULL, "type", "nic", &error_abort);