|
@@ -6481,6 +6481,16 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
|
|
|
/* Grab a mutex so that thread setup appears atomic. */
|
|
|
pthread_mutex_lock(&clone_lock);
|
|
|
|
|
|
+ /*
|
|
|
+ * If this is our first additional thread, we need to ensure we
|
|
|
+ * generate code for parallel execution and flush old translations.
|
|
|
+ * Do this now so that the copy gets CF_PARALLEL too.
|
|
|
+ */
|
|
|
+ if (!(cpu->tcg_cflags & CF_PARALLEL)) {
|
|
|
+ cpu->tcg_cflags |= CF_PARALLEL;
|
|
|
+ tb_flush(cpu);
|
|
|
+ }
|
|
|
+
|
|
|
/* we create a new CPU instance. */
|
|
|
new_env = cpu_copy(env);
|
|
|
/* Init regs that differ from the parent. */
|
|
@@ -6521,14 +6531,6 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
|
|
|
sigprocmask(SIG_BLOCK, &sigmask, &info.sigmask);
|
|
|
cpu->random_seed = qemu_guest_random_seed_thread_part1();
|
|
|
|
|
|
- /* If this is our first additional thread, we need to ensure we
|
|
|
- * generate code for parallel execution and flush old translations.
|
|
|
- */
|
|
|
- if (!parallel_cpus) {
|
|
|
- parallel_cpus = true;
|
|
|
- tb_flush(cpu);
|
|
|
- }
|
|
|
-
|
|
|
ret = pthread_create(&info.thread, &attr, clone_func, &info);
|
|
|
/* TODO: Free new CPU state if thread creation failed. */
|
|
|
|