Pablo Greco e6a3ae
From e7dc49f6bf6fd242b5b7a83bc270664a1ca45879 Mon Sep 17 00:00:00 2001
Pablo Greco e6a3ae
From: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
Date: Mon, 22 Jul 2019 18:22:08 +0100
Pablo Greco e6a3ae
Subject: [PATCH 27/39] KVM: Introduce kvm_arch_destroy_vcpu()
Pablo Greco e6a3ae
Pablo Greco e6a3ae
RH-Author: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
Message-id: <20190722182220.19374-7-pbonzini@redhat.com>
Pablo Greco e6a3ae
Patchwork-id: 89623
Pablo Greco e6a3ae
O-Subject: [RHEL-8.1.0 PATCH qemu-kvm v3 06/18] KVM: Introduce kvm_arch_destroy_vcpu()
Pablo Greco e6a3ae
Bugzilla: 1689269
Pablo Greco e6a3ae
RH-Acked-by: Peter Xu <zhexu@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
Pablo Greco e6a3ae
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
From: Liran Alon <liran.alon@oracle.com>
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Simiar to how kvm_init_vcpu() calls kvm_arch_init_vcpu() to perform
Pablo Greco e6a3ae
arch-dependent initialisation, introduce kvm_arch_destroy_vcpu()
Pablo Greco e6a3ae
to be called from kvm_destroy_vcpu() to perform arch-dependent
Pablo Greco e6a3ae
destruction.
Pablo Greco e6a3ae
Pablo Greco e6a3ae
This was added because some architectures (Such as i386)
Pablo Greco e6a3ae
currently do not free memory that it have allocated in
Pablo Greco e6a3ae
kvm_arch_init_vcpu().
Pablo Greco e6a3ae
Pablo Greco e6a3ae
Suggested-by: Maran Wilson <maran.wilson@oracle.com>
Pablo Greco e6a3ae
Reviewed-by: Maran Wilson <maran.wilson@oracle.com>
Pablo Greco e6a3ae
Signed-off-by: Liran Alon <liran.alon@oracle.com>
Pablo Greco e6a3ae
Message-Id: <20190619162140.133674-3-liran.alon@oracle.com>
Pablo Greco e6a3ae
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Pablo Greco e6a3ae
(cherry picked from commit b1115c99919cf158bb859865f14c3198a0e6f679)
Pablo Greco e6a3ae
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
Pablo Greco e6a3ae
---
Pablo Greco e6a3ae
 accel/kvm/kvm-all.c  |  5 +++++
Pablo Greco e6a3ae
 include/sysemu/kvm.h |  1 +
Pablo Greco e6a3ae
 target/arm/kvm32.c   |  5 +++++
Pablo Greco e6a3ae
 target/arm/kvm64.c   |  5 +++++
Pablo Greco e6a3ae
 target/i386/kvm.c    | 12 ++++++++++++
Pablo Greco e6a3ae
 target/mips/kvm.c    |  5 +++++
Pablo Greco e6a3ae
 target/ppc/kvm.c     |  5 +++++
Pablo Greco e6a3ae
 target/s390x/kvm.c   | 10 ++++++++++
Pablo Greco e6a3ae
 8 files changed, 48 insertions(+)
Pablo Greco e6a3ae
Pablo Greco e6a3ae
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
Pablo Greco e6a3ae
index 3a7c8a3..a939b26 100644
Pablo Greco e6a3ae
--- a/accel/kvm/kvm-all.c
Pablo Greco e6a3ae
+++ b/accel/kvm/kvm-all.c
Pablo Greco e6a3ae
@@ -290,6 +290,11 @@ int kvm_destroy_vcpu(CPUState *cpu)
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
     DPRINTF("kvm_destroy_vcpu\n");
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+    ret = kvm_arch_destroy_vcpu(cpu);
Pablo Greco e6a3ae
+    if (ret < 0) {
Pablo Greco e6a3ae
+        goto err;
Pablo Greco e6a3ae
+    }
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
     mmap_size = kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0);
Pablo Greco e6a3ae
     if (mmap_size < 0) {
Pablo Greco e6a3ae
         ret = mmap_size;
Pablo Greco e6a3ae
diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h
Pablo Greco e6a3ae
index 3d8f294..a5a6dff 100644
Pablo Greco e6a3ae
--- a/include/sysemu/kvm.h
Pablo Greco e6a3ae
+++ b/include/sysemu/kvm.h
Pablo Greco e6a3ae
@@ -372,6 +372,7 @@ int kvm_arch_put_registers(CPUState *cpu, int level);
Pablo Greco e6a3ae
 int kvm_arch_init(MachineState *ms, KVMState *s);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 int kvm_arch_init_vcpu(CPUState *cpu);
Pablo Greco e6a3ae
+int kvm_arch_destroy_vcpu(CPUState *cpu);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
 bool kvm_vcpu_id_is_valid(int vcpu_id);
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
diff --git a/target/arm/kvm32.c b/target/arm/kvm32.c
Pablo Greco e6a3ae
index 1740cda..056f016 100644
Pablo Greco e6a3ae
--- a/target/arm/kvm32.c
Pablo Greco e6a3ae
+++ b/target/arm/kvm32.c
Pablo Greco e6a3ae
@@ -237,6 +237,11 @@ int kvm_arch_init_vcpu(CPUState *cs)
Pablo Greco e6a3ae
     return kvm_arm_init_cpreg_list(cpu);
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+int kvm_arch_destroy_vcpu(CPUState *cs)
Pablo Greco e6a3ae
+{
Pablo Greco e6a3ae
+	return 0;
Pablo Greco e6a3ae
+}
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
 typedef struct Reg {
Pablo Greco e6a3ae
     uint64_t id;
Pablo Greco e6a3ae
     int offset;
Pablo Greco e6a3ae
diff --git a/target/arm/kvm64.c b/target/arm/kvm64.c
Pablo Greco e6a3ae
index e0b8246..c9c761e 100644
Pablo Greco e6a3ae
--- a/target/arm/kvm64.c
Pablo Greco e6a3ae
+++ b/target/arm/kvm64.c
Pablo Greco e6a3ae
@@ -549,6 +549,11 @@ int kvm_arch_init_vcpu(CPUState *cs)
Pablo Greco e6a3ae
     return kvm_arm_init_cpreg_list(cpu);
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+int kvm_arch_destroy_vcpu(CPUState *cs)
Pablo Greco e6a3ae
+{
Pablo Greco e6a3ae
+    return 0;
Pablo Greco e6a3ae
+}
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
 bool kvm_arm_reg_syncs_via_cpreg_list(uint64_t regidx)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     /* Return true if the regidx is a register we should synchronize
Pablo Greco e6a3ae
diff --git a/target/i386/kvm.c b/target/i386/kvm.c
Pablo Greco e6a3ae
index 8e861a1..305809f 100644
Pablo Greco e6a3ae
--- a/target/i386/kvm.c
Pablo Greco e6a3ae
+++ b/target/i386/kvm.c
Pablo Greco e6a3ae
@@ -1196,6 +1196,18 @@ int kvm_arch_init_vcpu(CPUState *cs)
Pablo Greco e6a3ae
     return r;
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+int kvm_arch_destroy_vcpu(CPUState *cs)
Pablo Greco e6a3ae
+{
Pablo Greco e6a3ae
+    X86CPU *cpu = X86_CPU(cs);
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    if (cpu->kvm_msr_buf) {
Pablo Greco e6a3ae
+        g_free(cpu->kvm_msr_buf);
Pablo Greco e6a3ae
+        cpu->kvm_msr_buf = NULL;
Pablo Greco e6a3ae
+    }
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    return 0;
Pablo Greco e6a3ae
+}
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
 void kvm_arch_reset_vcpu(X86CPU *cpu)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     CPUX86State *env = &cpu->env;
Pablo Greco e6a3ae
diff --git a/target/mips/kvm.c b/target/mips/kvm.c
Pablo Greco e6a3ae
index 8e72850..938f8f1 100644
Pablo Greco e6a3ae
--- a/target/mips/kvm.c
Pablo Greco e6a3ae
+++ b/target/mips/kvm.c
Pablo Greco e6a3ae
@@ -91,6 +91,11 @@ int kvm_arch_init_vcpu(CPUState *cs)
Pablo Greco e6a3ae
     return ret;
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+int kvm_arch_destroy_vcpu(CPUState *cs)
Pablo Greco e6a3ae
+{
Pablo Greco e6a3ae
+    return 0;
Pablo Greco e6a3ae
+}
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
 void kvm_mips_reset_vcpu(MIPSCPU *cpu)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     CPUMIPSState *env = &cpu->env;
Pablo Greco e6a3ae
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
Pablo Greco e6a3ae
index 058dcbe..b9858fa 100644
Pablo Greco e6a3ae
--- a/target/ppc/kvm.c
Pablo Greco e6a3ae
+++ b/target/ppc/kvm.c
Pablo Greco e6a3ae
@@ -607,6 +607,11 @@ int kvm_arch_init_vcpu(CPUState *cs)
Pablo Greco e6a3ae
     return ret;
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+int kvm_arch_destroy_vcpu(CPUState *cs)
Pablo Greco e6a3ae
+{
Pablo Greco e6a3ae
+    return 0;
Pablo Greco e6a3ae
+}
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
 static void kvm_sw_tlb_put(PowerPCCPU *cpu)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     CPUPPCState *env = &cpu->env;
Pablo Greco e6a3ae
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
Pablo Greco e6a3ae
index 1d6cc33..0814333 100644
Pablo Greco e6a3ae
--- a/target/s390x/kvm.c
Pablo Greco e6a3ae
+++ b/target/s390x/kvm.c
Pablo Greco e6a3ae
@@ -370,6 +370,16 @@ int kvm_arch_init_vcpu(CPUState *cs)
Pablo Greco e6a3ae
     return 0;
Pablo Greco e6a3ae
 }
Pablo Greco e6a3ae
 
Pablo Greco e6a3ae
+int kvm_arch_destroy_vcpu(CPUState *cs)
Pablo Greco e6a3ae
+{
Pablo Greco e6a3ae
+    S390CPU *cpu = S390_CPU(cs);
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    g_free(cpu->irqstate);
Pablo Greco e6a3ae
+    cpu->irqstate = NULL;
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
+    return 0;
Pablo Greco e6a3ae
+}
Pablo Greco e6a3ae
+
Pablo Greco e6a3ae
 void kvm_s390_reset_vcpu(S390CPU *cpu)
Pablo Greco e6a3ae
 {
Pablo Greco e6a3ae
     CPUState *cs = CPU(cpu);
Pablo Greco e6a3ae
-- 
Pablo Greco e6a3ae
1.8.3.1
Pablo Greco e6a3ae