cpus: Move common code out of {async_, }run_on_cpu()
Move the code common between run_on_cpu() and async_run_on_cpu() into a new function queue_work_on_cpu(). Signed-off-by: Sergey Fedorov <serge.fdrv@gmail.com> Signed-off-by: Sergey Fedorov <sergey.fedorov@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <1470158864-17651-4-git-send-email-alex.bennee@linaro.org> Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
e0eeb4a21a
commit
fd38b25103
42
cpus.c
42
cpus.c
@ -916,6 +916,22 @@ void qemu_init_cpu_loop(void)
|
|||||||
qemu_thread_get_self(&io_thread);
|
qemu_thread_get_self(&io_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void queue_work_on_cpu(CPUState *cpu, struct qemu_work_item *wi)
|
||||||
|
{
|
||||||
|
qemu_mutex_lock(&cpu->work_mutex);
|
||||||
|
if (cpu->queued_work_first == NULL) {
|
||||||
|
cpu->queued_work_first = wi;
|
||||||
|
} else {
|
||||||
|
cpu->queued_work_last->next = wi;
|
||||||
|
}
|
||||||
|
cpu->queued_work_last = wi;
|
||||||
|
wi->next = NULL;
|
||||||
|
wi->done = false;
|
||||||
|
qemu_mutex_unlock(&cpu->work_mutex);
|
||||||
|
|
||||||
|
qemu_cpu_kick(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
void run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data)
|
void run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data)
|
||||||
{
|
{
|
||||||
struct qemu_work_item wi;
|
struct qemu_work_item wi;
|
||||||
@ -929,18 +945,7 @@ void run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data)
|
|||||||
wi.data = data;
|
wi.data = data;
|
||||||
wi.free = false;
|
wi.free = false;
|
||||||
|
|
||||||
qemu_mutex_lock(&cpu->work_mutex);
|
queue_work_on_cpu(cpu, &wi);
|
||||||
if (cpu->queued_work_first == NULL) {
|
|
||||||
cpu->queued_work_first = &wi;
|
|
||||||
} else {
|
|
||||||
cpu->queued_work_last->next = &wi;
|
|
||||||
}
|
|
||||||
cpu->queued_work_last = &wi;
|
|
||||||
wi.next = NULL;
|
|
||||||
wi.done = false;
|
|
||||||
qemu_mutex_unlock(&cpu->work_mutex);
|
|
||||||
|
|
||||||
qemu_cpu_kick(cpu);
|
|
||||||
while (!atomic_mb_read(&wi.done)) {
|
while (!atomic_mb_read(&wi.done)) {
|
||||||
CPUState *self_cpu = current_cpu;
|
CPUState *self_cpu = current_cpu;
|
||||||
|
|
||||||
@ -963,18 +968,7 @@ void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data)
|
|||||||
wi->data = data;
|
wi->data = data;
|
||||||
wi->free = true;
|
wi->free = true;
|
||||||
|
|
||||||
qemu_mutex_lock(&cpu->work_mutex);
|
queue_work_on_cpu(cpu, wi);
|
||||||
if (cpu->queued_work_first == NULL) {
|
|
||||||
cpu->queued_work_first = wi;
|
|
||||||
} else {
|
|
||||||
cpu->queued_work_last->next = wi;
|
|
||||||
}
|
|
||||||
cpu->queued_work_last = wi;
|
|
||||||
wi->next = NULL;
|
|
||||||
wi->done = false;
|
|
||||||
qemu_mutex_unlock(&cpu->work_mutex);
|
|
||||||
|
|
||||||
qemu_cpu_kick(cpu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qemu_kvm_destroy_vcpu(CPUState *cpu)
|
static void qemu_kvm_destroy_vcpu(CPUState *cpu)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user