[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v5 62/69] 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> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@xxxxxxxxxx> Reviewed-by: Zhao Liu <zhao1.liu@xxxxxxxxx> --- 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 |