@@ -537,6 +537,12 @@ void cpu_exec_init(CPUArchState *env)
CPUState *some_cpu;
int cpu_index;
+#ifndef CONFIG_USER_ONLY
+ cpu->as = &address_space_memory;
+ cpu->thread_id = qemu_get_thread_id();
+ cpu_reload_memory_map(cpu);
+#endif
+
#if defined(CONFIG_USER_ONLY)
cpu_list_lock();
#endif
@@ -545,11 +551,6 @@ void cpu_exec_init(CPUArchState *env)
cpu_index++;
}
cpu->cpu_index = cpu_index;
-#ifndef CONFIG_USER_ONLY
- cpu->as = &address_space_memory;
- cpu->thread_id = qemu_get_thread_id();
- cpu_reload_memory_map(cpu);
-#endif
QTAILQ_INSERT_TAIL(&cpus, cpu, node);
#if defined(CONFIG_USER_ONLY)
cpu_list_unlock();
Instead of initializing cpu->as, cpu->thread_id, and reloading memory map while holding cpu_list_lock(), do it earlier, before locking the CPU list and initializing cpu_index. This allows the code handling cpu_index and global CPU list to be isolated from the rest. Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- Changes v1 -> v2: * Rebased and moved the new cpu_reload_memory_map(cpu) line * Reviewed-by from Igor not kept because more complex code is now being moved --- exec.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)