qemu-ppc
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-ppc] [PATCH v5 04/10] cpu: Reclaim vCPU objects


From: Alexey Kardashevskiy
Subject: Re: [Qemu-ppc] [PATCH v5 04/10] cpu: Reclaim vCPU objects
Date: Mon, 30 Nov 2015 18:30:52 +1100
User-agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0

On 11/20/2015 11:54 PM, Bharata B Rao wrote:
From: Gu Zheng <address@hidden>

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/address@hidden/msg102839.html

Signed-off-by: Chen Fan <address@hidden>
Signed-off-by: Gu Zheng <address@hidden>
Signed-off-by: Zhu Guihua <address@hidden>
Signed-off-by: Bharata B Rao <address@hidden>
                [- Explicit CPU_REMOVE() from qemu_kvm/tcg_destroy_vcpu()
                   isn't needed as it is done from cpu_exec_exit()]
Reviewed-by: David Gibson <address@hidden>
---
  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

[Prev in Thread] Current Thread [Next in Thread]