mirror of
https://gitlab.com/qemu-project/qemu.git
synced 2024-10-12 13:21:55 +03:00
bsd-user: Sync fork_start/fork_end with linux-user
This reorders some of the calls, deduplicates code between branches and, most importantly, fixes a double end_exclusive call in the parent that will cause exclusive_context_count to go negative. Signed-off-by: Jessica Clarke <jrtc27@jrtc27.com> Pull-Request: https://github.com/qemu-bsd-user/qemu-bsd-user/pull/52 Reviewed-by: Warner Losh <imp@bsdimp.com> Signed-off-by: Warner Losh <imp@bsdimp.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
b314fd06cf
commit
5b6828d194
@ -35,6 +35,7 @@
|
||||
#include "qemu/path.h"
|
||||
#include "qemu/help_option.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/plugin.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "user/guest-base.h"
|
||||
#include "tcg/startup.h"
|
||||
@ -103,8 +104,9 @@ unsigned long target_sgrowsiz = TARGET_SGROWSIZ; /* amount to grow stack */
|
||||
void fork_start(void)
|
||||
{
|
||||
start_exclusive();
|
||||
cpu_list_lock();
|
||||
mmap_fork_start();
|
||||
cpu_list_lock();
|
||||
qemu_plugin_user_prefork_lock();
|
||||
gdbserver_fork_start();
|
||||
}
|
||||
|
||||
@ -112,31 +114,31 @@ void fork_end(pid_t pid)
|
||||
{
|
||||
bool child = pid == 0;
|
||||
|
||||
qemu_plugin_user_postfork(child);
|
||||
mmap_fork_end(child);
|
||||
if (child) {
|
||||
CPUState *cpu, *next_cpu;
|
||||
/*
|
||||
* Child processes created by fork() only have a single thread. Discard
|
||||
* information about the parent threads.
|
||||
* Child processes created by fork() only have a single thread.
|
||||
* Discard information about the parent threads.
|
||||
*/
|
||||
CPU_FOREACH_SAFE(cpu, next_cpu) {
|
||||
if (cpu != thread_cpu) {
|
||||
QTAILQ_REMOVE_RCU(&cpus_queue, cpu, node);
|
||||
}
|
||||
}
|
||||
mmap_fork_end(child);
|
||||
/*
|
||||
* qemu_init_cpu_list() takes care of reinitializing the exclusive
|
||||
* state, so we don't need to end_exclusive() here.
|
||||
*/
|
||||
qemu_init_cpu_list();
|
||||
get_task_state(thread_cpu)->ts_tid = qemu_get_thread_id();
|
||||
gdbserver_fork_end(thread_cpu, pid);
|
||||
} else {
|
||||
mmap_fork_end(child);
|
||||
cpu_list_unlock();
|
||||
gdbserver_fork_end(thread_cpu, pid);
|
||||
end_exclusive();
|
||||
}
|
||||
gdbserver_fork_end(thread_cpu, pid);
|
||||
/*
|
||||
* 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();
|
||||
}
|
||||
|
||||
void cpu_loop(CPUArchState *env)
|
||||
|
Loading…
Reference in New Issue
Block a user