Commit dd1f6349 authored by Alex Bennée's avatar Alex Bennée Committed by Paolo Bonzini
Browse files

linux-user/syscall: extend lock around cpu-list



There is a potential race if several threads exit at once. To serialise
the exits extend the lock above the initial checking of the CPU list.

Signed-off-by: default avatarAlex Bennée <alex.bennee@linaro.org>
Message-Id: <20160930213106.20186-11-alex.bennee@linaro.org>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent a8906439
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -7476,13 +7476,16 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
            break;
        }

        cpu_list_lock();

        if (CPU_NEXT(first_cpu)) {
            TaskState *ts;

            cpu_list_lock();
            /* Remove the CPU from the list.  */
            QTAILQ_REMOVE(&cpus, cpu, node);

            cpu_list_unlock();

            ts = cpu->opaque;
            if (ts->child_tidptr) {
                put_user_u32(0, ts->child_tidptr);
@@ -7495,6 +7498,8 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
            rcu_unregister_thread();
            pthread_exit(NULL);
        }

        cpu_list_unlock();
#ifdef TARGET_GPROF
        _mcleanup();
#endif