|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v4 57/65] accel: Always register AccelOpsClass::kick_vcpu_thread() handler
In order to dispatch over AccelOpsClass::kick_vcpu_thread(),
we need it always defined, not calling a hidden handler under
the hood. Make AccelOpsClass::kick_vcpu_thread() mandatory.
Register the default cpus_kick_thread() for each accelerator.
Signed-off-by: Philippe Mathieu-Daudé <philmd@xxxxxxxxxx>
---
include/system/accel-ops.h | 1 +
accel/kvm/kvm-accel-ops.c | 1 +
accel/qtest/qtest.c | 1 +
accel/xen/xen-all.c | 1 +
system/cpus.c | 7 ++-----
5 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/include/system/accel-ops.h b/include/system/accel-ops.h
index dc8df9ba7dd..e1e6985a27c 100644
--- a/include/system/accel-ops.h
+++ b/include/system/accel-ops.h
@@ -43,6 +43,7 @@ struct AccelOpsClass {
void *(*cpu_thread_routine)(void *);
void (*thread_precreate)(CPUState *cpu);
void (*create_vcpu_thread)(CPUState *cpu);
+ /* kick_vcpu_thread is mandatory. */
void (*kick_vcpu_thread)(CPUState *cpu);
bool (*cpu_thread_is_idle)(CPUState *cpu);
diff --git a/accel/kvm/kvm-accel-ops.c b/accel/kvm/kvm-accel-ops.c
index b79c04b6267..a4bcaa87c8d 100644
--- a/accel/kvm/kvm-accel-ops.c
+++ b/accel/kvm/kvm-accel-ops.c
@@ -81,6 +81,7 @@ static void kvm_accel_ops_class_init(ObjectClass *oc, const
void *data)
ops->cpu_thread_routine = kvm_vcpu_thread_fn;
ops->cpu_thread_is_idle = kvm_vcpu_thread_is_idle;
+ ops->kick_vcpu_thread = cpus_kick_thread;
ops->synchronize_post_reset = kvm_cpu_synchronize_post_reset;
ops->synchronize_post_init = kvm_cpu_synchronize_post_init;
ops->synchronize_state = kvm_cpu_synchronize_state;
diff --git a/accel/qtest/qtest.c b/accel/qtest/qtest.c
index 47fa9e38ce3..8e2379d6e37 100644
--- a/accel/qtest/qtest.c
+++ b/accel/qtest/qtest.c
@@ -66,6 +66,7 @@ static void qtest_accel_ops_class_init(ObjectClass *oc, const
void *data)
ops->thread_precreate = dummy_thread_precreate;
ops->cpu_thread_routine = dummy_cpu_thread_routine;
+ ops->kick_vcpu_thread = cpus_kick_thread;
ops->get_virtual_clock = qtest_get_virtual_clock;
ops->set_virtual_clock = qtest_set_virtual_clock;
ops->handle_interrupt = generic_handle_interrupt;
diff --git a/accel/xen/xen-all.c b/accel/xen/xen-all.c
index a51f4c5b2ad..18ae0d82db5 100644
--- a/accel/xen/xen-all.c
+++ b/accel/xen/xen-all.c
@@ -154,6 +154,7 @@ static void xen_accel_ops_class_init(ObjectClass *oc, const
void *data)
ops->thread_precreate = dummy_thread_precreate;
ops->cpu_thread_routine = dummy_cpu_thread_routine;
+ ops->kick_vcpu_thread = cpus_kick_thread;
ops->handle_interrupt = generic_handle_interrupt;
}
diff --git a/system/cpus.c b/system/cpus.c
index efe1a5e211b..6c64ffccbb3 100644
--- a/system/cpus.c
+++ b/system/cpus.c
@@ -486,11 +486,7 @@ void cpus_kick_thread(CPUState *cpu)
void qemu_cpu_kick(CPUState *cpu)
{
qemu_cond_broadcast(cpu->halt_cond);
- if (cpus_accel->kick_vcpu_thread) {
- cpus_accel->kick_vcpu_thread(cpu);
- } else { /* default */
- cpus_kick_thread(cpu);
- }
+ cpus_accel->kick_vcpu_thread(cpu);
}
void qemu_cpu_kick_self(void)
@@ -670,6 +666,7 @@ void cpus_register_accel(const AccelOpsClass *ops)
{
assert(ops != NULL);
assert(ops->create_vcpu_thread || ops->cpu_thread_routine);
+ assert(ops->kick_vcpu_thread);
assert(ops->handle_interrupt);
cpus_accel = ops;
}
--
2.49.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |