Skip to contentSkip to conversation

s390x: CPU related cleanups and one fix

PATCH Applied David Hildenbrand 3 participants 8 messages Sep 28, 2017 – Sep 29, 2017

lore
Share & tools
lore
#0 lore raw

cover s390x: CPU related cleanups and one fix

Patch 2-5 are split out from the series "[PATCH v1 00/27] s390x: SMP for TCG (+ cleanups)"

They make sense even without the SMP TCG changes, which could still take a while.

David Hildenbrand (5):
MAINTAINERS: use KVM s390x maintainers for kvm-stubs.c and kvm_s390x.h
s390x: raise CPU hotplug irq after really hotplugged s390x/cpumodel: fix max STFL(E) bit number
target/s390x: get rid of next_core_id
s390x: introduce and use S390_MAX_CPUS

 MAINTAINERS                 |  2 ++
 hw/s390x/s390-virtio-ccw.c  |  6 +++++-
 target/s390x/cpu-qom.h      |  2 --
 target/s390x/cpu.c          | 22 +++++++---------------
 target/s390x/cpu.h          |  4 ++++
 target/s390x/cpu_features.c |  2 +-
 target/s390x/cpu_models.c   |  2 ++
 7 files changed, 21 insertions(+), 19 deletions(-)
Signature · 1 line
2.13.5
#1 lore raw

PATCH 1/5 MAINTAINERS: use KVM s390x maintainers for kvm-stubs.c and kvm_s390x.h

Forgot it when factoring code out into these files. This is 100% s390x KVM material.

---
 MAINTAINERS | 2 ++
 1 file changed, 2 insertions(+)
MAINTAINERS +2 -0
index 932443df41..772ac209e1 100644
@@ -299,6 +299,8 @@ M: Cornelia Huck <[email protected]>
 M: Alexander Graf <[email protected]>
 S: Maintained
 F: target/s390x/kvm.c
+F: target/s390x/kvm_s390x.h
+F: target/s390x/kvm-stub.c
 F: target/s390x/ioinst.[ch]
 F: target/s390x/machine.c
 F: hw/intc/s390_flic.c
Signature · 1 line
2.13.5
Acked-by on v1 1/5
#2 lore raw

Re: [Qemu-devel] [PATCH v1 1/5] MAINTAINERS: use KVM s390x maintainers for kvm-stubs.c and kvm_s390x.h

Quoted 4 lines · David Hildenbrand

Forgot it when factoring code out into these files. This is 100% s390x KVM material.

Quoted 18 lines
---
 MAINTAINERS | 2 ++
 1 file changed, 2 insertions(+)
MAINTAINERS +2 -0
index 932443df41..772ac209e1 100644
@@ -299,6 +299,8 @@ M: Cornelia Huck <[email protected]>
 M: Alexander Graf <[email protected]>
 S: Maintained
 F: target/s390x/kvm.c
+F: target/s390x/kvm_s390x.h
+F: target/s390x/kvm-stub.c
 F: target/s390x/ioinst.[ch]
 F: target/s390x/machine.c
 F: hw/intc/s390_flic.c
#3 lore raw

PATCH 2/5 s390x: raise CPU hotplug irq after really hotplugged

In reply to David Hildenbrand

Let's move it into the machine, so we trigger the IRQ after setting ms->possible_cpus (which SCLP uses to construct the list of online CPUs).

This also fixes a problem reported by Thomas Huth, whereby qemu can be crashed using the none machine

qemu-s390x-softmmu -M none -monitor stdio
-> device_add qemu-s390-cpu

---
 hw/s390x/s390-virtio-ccw.c | 4 ++++
 target/s390x/cpu.c         | 8 --------
 2 files changed, 4 insertions(+), 8 deletions(-)
hw/s390x/s390-virtio-ccw.c +4 -0
index 1bcb7000ab..ab234247f6 100644
@@ -305,6 +305,10 @@ static void s390_cpu_plug(HotplugHandler *hotplug_dev,
 
     g_assert(!ms->possible_cpus->cpus[cpu->env.core_id].cpu);
     ms->possible_cpus->cpus[cpu->env.core_id].cpu = OBJECT(dev);
+
+    if (dev->hotplugged) {
+        raise_irq_cpu_hotplug();
+    }
 }
 
 static void s390_machine_reset(void)
target/s390x/cpu.c +0 -8
index 34538c3ab9..4920da3625 100644
@@ -41,7 +41,6 @@
 #include "hw/hw.h"
 #include "sysemu/arch_init.h"
 #include "sysemu/sysemu.h"
-#include "hw/s390x/sclp.h"
 #endif
 
 #define CR0_RESET       0xE0UL
@@ -227,13 +226,6 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
 #endif
 
     scc->parent_realize(dev, &err);
-
-#if !defined(CONFIG_USER_ONLY)
-    if (dev->hotplugged) {
-        raise_irq_cpu_hotplug();
-    }
-#endif
-
 out:
     error_propagate(errp, err);
 }
Signature · 1 line
2.13.5
#4 lore raw

PATCH 3/5 s390x/cpumodel: fix max STFL(E) bit number

In reply to David Hildenbrand

Not that it would matter in the near future, but it is actually 2048 bytes, therefore 16384 possible bits.

---
 target/s390x/cpu_features.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
target/s390x/cpu_features.c +1 -1
index 1d3a036393..31a4676f05 100644
@@ -381,7 +381,7 @@ void s390_add_from_feat_block(S390FeatBitmap features, S390FeatType type,
 
     switch (type) {
     case S390_FEAT_TYPE_STFL:
-       nr_bits = 2048;
+       nr_bits = 16384;
        break;
     case S390_FEAT_TYPE_PLO:
        nr_bits = 256;
Signature · 1 line
2.13.5
#5 lore raw

PATCH 4/5 target/s390x: get rid of next_core_id

In reply to David Hildenbrand

core_id is not needed by linux-user, as the core_id a.k.a. CPU address is only accessible from kernel space.

Therefore, drop next_core_id and make cpu_index get autoassigned again for linux-user.

While at it, shield core_id and cpuid completely from linux-user. cpuid can also only be queried from kernel space.

---
 target/s390x/cpu-qom.h    |  2 --
 target/s390x/cpu.c        | 14 +++++++-------
 target/s390x/cpu.h        |  2 ++
 target/s390x/cpu_models.c |  2 ++
 4 files changed, 11 insertions(+), 9 deletions(-)
target/s390x/cpu-qom.h +0 -2
index 2e446fab51..0510c49e07 100644
@@ -54,8 +54,6 @@ typedef struct S390CPUClass {
     bool is_migration_safe;
     const char *desc;
 
-    uint32_t next_core_id;
-
     DeviceRealize parent_realize;
     void (*parent_reset)(CPUState *cpu);
     void (*load_normal)(CPUState *cpu);
target/s390x/cpu.c +7 -7
index 4920da3625..f42e28ea25 100644
@@ -178,8 +178,9 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
 {
     CPUState *cs = CPU(dev);
     S390CPUClass *scc = S390_CPU_GET_CLASS(dev);
+#if !defined(CONFIG_USER_ONLY)
     S390CPU *cpu = S390_CPU(dev);
-    CPUS390XState *env = &cpu->env;
+#endif
     Error *err = NULL;
 
     /* the model has to be realized before qemu_init_vcpu() due to kvm */
@@ -195,11 +196,6 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
                    max_cpus - 1);
         goto out;
     }
-#else
-    /* implicitly set for linux-user only */
-    cpu->env.core_id = scc->next_core_id;
-    scc->next_core_id++;
-#endif
 
     if (cpu_exists(cpu->env.core_id)) {
         error_setg(&err, "Unable to add CPU with core-id: %" PRIu32
@@ -208,7 +204,9 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
     }
 
     /* sync cs->cpu_index and env->core_id. The latter is needed for TCG. */
-    cs->cpu_index = env->core_id;
+    cs->cpu_index = cpu->env.core_id;
+#endif
+
     cpu_exec_realizefn(cs, &err);
     if (err != NULL) {
         goto out;
@@ -440,7 +438,9 @@ static gchar *s390_gdb_arch_name(CPUState *cs)
 }
 
 static Property s390x_cpu_properties[] = {
+#if !defined(CONFIG_USER_ONLY)
     DEFINE_PROP_UINT32("core-id", S390CPU, env.core_id, 0),
+#endif
     DEFINE_PROP_END_OF_LIST()
 };
 
target/s390x/cpu.h +2 -0
index c57ef71f6d..ff3cc59c02 100644
@@ -151,8 +151,10 @@ struct CPUS390XState {
 
     CPU_COMMON
 
+#if !defined(CONFIG_USER_ONLY)
     uint32_t core_id; /* PoP "CPU address", same as cpu_index */
     uint64_t cpuid;
+#endif
 
     uint64_t tod_offset;
     uint64_t tod_basetime;
target/s390x/cpu_models.c +2 -0
index 48dd7beddd..07ef8a3b6e 100644
@@ -945,11 +945,13 @@ void s390_realize_cpu_model(CPUState *cs, Error **errp)
 
     apply_cpu_model(cpu->model, errp);
 
+#if !defined(CONFIG_USER_ONLY)
     cpu->env.cpuid = s390_cpuid_from_cpu_model(cpu->model);
     if (tcg_enabled()) {
         /* basic mode, write the cpu address into the first 4 bit of the ID */
         cpu->env.cpuid = deposit64(cpu->env.cpuid, 54, 4, cpu->env.core_id);
     }
+#endif
 }
 
 static void get_feature(Object *obj, Visitor *v, const char *name,
Signature · 1 line
2.13.5
#6 lore raw

PATCH 5/5 s390x: introduce and use S390_MAX_CPUS

In reply to David Hildenbrand

Will be handy in the future.

---
 hw/s390x/s390-virtio-ccw.c | 2 +-
 target/s390x/cpu.h         | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)
hw/s390x/s390-virtio-ccw.c +1 -1
index ab234247f6..dfc107b400 100644
@@ -421,7 +421,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
     mc->no_parallel = 1;
     mc->no_sdcard = 1;
     mc->use_sclp = 1;
-    mc->max_cpus = 248;
+    mc->max_cpus = S390_MAX_CPUS;
     mc->has_hotpluggable_cpus = true;
     mc->get_hotplug_handler = s390_get_hotplug_handler;
     mc->cpu_index_to_instance_props = s390_cpu_index_to_props;
target/s390x/cpu.h +2 -0
index ff3cc59c02..7e864c8478 100644
@@ -60,6 +60,8 @@
 #define PSW_MCHK_MASK 0x0004000000000000
 #define PSW_IO_MASK 0x0200000000000000
 
+#define S390_MAX_CPUS 248
+
 typedef struct PSW {
     uint64_t mask;
     uint64_t addr;
Signature · 1 line
2.13.5
#7 lore raw
In reply to David Hildenbrand
Quoted 13 lines · On Thu, 28 Sep 2017 15:46:04 +0200 David Hildenbrand <[email protected]> wrote:

Patch 2-5 are split out from the series "[PATCH v1 00/27] s390x: SMP for TCG (+ cleanups)"

They make sense even without the SMP TCG changes, which could still take a while.

David Hildenbrand (5):
MAINTAINERS: use KVM s390x maintainers for kvm-stubs.c and kvm_s390x.h
s390x: raise CPU hotplug irq after really hotplugged s390x/cpumodel: fix max STFL(E) bit number
target/s390x: get rid of next_core_id
s390x: introduce and use S390_MAX_CPUS

Quoted 9 lines
 MAINTAINERS                 |  2 ++
 hw/s390x/s390-virtio-ccw.c  |  6 +++++-
 target/s390x/cpu-qom.h      |  2 --
 target/s390x/cpu.c          | 22 +++++++---------------
 target/s390x/cpu.h          |  4 ++++
 target/s390x/cpu_features.c |  2 +-
 target/s390x/cpu_models.c   |  2 ++
 7 files changed, 21 insertions(+), 19 deletions(-)

Thanks, applied.