qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v4 05/10] qom/cpu: move register_vmstate to comm


From: Chen Fan
Subject: Re: [Qemu-devel] [PATCH v4 05/10] qom/cpu: move register_vmstate to common CPUClass.realizefn
Date: Fri, 6 Mar 2015 17:31:43 +0800
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0


On 03/06/2015 04:53 PM, Igor Mammedov wrote:
On Fri, 13 Feb 2015 18:25:28 +0800
Zhu Guihua <address@hidden> wrote:

From: Gu Zheng <address@hidden>

Move cpu vmstate register from cpu_exec_init into cpu_common_realizefn,
and use cc->get_arch_id as the instance id that suggested by Igor to
fix the migration issue.

Signed-off-by: Gu Zheng <address@hidden>
Signed-off-by: Zhu Guihua <address@hidden>
---
  exec.c            | 25 ++++++++++++++++++-------
  include/qom/cpu.h |  2 ++
  qom/cpu.c         |  4 ++++
  3 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/exec.c b/exec.c
index 6dff7bc..8361591 100644
--- a/exec.c
+++ b/exec.c
@@ -513,10 +513,26 @@ void tcg_cpu_address_space_init(CPUState *cpu, 
AddressSpace *as)
  }
  #endif
+void cpu_vmstate_register(CPUState *cpu)
+{
+    CPUClass *cc = CPU_GET_CLASS(cpu);
+    int cpu_index = cc->get_arch_id(cpu) + max_cpus;
Why do you add max_cpus here?
Adding max_cpus is to avoid cpu_index equals comat_index which would
cause migration fails, this reason is that find_se() always compares instance_id
with se->instance_id or se->alias_id when do migration.

Thanks,
Chen


+    int compat_index = cc->get_compat_arch_id(cpu);
+
+    if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
+        vmstate_register_with_alias_id(NULL, cpu_index, &vmstate_cpu_common,
+                                       cpu, compat_index, 3);
+    }
+
+    if (cc->vmsd != NULL) {
+        vmstate_register_with_alias_id(NULL, cpu_index, cc->vmsd,
+                                       cpu, compat_index, 3);
+    }
+}
+
  void cpu_exec_init(CPUArchState *env)
  {
      CPUState *cpu = ENV_GET_CPU(env);
-    CPUClass *cc = CPU_GET_CLASS(cpu);
      CPUState *some_cpu;
      int cpu_index;
@@ -539,18 +555,13 @@ void cpu_exec_init(CPUArchState *env)
  #if defined(CONFIG_USER_ONLY)
      cpu_list_unlock();
  #endif
-    if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
-        vmstate_register(NULL, cpu_index, &vmstate_cpu_common, cpu);
-    }
  #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
+    CPUClass *cc = CPU_GET_CLASS(cpu);
      register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
                      cpu_save, cpu_load, env);
      assert(cc->vmsd == NULL);
      assert(qdev_get_vmsd(DEVICE(cpu)) == NULL);
  #endif
-    if (cc->vmsd != NULL) {
-        vmstate_register(NULL, cpu_index, cc->vmsd, cpu);
-    }
  }
#if defined(CONFIG_USER_ONLY)
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 2e68dd2..d0a50e2 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -565,6 +565,8 @@ void cpu_interrupt(CPUState *cpu, int mask);
#endif /* USER_ONLY */ +void cpu_vmstate_register(CPUState *cpu);
+
  #ifdef CONFIG_SOFTMMU
  static inline void cpu_unassigned_access(CPUState *cpu, hwaddr addr,
                                           bool is_write, bool is_exec,
diff --git a/qom/cpu.c b/qom/cpu.c
index 83d7766..8e37045 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -302,6 +302,10 @@ static void cpu_common_realizefn(DeviceState *dev, Error 
**errp)
  {
      CPUState *cpu = CPU(dev);
+#if !defined(CONFIG_USER_ONLY)
+    cpu_vmstate_register(cpu);
+#endif
+
      if (dev->hotplugged) {
          cpu_synchronize_post_init(cpu);
          cpu_resume(cpu);
.





reply via email to

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