On 01/11/2012 08:44 PM, Anthony Liguori wrote:
This is easier said than done.  I started down this road and there's a
huge amount of code that assumes that first_cpu != NULL.

That's why I said do not create the CPU _threads_. :) But that wouldn't be a big step forward from halted = 1; for example, it would prevent using per-CPU work items. Currently they're only used internally by KVM, but you never know.

So you can also create a CPU thread that does nothing. Here is how it could look like, based on the KVM implementation:

static void *qemu_qtest_cpu_thread_fn(void *arg)
{
    CPUState *env = arg;
    int r;

    qemu_mutex_lock(&qemu_global_mutex);
    qemu_thread_get_self(env->thread);
    env->thread_id = qemu_get_thread_id();

    sigset_t waitset;
    sigemptyset(&waitset);
    sigaddset(&waitset, SIG_IPI);

    /* signal CPU creation */
    env->created = 1;
    qemu_cond_signal(&qemu_cpu_cond);

    cpu_single_env = env;
    while (1) {
        cpu_single_env = NULL;
        qemu_mutex_unlock_iothread();
        do {
            int sig;
            r = sigwait(&waitset, &sig);
        } while (r == -1 && (errno == EAGAIN || errno == EINTR));
        if (r == -1) {
            perror("sigtimedwait");
            exit(1);
        }
        qemu_mutex_lock_iothread();
        cpu_single_env = env;
        qemu_wait_io_event_common(env);
    }

    return NULL;
}

Paolo

Reply via email to