Commit 2a96a552 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

Revert "rcu: do not create thread in pthread_atfork callback"



This reverts commit a59629fc.
This is not needed anymore because the IOThread mutex is not
"magic" anymore (need not kick the CPU thread)and also because
fork callbacks are only enabled at the very beginning of
QEMU's execution.

Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 73c6e401
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -111,7 +111,6 @@ extern void rcu_unregister_thread(void);
 */
extern void rcu_enable_atfork(void);
extern void rcu_disable_atfork(void);
extern void rcu_after_fork(void);

struct rcu_head;
typedef void RCUCBFunc(struct rcu_head *head);
+0 −1
Original line number Diff line number Diff line
@@ -6354,7 +6354,6 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp,
        ret = fork();
        if (ret == 0) {
            /* Child Process.  */
            rcu_after_fork();
            cpu_clone_regs(env, newsp);
            fork_end(1);
            /* There is a race condition here.  The parent process could
+0 −2
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@
#include "sysemu/sysemu.h"
#include "net/slirp.h"
#include "qemu-options.h"
#include "qemu/rcu.h"
#include "qemu/error-report.h"
#include "qemu/log.h"
#include "qemu/cutils.h"
@@ -249,7 +248,6 @@ void os_daemonize(void)
        signal(SIGTSTP, SIG_IGN);
        signal(SIGTTOU, SIG_IGN);
        signal(SIGTTIN, SIG_IGN);
        rcu_after_fork();
    }
}

+7 −3
Original line number Diff line number Diff line
@@ -350,18 +350,22 @@ static void rcu_init_unlock(void)
    qemu_mutex_unlock(&rcu_registry_lock);
    qemu_mutex_unlock(&rcu_sync_lock);
}
#endif

void rcu_after_fork(void)
static void rcu_init_child(void)
{
    if (atfork_depth < 1) {
        return;
    }

    memset(&registry, 0, sizeof(registry));
    rcu_init_complete();
}
#endif

static void __attribute__((__constructor__)) rcu_init(void)
{
#ifdef CONFIG_POSIX
    pthread_atfork(rcu_init_lock, rcu_init_unlock, rcu_init_unlock);
    pthread_atfork(rcu_init_lock, rcu_init_unlock, rcu_init_child);
#endif
    rcu_init_complete();
}