Not every architecture was doing something here so we can make it an optional hook. Signed-off-by: Alex Bennée --- include/accel/kvm/cpu-ops.h | 6 ++++++ include/system/kvm.h | 2 -- target/i386/kvm/kvm_i386.h | 1 + accel/kvm/kvm-all.c | 17 +++++++++++------ target/arm/kvm.c | 5 ----- target/i386/kvm/kvm-cpu.c | 1 + target/i386/kvm/kvm.c | 2 +- target/loongarch/kvm/kvm.c | 3 ++- target/ppc/kvm.c | 5 ----- target/riscv/kvm/kvm-cpu.c | 5 ----- target/s390x/kvm/kvm.c | 3 ++- 11 files changed, 24 insertions(+), 26 deletions(-) diff --git a/include/accel/kvm/cpu-ops.h b/include/accel/kvm/cpu-ops.h index 23557a42ba7..171568e08cb 100644 --- a/include/accel/kvm/cpu-ops.h +++ b/include/accel/kvm/cpu-ops.h @@ -28,6 +28,11 @@ struct kvm_run; * @init_vcpu: Mandatory callback executed to perform architecture-specific * initialization of a newly created KVM vCPU. * Returns 0 on success, or a negative errno on failure. + * @destroy_vcpu: Optional callback executed when destroying a KVM vCPU + * (e.g. to free architecture-specific buffers or deregister + * state change handlers). + * May be NULL if no architecture-specific cleanup is required. + * Returns 0 on success, or a negative errno on failure. * @get_registers: Mandatory callback to synchronize architecture-specific * vCPU register state from KVM into QEMU's CPUState. * Returns 0 on success, or a negative errno on failure. @@ -65,6 +70,7 @@ struct kvm_run; typedef struct KVMCPUOps { int (*pre_create_vcpu)(CPUState *cpu, Error **errp); int (*init_vcpu)(CPUState *cpu); + int (*destroy_vcpu)(CPUState *cpu); int (*get_registers)(CPUState *cpu, Error **errp); int (*put_registers)(CPUState *cpu, KvmPutState level, Error **errp); void (*pre_run)(CPUState *cpu, struct kvm_run *run); diff --git a/include/system/kvm.h b/include/system/kvm.h index a722f266dae..a66344cc70c 100644 --- a/include/system/kvm.h +++ b/include/system/kvm.h @@ -346,8 +346,6 @@ int kvm_arch_get_default_type(MachineState *ms); int kvm_arch_init(MachineState *ms, KVMState *s); -int kvm_arch_destroy_vcpu(CPUState *cpu); - #ifdef TARGET_KVM_HAVE_RESET_PARKED_VCPU void kvm_arch_reset_parked_vcpu(unsigned long vcpu_id, int kvm_fd); #else diff --git a/target/i386/kvm/kvm_i386.h b/target/i386/kvm/kvm_i386.h index 8af5a9dc0ef..c7ffed75c1d 100644 --- a/target/i386/kvm/kvm_i386.h +++ b/target/i386/kvm/kvm_i386.h @@ -35,6 +35,7 @@ int kvm_get_vm_type(MachineState *ms); void kvm_arch_reset_vcpu(X86CPU *cs); int x86_kvm_pre_create_vcpu(CPUState *cpu, Error **errp); int x86_kvm_init_vcpu(CPUState *cs); +int x86_kvm_destroy_vcpu(CPUState *cs); int x86_kvm_get_registers(CPUState *cs, Error **errp); int x86_kvm_put_registers(CPUState *cpu, KvmPutState level, Error **errp); void x86_kvm_pre_run(CPUState *cpu, struct kvm_run *run); diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index d877edaa5e8..69117271fa3 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -468,9 +468,11 @@ static int kvm_rebind_vcpus(Error **errp) close(cpu->kvm_fd); } - ret = kvm_arch_destroy_vcpu(cpu); - if (ret < 0) { - goto err; + if (ops->destroy_vcpu) { + ret = ops->destroy_vcpu(cpu); + if (ret < 0) { + goto err; + } } if (s->coalesced_mmio_ring == (void *)cpu->kvm_run + PAGE_SIZE) { @@ -647,14 +649,17 @@ static int vcpu_unmap_regions(KVMState *s, CPUState *cpu) static int do_kvm_destroy_vcpu(CPUState *cpu) { + const KVMCPUOps *ops = kvm_get_cpu_ops(cpu); KVMState *s = kvm_state; int ret = 0; trace_kvm_destroy_vcpu(cpu->cpu_index, kvm_arch_vcpu_id(cpu)); - ret = kvm_arch_destroy_vcpu(cpu); - if (ret < 0) { - goto err; + if (ops->destroy_vcpu) { + ret = ops->destroy_vcpu(cpu); + if (ret < 0) { + goto err; + } } /* If I am the CPU that created coalesced_mmio_ring, then discard it */ diff --git a/target/arm/kvm.c b/target/arm/kvm.c index b62f40623c3..042a075e612 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -2093,11 +2093,6 @@ static int arm_kvm_init_vcpu(CPUState *cs) return kvm_arm_init_cpreg_list(cpu); } -int kvm_arch_destroy_vcpu(CPUState *cs) -{ - return 0; -} - /* Callers must hold the iothread mutex lock */ static void kvm_inject_arm_sea(CPUState *c) { diff --git a/target/i386/kvm/kvm-cpu.c b/target/i386/kvm/kvm-cpu.c index 6c547f204f8..8d250b3a847 100644 --- a/target/i386/kvm/kvm-cpu.c +++ b/target/i386/kvm/kvm-cpu.c @@ -237,6 +237,7 @@ static void kvm_cpu_instance_init(CPUState *cs) static const KVMCPUOps x86_kvm_cpu_ops = { .pre_create_vcpu = x86_kvm_pre_create_vcpu, .init_vcpu = x86_kvm_init_vcpu, + .destroy_vcpu = x86_kvm_destroy_vcpu, .get_registers = x86_kvm_get_registers, .put_registers = x86_kvm_put_registers, .pre_run = x86_kvm_pre_run, diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index 46b7e497aaf..a8109004e43 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -2533,7 +2533,7 @@ int x86_kvm_init_vcpu(CPUState *cs) return r; } -int kvm_arch_destroy_vcpu(CPUState *cs) +int x86_kvm_destroy_vcpu(CPUState *cs) { X86CPU *cpu = X86_CPU(cs); CPUX86State *env = &cpu->env; diff --git a/target/loongarch/kvm/kvm.c b/target/loongarch/kvm/kvm.c index 8f2ceb50a78..6705e6698bd 100644 --- a/target/loongarch/kvm/kvm.c +++ b/target/loongarch/kvm/kvm.c @@ -1437,7 +1437,7 @@ void kvm_loongarch_cpu_post_init(LoongArchCPU *cpu) "Set off to disable KVM steal time."); } -int kvm_arch_destroy_vcpu(CPUState *cs) +static int loongarch_kvm_destroy_vcpu(CPUState *cs) { LoongArchCPU *cpu = LOONGARCH_CPU(cs); @@ -1640,6 +1640,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc) static const KVMCPUOps loongarch_kvm_cpu_ops = { .init_vcpu = loongarch_kvm_init_vcpu, + .destroy_vcpu = loongarch_kvm_destroy_vcpu, .get_registers = loongarch_kvm_get_registers, .put_registers = loongarch_kvm_put_registers, .handle_exit = loongarch_kvm_handle_exit, diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c index 075999b553a..cb461963713 100644 --- a/target/ppc/kvm.c +++ b/target/ppc/kvm.c @@ -524,11 +524,6 @@ static int ppc_kvm_init_vcpu(CPUState *cs) return ret; } -int kvm_arch_destroy_vcpu(CPUState *cs) -{ - return 0; -} - static void kvm_sw_tlb_put(PowerPCCPU *cpu) { CPUPPCState *env = &cpu->env; diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c index b202882a155..4247cbec3d9 100644 --- a/target/riscv/kvm/kvm-cpu.c +++ b/target/riscv/kvm/kvm-cpu.c @@ -1512,11 +1512,6 @@ int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route, return 0; } -int kvm_arch_destroy_vcpu(CPUState *cs) -{ - return 0; -} - unsigned long kvm_arch_vcpu_id(CPUState *cpu) { return cpu->cpu_index; diff --git a/target/s390x/kvm/kvm.c b/target/s390x/kvm/kvm.c index 478b21a57fd..0dcd198afe3 100644 --- a/target/s390x/kvm/kvm.c +++ b/target/s390x/kvm/kvm.c @@ -409,7 +409,7 @@ static int s390x_kvm_init_vcpu(CPUState *cs) return 0; } -int kvm_arch_destroy_vcpu(CPUState *cs) +static int s390x_kvm_destroy_vcpu(CPUState *cs) { S390CPU *cpu = S390_CPU(cs); @@ -2647,6 +2647,7 @@ void kvm_arch_accel_class_init(ObjectClass *oc) static const KVMCPUOps s390x_kvm_cpu_ops = { .init_vcpu = s390x_kvm_init_vcpu, + .destroy_vcpu = s390x_kvm_destroy_vcpu, .get_registers = s390x_kvm_get_registers, .put_registers = s390x_kvm_put_registers, .handle_exit = s390x_kvm_handle_exit, -- 2.47.3