qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 6/8] [PATCH RFC v3] s390-qemu: cpu hotplug - s390 cp


From: Jason J. Herne
Subject: [Qemu-devel] [PATCH 6/8] [PATCH RFC v3] s390-qemu: cpu hotplug - s390 cpu init improvements for hotplug
Date: Thu, 1 Aug 2013 10:12:37 -0400

From: "Jason J. Herne" <address@hidden>

    s390_new_cpu is created to encapsulate the creation of a new QOM S390CPU
    object given a cpuid and a model string.

    All actual cpu initialization code is moved from boot time specific 
functions to
    s390_cpu_initfn (qom init routine) or to s390_new_cpu. This is done to 
allow us
    to use the same basic code path for a cpu created at boot time and one 
created
    during a hotplug operation.

Signed-off-by: Jason J. Herne <address@hidden>
---
 hw/s390x/s390-virtio.c |   25 ++++++++++++-------------
 target-s390x/cpu.c     |    4 ++--
 target-s390x/cpu.h     |    1 +
 target-s390x/helper.c  |   12 ++++++++++++
 4 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
index 5ad9cf3..103f32e 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -56,11 +56,16 @@ static S390CPU **ipi_states;
 
 void s390_cpu_set_ipistate(uint16_t cpu_addr, S390CPU *state)
 {
-    ipi_states[cpu_addr] = state;
+    if (cpu_addr < max_cpus) {
+        ipi_states[cpu_addr] = state;
+    }
 }
 
 S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
 {
+    if (cpu_addr >= max_cpus) {
+        return NULL;
+    }
     return ipi_states[cpu_addr];
 }
 
@@ -197,19 +202,13 @@ void s390_init_cpus(const char *cpu_model)
         cpu_model = "host";
     }
 
-    ipi_states = g_malloc(sizeof(S390CPU *) * smp_cpus);
-
-    for (i = 0; i < smp_cpus; i++) {
-        S390CPU *cpu;
-        CPUState *cs;
+    ipi_states = g_malloc(sizeof(S390CPU *) * max_cpus);
 
-        cpu = cpu_s390x_init(cpu_model);
-        cs = CPU(cpu);
-
-        ipi_states[i] = cpu;
-        cs->halted = 1;
-        cpu->env.exception_index = EXCP_HLT;
-        cpu->env.storage_keys = s390_get_storage_keys();
+    for (i = 0; i < max_cpus; i++) {
+        ipi_states[i] = NULL;
+        if (i < smp_cpus) {
+            s390_new_cpu(cpu_model, i);
+        }
     }
 }
 
diff --git a/target-s390x/cpu.c b/target-s390x/cpu.c
index 6be6c08..c90a91c 100644
--- a/target-s390x/cpu.c
+++ b/target-s390x/cpu.c
@@ -116,7 +116,6 @@ static void s390_cpu_initfn(Object *obj)
     S390CPU *cpu = S390_CPU(obj);
     CPUS390XState *env = &cpu->env;
     static bool inited;
-    static int cpu_num = 0;
 #if !defined(CONFIG_USER_ONLY)
     struct tm tm;
 #endif
@@ -135,8 +134,9 @@ static void s390_cpu_initfn(Object *obj)
      * cpu counter in s390_cpu_reset to a negative number at
      * initial ipl */
     cs->halted = 1;
+    cpu->env.exception_index = EXCP_HLT;
+    env->storage_keys = s390_get_storage_keys();
 #endif
-    env->cpu_num = cpu_num++;
     env->ext_index = -1;
 
     if (tcg_enabled() && !inited) {
diff --git a/target-s390x/cpu.h b/target-s390x/cpu.h
index 62eb810..0f68dd0 100644
--- a/target-s390x/cpu.h
+++ b/target-s390x/cpu.h
@@ -315,6 +315,7 @@ static inline int get_ilen(uint8_t opc)
 #endif
 
 S390CPU *cpu_s390x_init(const char *cpu_model);
+S390CPU *s390_new_cpu(const char *cpu_model, int64_t cpuid);
 void s390x_translate_init(void);
 int cpu_s390x_exec(CPUS390XState *s);
 
diff --git a/target-s390x/helper.c b/target-s390x/helper.c
index 61abfd7..a39b148 100644
--- a/target-s390x/helper.c
+++ b/target-s390x/helper.c
@@ -70,6 +70,18 @@ void s390x_cpu_timer(void *opaque)
 }
 #endif
 
+S390CPU *s390_new_cpu(const char *cpu_model, int64_t cpuid)
+{
+    S390CPU *cpu;
+
+    cpu = cpu_s390x_init(cpu_model);
+    cpu->env.cpu_num = cpuid;
+#if !defined(CONFIG_USER_ONLY)
+    s390_cpu_set_ipistate(cpuid, cpu);
+#endif
+    return cpu;
+}
+
 S390CPU *cpu_s390x_init(const char *cpu_model)
 {
     S390CPU *cpu;
-- 
1.7.10.4




reply via email to

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