qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [RFC PATCH v0] spapr: Disable CPU unplug in TCG mode


From: Bharata B Rao
Subject: Re: [Qemu-devel] [RFC PATCH v0] spapr: Disable CPU unplug in TCG mode
Date: Fri, 30 Sep 2016 08:52:37 +0530
User-agent: Mutt/1.6.1 (2016-04-27)

On Wed, Sep 21, 2016 at 03:31:00PM +1000, David Gibson wrote:
> On Wed, Sep 21, 2016 at 10:18:00AM +0530, Bharata B Rao wrote:
> > CPU unplug doesn't work in TCG mode currently and causes frequent system
> > freeze. In addition to other potential problems, the main problem arises
> > of out the requirement to support synchronous removal of a CPU thread.
> > The CPU thread that performs the cleanup of the unplugged CPU, kicks and
> > waits for the unplugged CPU thread to finish. This wait never finishes in
> > TCG mode when the waiting thread and the unplugged CPU thread are one and
> > the same.
> > 
> > So wait till proper MTTCG support is available before enabling
> > CPU unplug in TCG mode.
> 
> MTTCG seems like a very big hammer to fix this with.  Surely we could
> come up with a simpler interlock that would work for TCG in the
> meantime.

The following hack fixes the issue mostly. I still see some occasional
hangs which points to other potential problems.

diff --git a/cpus.c b/cpus.c
index 8ad1eb4..7dc7d09 100644
--- a/cpus.c
+++ b/cpus.c
@@ -1526,8 +1526,13 @@ void cpu_remove(CPUState *cpu)
 void cpu_remove_sync(CPUState *cpu)
 {
     cpu_remove(cpu);
-    while (cpu->created) {
-        qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
+    if (!kvm_enabled()) {
+        qemu_tcg_destroy_vcpu(cpu);
+        cpu->created = false;
+    } else {
+        while (cpu->created) {
+            qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
+        }
     }
 }
 
@@ -1573,6 +1578,9 @@ static void qemu_tcg_init_vcpu(CPUState *cpu)
         /* For non-MTTCG cases we share the thread */
         cpu->thread = single_tcg_cpu_thread;
         cpu->halt_cond = single_tcg_halt_cond;
+        cpu->thread_id = first_cpu->thread_id;
+        cpu->created = true;
+        cpu->can_do_io = 1;
     }
 }
 
diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c
index dc058e5..9558fc9 100644
--- a/hw/ppc/spapr_rtas.c
+++ b/hw/ppc/spapr_rtas.c
@@ -244,6 +244,7 @@ static void rtas_stop_self(PowerPCCPU *cpu, 
sPAPRMachineState *spapr,
     CPUPPCState *env = &cpu->env;
 
     cs->halted = 1;
+    cs->stop = true;
     qemu_cpu_kick(cs);
     /*
      * While stopping a CPU, the guest calls H_CPPR which

This is however on Alex's MTTCG tree, I need to figure out which are
the fixes that are relavent from Alex's tree to get CPU unplug working
in TCG mode.

Regards,
Bharata.




reply via email to

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