aboutsummaryrefslogtreecommitdiff
path: root/linux-user
diff options
context:
space:
mode:
authorIlya Leoshkevich <iii@linux.ibm.com>2023-02-14 15:08:26 +0100
committerRichard Henderson <richard.henderson@linaro.org>2023-02-21 08:44:13 -1000
commit7de0816f699553514016f52a76e26d1c2ae14034 (patch)
treed45c3f118d0b5108b6227ca1f9a72fa24519cd52 /linux-user
parent21a474c41d18eb56186e2022e8e081c2b6011bd3 (diff)
downloadqemu-7de0816f699553514016f52a76e26d1c2ae14034.zip
qemu-7de0816f699553514016f52a76e26d1c2ae14034.tar.gz
qemu-7de0816f699553514016f52a76e26d1c2ae14034.tar.bz2
linux-user: Always exit from exclusive state in fork_end()
fork()ed processes currently start with current_cpu->in_exclusive_context set, which is, strictly speaking, not correct, but does not cause problems (even assertion failures). With one of the next patches, the code begins to rely on this value, so fix it by always calling end_exclusive() in fork_end(). Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Message-Id: <20230214140829.45392-2-iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'linux-user')
-rw-r--r--linux-user/main.c10
-rw-r--r--linux-user/syscall.c1
2 files changed, 7 insertions, 4 deletions
diff --git a/linux-user/main.c b/linux-user/main.c
index 4290651..4ff30ff 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -161,13 +161,15 @@ void fork_end(int child)
}
qemu_init_cpu_list();
gdbserver_fork(thread_cpu);
- /* qemu_init_cpu_list() takes care of reinitializing the
- * exclusive state, so we don't need to end_exclusive() here.
- */
} else {
cpu_list_unlock();
- end_exclusive();
}
+ /*
+ * qemu_init_cpu_list() reinitialized the child exclusive state, but we
+ * also need to keep current_cpu consistent, so call end_exclusive() for
+ * both child and parent.
+ */
+ end_exclusive();
}
__thread CPUState *thread_cpu;
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 1e868e9..a6c426d 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -6752,6 +6752,7 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
cpu_clone_regs_parent(env, flags);
fork_end(0);
}
+ g_assert(!cpu_in_exclusive_context(cpu));
}
return ret;
}