On 11/20/2015 11:54 PM, Bharata B Rao wrote:
From: Gu Zheng <[email protected]>

In order to deal well with the kvm vcpus (which can not be removed without any
protection), we do not close KVM vcpu fd, just record and mark it as stopped
into a list, so that we can reuse it for the appending cpu hot-add request if
possible. It is also the approach that kvm guys suggested:
https://www.mail-archive.com/[email protected]/msg102839.html

Signed-off-by: Chen Fan <[email protected]>
Signed-off-by: Gu Zheng <[email protected]>
Signed-off-by: Zhu Guihua <[email protected]>
Signed-off-by: Bharata B Rao <[email protected]>
                [- Explicit CPU_REMOVE() from qemu_kvm/tcg_destroy_vcpu()
                   isn't needed as it is done from cpu_exec_exit()]
Reviewed-by: David Gibson <[email protected]>
---
  cpus.c               | 41 +++++++++++++++++++++++++++++++++++++
  include/qom/cpu.h    | 10 +++++++++
  include/sysemu/kvm.h |  1 +
  kvm-all.c            | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++-
  kvm-stub.c           |  5 +++++
  5 files changed, 113 insertions(+), 1 deletion(-)

diff --git a/cpus.c b/cpus.c
index 877bd70..af2b274 100644
--- a/cpus.c
+++ b/cpus.c
@@ -953,6 +953,21 @@ void async_run_on_cpu(CPUState *cpu, void (*func)(void 
*data), void *data)
      qemu_cpu_kick(cpu);
  }

+static void qemu_kvm_destroy_vcpu(CPUState *cpu)
+{
+    if (kvm_destroy_vcpu(cpu) < 0) {
+        error_report("kvm_destroy_vcpu failed.\n");
+        exit(EXIT_FAILURE);
+    }
+
+    object_unparent(OBJECT(cpu));
+}
+
+static void qemu_tcg_destroy_vcpu(CPUState *cpu)
+{
+    object_unparent(OBJECT(cpu));
+}
+
  static void flush_queued_work(CPUState *cpu)
  {
      struct qemu_work_item *wi;
@@ -1053,6 +1068,11 @@ static void *qemu_kvm_cpu_thread_fn(void *arg)
              }
          }
          qemu_kvm_wait_io_event(cpu);
+        if (cpu->exit && !cpu_can_run(cpu)) {
+            qemu_kvm_destroy_vcpu(cpu);
+            qemu_mutex_unlock(&qemu_global_mutex);


Nit: qemu_mutex_unlock_iothread() may be? Or it is important for iothread_locked to remain "true"? It does not seem to be used much though.



--
Alexey

Reply via email to