mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06: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
1 changed files with 14 additions and 12 deletions
|
@ -35,6 +35,7 @@
|
||||||
#include "qemu/path.h"
|
#include "qemu/path.h"
|
||||||
#include "qemu/help_option.h"
|
#include "qemu/help_option.h"
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
|
#include "qemu/plugin.h"
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "user/guest-base.h"
|
#include "user/guest-base.h"
|
||||||
#include "tcg/startup.h"
|
#include "tcg/startup.h"
|
||||||
|
@ -103,8 +104,9 @@ unsigned long target_sgrowsiz = TARGET_SGROWSIZ; /* amount to grow stack */
|
||||||
void fork_start(void)
|
void fork_start(void)
|
||||||
{
|
{
|
||||||
start_exclusive();
|
start_exclusive();
|
||||||
cpu_list_lock();
|
|
||||||
mmap_fork_start();
|
mmap_fork_start();
|
||||||
|
cpu_list_lock();
|
||||||
|
qemu_plugin_user_prefork_lock();
|
||||||
gdbserver_fork_start();
|
gdbserver_fork_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,31 +114,31 @@ void fork_end(pid_t pid)
|
||||||
{
|
{
|
||||||
bool child = pid == 0;
|
bool child = pid == 0;
|
||||||
|
|
||||||
|
qemu_plugin_user_postfork(child);
|
||||||
|
mmap_fork_end(child);
|
||||||
if (child) {
|
if (child) {
|
||||||
CPUState *cpu, *next_cpu;
|
CPUState *cpu, *next_cpu;
|
||||||
/*
|
/*
|
||||||
* Child processes created by fork() only have a single thread. Discard
|
* Child processes created by fork() only have a single thread.
|
||||||
* information about the parent threads.
|
* Discard information about the parent threads.
|
||||||
*/
|
*/
|
||||||
CPU_FOREACH_SAFE(cpu, next_cpu) {
|
CPU_FOREACH_SAFE(cpu, next_cpu) {
|
||||||
if (cpu != thread_cpu) {
|
if (cpu != thread_cpu) {
|
||||||
QTAILQ_REMOVE_RCU(&cpus_queue, cpu, node);
|
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();
|
qemu_init_cpu_list();
|
||||||
get_task_state(thread_cpu)->ts_tid = qemu_get_thread_id();
|
get_task_state(thread_cpu)->ts_tid = qemu_get_thread_id();
|
||||||
gdbserver_fork_end(thread_cpu, pid);
|
|
||||||
} else {
|
} else {
|
||||||
mmap_fork_end(child);
|
|
||||||
cpu_list_unlock();
|
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)
|
void cpu_loop(CPUArchState *env)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue