All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add
@ 2017-09-07 20:13 David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 01/21] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly David Hildenbrand
                   ` (20 more replies)
  0 siblings, 21 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

The first patches are a bunch of cleanups. I decided to go the
extra mile and implement CPU hotplug via "device_add", as well as
"query-hotpluggable-cpus".

On s390x, only complete cores can be plugged. CPU hot unplug is currently
not supported by the architecture.

In contrast to v2, this series now also adds support for hotplugging CPUs
in random core-id order (last two patches). We once hat a KVM bug
preventing this, but the stable patch should now be included in relevant
places - 152e9f65d66f ("KVM: s390: fix wrong lookup of VCPUs by array
index"). Current tooling will plug them in sequential order anyway, so
it should not hurt.

I am pretty sure now that this patch series won't grow even more :)


v2 -> v3:
* "exec,dump,i386,ppc,s390x: don't include exec/cpu-all.h explicitly"
 - dropped removal of one unrelated include
* "s390x: move subsystem_reset() to s390-virtio-ccw.h"
 - previously "s390x: move two function declarations to s390-virtio-ccw.h"
 - as Thomas requested, s390_cpu_addr2state() will be later moved to cpu.c
* "s390x: move sclp_service_call() to sclp.h"
 - previously "s390x: move sclp_service_call() to interrupt.c"
 - only move the declaration and make it compile
* "s390x: allow only 1 CPU with TCG"
 - switch to simple ifdef. Let's see what people think about this one :)
* "s390x: print CPU definitions in sorted order"
 - fix host model getting reported as static :(
* "s390x: CPU hot unplug via device_del cannot work"
 - use the term "currently" instead of "never"
* "s390x: implement query-hotpluggable-cpus"
 - as requested by Thomas, moving s390_cpu_addr2state() to cpu.c
* added "s390x: generate sclp cpu information from possible_cpus"
* added "s390x: allow CPU hotplug in random core-id order"


David Hildenbrand (21):
  exec,dump,i386,ppc,s390x: don't include exec/cpu-all.h explicitly
  cpu: drop old comments describing members
  s390x: get rid of s390-virtio.c
  s390x: rename s390-virtio.h to s390-virtio-hcall.h
  target/s390x: move typedef of S390CPU to its definition
  s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h
  s390x: move subsystem_reset() to s390-virtio-ccw.h
  s390x: move sclp_service_call() to sclp.h
  target/s390x: use trigger_pgm_exception() in
    s390_cpu_handle_mmu_fault()
  target/s390x: use program_interrupt() in per_check_exception()
  s390x: allow only 1 CPU with TCG
  target/s390x: set cpu->id for linux user when realizing
  target/s390x: use "core-id" for cpu number/address/id handling
  target/s390x: rename next_cpu_id to next_core_id
  s390x: print CPU definitions in sorted order
  s390x: allow cpu hotplug via device_add
  s390x: CPU hot unplug via device_del cannot work for now
  s390x: implement query-hotpluggable-cpus
  s390x: get rid of cpu_s390x_create()
  s390x: generate sclp cpu information from possible_cpus
  s390x: allow CPU hotplug in random core-id order

 dump.c                             |   1 -
 exec.c                             |   1 -
 hw/s390x/Makefile.objs             |   1 -
 hw/s390x/s390-virtio-ccw.c         | 245 +++++++++++++++++++++++++++++++++++--
 hw/s390x/s390-virtio-hcall.c       |   2 +-
 hw/s390x/s390-virtio-hcall.h       |  21 ++++
 hw/s390x/s390-virtio.c             |  37 ------
 hw/s390x/s390-virtio.h             |  35 ------
 hw/s390x/sclp.c                    |  34 +++--
 include/hw/s390x/s390-virtio-ccw.h |   2 +
 include/hw/s390x/sclp.h            |   2 +
 include/qom/cpu.h                  |   6 +-
 qapi-schema.json                   |  16 +++
 target/i386/arch_dump.c            |   1 -
 target/i386/arch_memory_mapping.c  |   1 -
 target/i386/svm_helper.c           |   1 -
 target/ppc/arch_dump.c             |   1 -
 target/s390x/arch_dump.c           |   1 -
 target/s390x/cpu-qom.h             |   4 +-
 target/s390x/cpu.c                 | 101 ++++++---------
 target/s390x/cpu.h                 |  17 +--
 target/s390x/cpu_models.c          |  58 ++++++---
 target/s390x/diag.c                |   1 +
 target/s390x/excp_helper.c         |   5 +-
 target/s390x/helper.c              |  47 +------
 target/s390x/internal.h            |   1 -
 target/s390x/kvm.c                 |   1 +
 target/s390x/misc_helper.c         |  21 ++--
 target/s390x/translate.c           |   5 +-
 29 files changed, 400 insertions(+), 269 deletions(-)
 create mode 100644 hw/s390x/s390-virtio-hcall.h
 delete mode 100644 hw/s390x/s390-virtio.h

-- 
2.13.5

^ permalink raw reply	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 01/21] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 02/21] cpu: drop old comments describing members David Hildenbrand
                   ` (19 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

All but a handful of files include exec/cpu-all.h via cpu.h only.
As these files already include cpu.h, let's just drop the additional
include.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 dump.c                            | 1 -
 exec.c                            | 1 -
 target/i386/arch_dump.c           | 1 -
 target/i386/arch_memory_mapping.c | 1 -
 target/i386/svm_helper.c          | 1 -
 target/ppc/arch_dump.c            | 1 -
 target/s390x/arch_dump.c          | 1 -
 7 files changed, 7 deletions(-)

diff --git a/dump.c b/dump.c
index a79773d0f7..2ef6a678e8 100644
--- a/dump.c
+++ b/dump.c
@@ -15,7 +15,6 @@
 #include "qemu/cutils.h"
 #include "elf.h"
 #include "cpu.h"
-#include "exec/cpu-all.h"
 #include "exec/hwaddr.h"
 #include "monitor/monitor.h"
 #include "sysemu/kvm.h"
diff --git a/exec.c b/exec.c
index d20c34ca83..a25a4c6018 100644
--- a/exec.c
+++ b/exec.c
@@ -56,7 +56,6 @@
 #endif
 
 #endif
-#include "exec/cpu-all.h"
 #include "qemu/rcu_queue.h"
 #include "qemu/main-loop.h"
 #include "translate-all.h"
diff --git a/target/i386/arch_dump.c b/target/i386/arch_dump.c
index e682904052..35b55fc200 100644
--- a/target/i386/arch_dump.c
+++ b/target/i386/arch_dump.c
@@ -13,7 +13,6 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
-#include "exec/cpu-all.h"
 #include "sysemu/dump.h"
 #include "elf.h"
 #include "sysemu/memory_mapping.h"
diff --git a/target/i386/arch_memory_mapping.c b/target/i386/arch_memory_mapping.c
index 647cff2829..271cb5e41b 100644
--- a/target/i386/arch_memory_mapping.c
+++ b/target/i386/arch_memory_mapping.c
@@ -13,7 +13,6 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
-#include "exec/cpu-all.h"
 #include "sysemu/memory_mapping.h"
 
 /* PAE Paging or IA-32e Paging */
diff --git a/target/i386/svm_helper.c b/target/i386/svm_helper.c
index 59e8b5091c..f479239875 100644
--- a/target/i386/svm_helper.c
+++ b/target/i386/svm_helper.c
@@ -19,7 +19,6 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
-#include "exec/cpu-all.h"
 #include "exec/helper-proto.h"
 #include "exec/exec-all.h"
 #include "exec/cpu_ldst.h"
diff --git a/target/ppc/arch_dump.c b/target/ppc/arch_dump.c
index 8e9397aa58..beb7268e57 100644
--- a/target/ppc/arch_dump.c
+++ b/target/ppc/arch_dump.c
@@ -15,7 +15,6 @@
 #include "qemu/osdep.h"
 #include "cpu.h"
 #include "elf.h"
-#include "exec/cpu-all.h"
 #include "sysemu/dump.h"
 #include "sysemu/kvm.h"
 
diff --git a/target/s390x/arch_dump.c b/target/s390x/arch_dump.c
index 9b0bf92698..6f61ff95af 100644
--- a/target/s390x/arch_dump.c
+++ b/target/s390x/arch_dump.c
@@ -15,7 +15,6 @@
 #include "cpu.h"
 #include "internal.h"
 #include "elf.h"
-#include "exec/cpu-all.h"
 #include "sysemu/dump.h"
 
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 02/21] cpu: drop old comments describing members
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 01/21] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 03/21] s390x: get rid of s390-virtio.c David Hildenbrand
                   ` (18 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

These comments are obviously stale.

Acked-by: Cornelia Huck <cohuck@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 include/qom/cpu.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 995a7beeb5..0dc767a753 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -388,10 +388,10 @@ struct CPUState {
     DECLARE_BITMAP(trace_dstate, CPU_TRACE_DSTATE_MAX_EVENTS);
 
     /* TODO Move common fields from CPUArchState here. */
-    int cpu_index; /* used by alpha TCG */
-    uint32_t halted; /* used by alpha, cris, ppc TCG */
+    int cpu_index;
+    uint32_t halted;
     uint32_t can_do_io;
-    int32_t exception_index; /* used by m68k TCG */
+    int32_t exception_index;
 
     /* shared by kvm, hax and hvf */
     bool vcpu_dirty;
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 03/21] s390x: get rid of s390-virtio.c
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 01/21] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 02/21] cpu: drop old comments describing members David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 04/21] s390x: rename s390-virtio.h to s390-virtio-hcall.h David Hildenbrand
                   ` (17 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

It is a leftover from the days where we had still the !ccw virtio
machine. As this one is long gone, let's move everything to
s390-virtio-ccw.c.

Suggested-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/Makefile.objs     |   1 -
 hw/s390x/s390-virtio-ccw.c | 157 ++++++++++++++++++++++++++++++++++++++++++++-
 hw/s390x/s390-virtio.c     |  37 -----------
 hw/s390x/s390-virtio.h     |  15 -----
 4 files changed, 156 insertions(+), 54 deletions(-)

diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs
index 7ee19d3abc..dc704b57d6 100644
--- a/hw/s390x/Makefile.objs
+++ b/hw/s390x/Makefile.objs
@@ -1,4 +1,3 @@
-obj-y += s390-virtio.o
 obj-y += s390-virtio-hcall.o
 obj-y += sclp.o
 obj-y += event-facility.o
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index dd504dd5ae..4c3a3e177b 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -2,6 +2,7 @@
  * virtio ccw machine
  *
  * Copyright 2012 IBM Corp.
+ * Copyright (c) 2009 Alexander Graf <agraf@suse.de>
  * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
  *
  * This work is licensed under the terms of the GNU GPL, version 2 or (at
@@ -31,6 +32,46 @@
 #include "hw/s390x/css-bridge.h"
 #include "migration/register.h"
 #include "cpu_models.h"
+#include "qapi/qmp/qerror.h"
+#include "hw/nmi.h"
+
+static S390CPU **cpu_states;
+
+S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
+{
+    if (cpu_addr >= max_cpus) {
+        return NULL;
+    }
+
+    /* Fast lookup via CPU ID */
+    return cpu_states[cpu_addr];
+}
+
+static void s390_init_cpus(MachineState *machine)
+{
+    int i;
+    gchar *name;
+
+    if (machine->cpu_model == NULL) {
+        machine->cpu_model = s390_default_cpu_model_name();
+    }
+
+    cpu_states = g_new0(S390CPU *, max_cpus);
+
+    for (i = 0; i < max_cpus; i++) {
+        name = g_strdup_printf("cpu[%i]", i);
+        object_property_add_link(OBJECT(machine), name, TYPE_S390_CPU,
+                                 (Object **) &cpu_states[i],
+                                 object_property_allow_set_link,
+                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
+                                 &error_abort);
+        g_free(name);
+    }
+
+    for (i = 0; i < smp_cpus; i++) {
+        s390x_new_cpu(machine->cpu_model, i, &error_fatal);
+    }
+}
 
 static const char *const reset_dev_types[] = {
     TYPE_VIRTUAL_CSS_BRIDGE,
@@ -94,7 +135,7 @@ static void virtio_ccw_register_hcalls(void)
                                    virtio_ccw_hcall_early_printk);
 }
 
-void s390_memory_init(ram_addr_t mem_size)
+static void s390_memory_init(ram_addr_t mem_size)
 {
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
@@ -109,11 +150,103 @@ void s390_memory_init(ram_addr_t mem_size)
     s390_stattrib_init();
 }
 
+#define S390_TOD_CLOCK_VALUE_MISSING    0x00
+#define S390_TOD_CLOCK_VALUE_PRESENT    0x01
+
+static void gtod_save(QEMUFile *f, void *opaque)
+{
+    uint64_t tod_low;
+    uint8_t tod_high;
+    int r;
+
+    r = s390_get_clock(&tod_high, &tod_low);
+    if (r) {
+        fprintf(stderr, "WARNING: Unable to get guest clock for migration. "
+                        "Error code %d. Guest clock will not be migrated "
+                        "which could cause the guest to hang.\n", r);
+        qemu_put_byte(f, S390_TOD_CLOCK_VALUE_MISSING);
+        return;
+    }
+
+    qemu_put_byte(f, S390_TOD_CLOCK_VALUE_PRESENT);
+    qemu_put_byte(f, tod_high);
+    qemu_put_be64(f, tod_low);
+}
+
+static int gtod_load(QEMUFile *f, void *opaque, int version_id)
+{
+    uint64_t tod_low;
+    uint8_t tod_high;
+    int r;
+
+    if (qemu_get_byte(f) == S390_TOD_CLOCK_VALUE_MISSING) {
+        fprintf(stderr, "WARNING: Guest clock was not migrated. This could "
+                        "cause the guest to hang.\n");
+        return 0;
+    }
+
+    tod_high = qemu_get_byte(f);
+    tod_low = qemu_get_be64(f);
+
+    r = s390_set_clock(&tod_high, &tod_low);
+    if (r) {
+        fprintf(stderr, "WARNING: Unable to set guest clock value. "
+                        "s390_get_clock returned error %d. This could cause "
+                        "the guest to hang.\n", r);
+    }
+
+    return 0;
+}
+
 static SaveVMHandlers savevm_gtod = {
     .save_state = gtod_save,
     .load_state = gtod_load,
 };
 
+static void s390_init_ipl_dev(const char *kernel_filename,
+                              const char *kernel_cmdline,
+                              const char *initrd_filename, const char *firmware,
+                              const char *netboot_fw, bool enforce_bios)
+{
+    Object *new = object_new(TYPE_S390_IPL);
+    DeviceState *dev = DEVICE(new);
+
+    if (kernel_filename) {
+        qdev_prop_set_string(dev, "kernel", kernel_filename);
+    }
+    if (initrd_filename) {
+        qdev_prop_set_string(dev, "initrd", initrd_filename);
+    }
+    qdev_prop_set_string(dev, "cmdline", kernel_cmdline);
+    qdev_prop_set_string(dev, "firmware", firmware);
+    qdev_prop_set_string(dev, "netboot_fw", netboot_fw);
+    qdev_prop_set_bit(dev, "enforce_bios", enforce_bios);
+    object_property_add_child(qdev_get_machine(), TYPE_S390_IPL,
+                              new, NULL);
+    object_unref(new);
+    qdev_init_nofail(dev);
+}
+
+static void s390_create_virtio_net(BusState *bus, const char *name)
+{
+    int i;
+
+    for (i = 0; i < nb_nics; i++) {
+        NICInfo *nd = &nd_table[i];
+        DeviceState *dev;
+
+        if (!nd->model) {
+            nd->model = g_strdup("virtio");
+        }
+
+        qemu_check_nic_model(nd, "virtio");
+
+        dev = qdev_create(bus, name);
+        qdev_set_nic_properties(dev, nd);
+        qdev_init_nofail(dev);
+    }
+}
+
 static void ccw_init(MachineState *machine)
 {
     int ret;
@@ -177,6 +310,19 @@ static void s390_cpu_plug(HotplugHandler *hotplug_dev,
     g_free(name);
 }
 
+static void s390_machine_reset(void)
+{
+    S390CPU *ipl_cpu = S390_CPU(qemu_get_cpu(0));
+
+    s390_cmma_reset();
+    qemu_devices_reset();
+    s390_crypto_reset();
+
+    /* all cpus are stopped - configure and start the ipl cpu only */
+    s390_ipl_prepare_cpu(ipl_cpu);
+    s390_cpu_set_state(CPU_STATE_OPERATING, ipl_cpu);
+}
+
 static void s390_machine_device_plug(HotplugHandler *hotplug_dev,
                                      DeviceState *dev, Error **errp)
 {
@@ -201,6 +347,15 @@ static void s390_hot_add_cpu(const int64_t id, Error **errp)
     s390x_new_cpu(machine->cpu_model, id, errp);
 }
 
+static void s390_nmi(NMIState *n, int cpu_index, Error **errp)
+{
+    CPUState *cs = qemu_get_cpu(cpu_index);
+
+    if (s390_cpu_restart(S390_CPU(cs))) {
+        error_setg(errp, QERR_UNSUPPORTED);
+    }
+}
+
 static void ccw_machine_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
diff --git a/hw/s390x/s390-virtio.c b/hw/s390x/s390-virtio.c
index da3f49e80e..9316be1cfc 100644
--- a/hw/s390x/s390-virtio.c
+++ b/hw/s390x/s390-virtio.c
@@ -48,17 +48,6 @@
 #define S390_TOD_CLOCK_VALUE_MISSING    0x00
 #define S390_TOD_CLOCK_VALUE_PRESENT    0x01
 
-static S390CPU **cpu_states;
-
-S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
-{
-    if (cpu_addr >= max_cpus) {
-        return NULL;
-    }
-
-    /* Fast lookup via CPU ID */
-    return cpu_states[cpu_addr];
-}
 
 void s390_init_ipl_dev(const char *kernel_filename,
                        const char *kernel_cmdline,
@@ -86,32 +75,6 @@ void s390_init_ipl_dev(const char *kernel_filename,
     qdev_init_nofail(dev);
 }
 
-void s390_init_cpus(MachineState *machine)
-{
-    int i;
-    gchar *name;
-
-    if (machine->cpu_model == NULL) {
-        machine->cpu_model = s390_default_cpu_model_name();
-    }
-
-    cpu_states = g_new0(S390CPU *, max_cpus);
-
-    for (i = 0; i < max_cpus; i++) {
-        name = g_strdup_printf("cpu[%i]", i);
-        object_property_add_link(OBJECT(machine), name, TYPE_S390_CPU,
-                                 (Object **) &cpu_states[i],
-                                 object_property_allow_set_link,
-                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
-                                 &error_abort);
-        g_free(name);
-    }
-
-    for (i = 0; i < smp_cpus; i++) {
-        s390x_new_cpu(machine->cpu_model, i, &error_fatal);
-    }
-}
-
 
 void s390_create_virtio_net(BusState *bus, const char *name)
 {
diff --git a/hw/s390x/s390-virtio.h b/hw/s390x/s390-virtio.h
index ca97fd6814..d984cd4115 100644
--- a/hw/s390x/s390-virtio.h
+++ b/hw/s390x/s390-virtio.h
@@ -12,24 +12,9 @@
 #ifndef HW_S390_VIRTIO_H
 #define HW_S390_VIRTIO_H
 
-#include "hw/nmi.h"
 #include "standard-headers/asm-s390/kvm_virtio.h"
 #include "standard-headers/asm-s390/virtio-ccw.h"
 
 typedef int (*s390_virtio_fn)(const uint64_t *args);
 void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn);
-
-void s390_init_cpus(MachineState *machine);
-void s390_init_ipl_dev(const char *kernel_filename,
-                       const char *kernel_cmdline,
-                       const char *initrd_filename,
-                       const char *firmware,
-                       const char *netboot_fw,
-                       bool enforce_bios);
-void s390_create_virtio_net(BusState *bus, const char *name);
-void s390_nmi(NMIState *n, int cpu_index, Error **errp);
-void s390_machine_reset(void);
-void s390_memory_init(ram_addr_t mem_size);
-void gtod_save(QEMUFile *f, void *opaque);
-int gtod_load(QEMUFile *f, void *opaque, int version_id);
 #endif
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 04/21] s390x: rename s390-virtio.h to s390-virtio-hcall.h
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (2 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 03/21] s390x: get rid of s390-virtio.c David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 05/21] target/s390x: move typedef of S390CPU to its definition David Hildenbrand
                   ` (16 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

The only interface left, so let's properly rename it.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c                      | 2 +-
 hw/s390x/s390-virtio-hcall.c                    | 2 +-
 hw/s390x/{s390-virtio.h => s390-virtio-hcall.h} | 8 ++++----
 3 files changed, 6 insertions(+), 6 deletions(-)
 rename hw/s390x/{s390-virtio.h => s390-virtio-hcall.h} (77%)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 4c3a3e177b..f67b4b5d58 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -16,7 +16,7 @@
 #include "cpu.h"
 #include "hw/boards.h"
 #include "exec/address-spaces.h"
-#include "s390-virtio.h"
+#include "hw/s390x/s390-virtio-hcall.h"
 #include "hw/s390x/sclp.h"
 #include "hw/s390x/s390_flic.h"
 #include "hw/s390x/ioinst.h"
diff --git a/hw/s390x/s390-virtio-hcall.c b/hw/s390x/s390-virtio-hcall.c
index 23d67d6170..ec7cf8beb3 100644
--- a/hw/s390x/s390-virtio-hcall.c
+++ b/hw/s390x/s390-virtio-hcall.c
@@ -11,7 +11,7 @@
 
 #include "qemu/osdep.h"
 #include "cpu.h"
-#include "hw/s390x/s390-virtio.h"
+#include "hw/s390x/s390-virtio-hcall.h"
 
 #define MAX_DIAG_SUBCODES 255
 
diff --git a/hw/s390x/s390-virtio.h b/hw/s390x/s390-virtio-hcall.h
similarity index 77%
rename from hw/s390x/s390-virtio.h
rename to hw/s390x/s390-virtio-hcall.h
index d984cd4115..59fcba3a06 100644
--- a/hw/s390x/s390-virtio.h
+++ b/hw/s390x/s390-virtio-hcall.h
@@ -1,5 +1,5 @@
 /*
- * Virtio interfaces for s390
+ * Support for virtio hypercalls on s390x
  *
  * Copyright 2012 IBM Corp.
  * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
@@ -9,12 +9,12 @@
  * directory.
  */
 
-#ifndef HW_S390_VIRTIO_H
-#define HW_S390_VIRTIO_H
+#ifndef HW_S390_VIRTIO_HCALL_H
+#define HW_S390_VIRTIO_HCALL_H
 
 #include "standard-headers/asm-s390/kvm_virtio.h"
 #include "standard-headers/asm-s390/virtio-ccw.h"
 
 typedef int (*s390_virtio_fn)(const uint64_t *args);
 void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn);
-#endif
+#endif /* HW_S390_VIRTIO_HCALL_H */
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 05/21] target/s390x: move typedef of S390CPU to its definition
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (3 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 04/21] s390x: rename s390-virtio.h to s390-virtio-hcall.h David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 06/21] s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h David Hildenbrand
                   ` (15 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Let's move it to the place where struct S390CPU is defined.

Suggested-by: Thomas Huth <thuth@redhat.com>
Tested-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/cpu-qom.h | 2 --
 target/s390x/cpu.h     | 4 ++--
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/target/s390x/cpu-qom.h b/target/s390x/cpu-qom.h
index 4e936e7788..c8fbf8ae03 100644
--- a/target/s390x/cpu-qom.h
+++ b/target/s390x/cpu-qom.h
@@ -61,6 +61,4 @@ typedef struct S390CPUClass {
     void (*initial_cpu_reset)(CPUState *cpu);
 } S390CPUClass;
 
-typedef struct S390CPU S390CPU;
-
 #endif
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 0bd97a5670..a7426ef6e2 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -187,7 +187,7 @@ static inline CPU_DoubleU *get_freg(CPUS390XState *cs, int nr)
  *
  * An S/390 CPU.
  */
-struct S390CPU {
+typedef struct S390CPU {
     /*< private >*/
     CPUState parent_obj;
     /*< public >*/
@@ -198,7 +198,7 @@ struct S390CPU {
     /* needed for live migration */
     void *irqstate;
     uint32_t irqstate_saved_size;
-};
+} S390CPU;
 
 static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)
 {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 06/21] s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (4 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 05/21] target/s390x: move typedef of S390CPU to its definition David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h David Hildenbrand
                   ` (14 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Implemented in hw/s390x/s390-virtio-hcall.c, so let's move it to the
right header file.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-virtio-hcall.h | 1 +
 target/s390x/cpu.h           | 1 -
 target/s390x/kvm.c           | 1 +
 target/s390x/misc_helper.c   | 1 +
 4 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/hw/s390x/s390-virtio-hcall.h b/hw/s390x/s390-virtio-hcall.h
index 59fcba3a06..cbc270eef3 100644
--- a/hw/s390x/s390-virtio-hcall.h
+++ b/hw/s390x/s390-virtio-hcall.h
@@ -17,4 +17,5 @@
 
 typedef int (*s390_virtio_fn)(const uint64_t *args);
 void s390_register_virtio_hypercall(uint64_t code, s390_virtio_fn fn);
+int s390_virtio_hypercall(CPUS390XState *env);
 #endif /* HW_S390_VIRTIO_HCALL_H */
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index a7426ef6e2..2343f2f1f7 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -723,6 +723,5 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
 S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
 extern void subsystem_reset(void);
 int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
-int s390_virtio_hypercall(CPUS390XState *env);
 
 #endif
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index d07763ff2c..ed59896423 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -48,6 +48,7 @@
 #include "hw/s390x/ebcdic.h"
 #include "exec/memattrs.h"
 #include "hw/s390x/s390-virtio-ccw.h"
+#include "hw/s390x/s390-virtio-hcall.h"
 
 #ifndef DEBUG_KVM
 #define DEBUG_KVM  0
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index 50cc046ca2..b142db71c6 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -34,6 +34,7 @@
 #include "sysemu/cpus.h"
 #include "sysemu/sysemu.h"
 #include "hw/s390x/ebcdic.h"
+#include "hw/s390x/s390-virtio-hcall.h"
 #endif
 
 /* #define DEBUG_HELPER */
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (5 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 06/21] s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-08  3:58   ` Thomas Huth
  2017-09-08  7:50   ` Christian Borntraeger
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h David Hildenbrand
                   ` (13 subsequent siblings)
  20 siblings, 2 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Implemented in s390-virtio-ccw.c, so move it to the right header.
We can also drop the extern. Fix up one include.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 include/hw/s390x/s390-virtio-ccw.h | 2 ++
 target/s390x/cpu.h                 | 1 -
 target/s390x/diag.c                | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h
index 41a9d2862b..a9a90c2022 100644
--- a/include/hw/s390x/s390-virtio-ccw.h
+++ b/include/hw/s390x/s390-virtio-ccw.h
@@ -56,4 +56,6 @@ bool gs_allowed(void);
  */
 bool css_migration_enabled(void);
 
+void subsystem_reset(void);
+
 #endif
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 2343f2f1f7..3aa2e46aac 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -721,7 +721,6 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
 
 /* outside of target/s390x/ */
 S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
-extern void subsystem_reset(void);
 int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
 
 #endif
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
index e6b5e6de37..82a623948d 100644
--- a/target/s390x/diag.c
+++ b/target/s390x/diag.c
@@ -20,6 +20,7 @@
 #include "hw/watchdog/wdt_diag288.h"
 #include "sysemu/cpus.h"
 #include "hw/s390x/ipl.h"
+#include "hw/s390x/s390-virtio-ccw.h"
 
 static int modified_clear_reset(S390CPU *cpu)
 {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (6 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-08  4:21   ` Thomas Huth
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 09/21] target/s390x: use trigger_pgm_exception() in s390_cpu_handle_mmu_fault() David Hildenbrand
                   ` (12 subsequent siblings)
  20 siblings, 1 reply; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Implemented in sclp.c, so let's move it to the right include file.
Fix up one include. Do a forward declaration of CPUS390XState to fix the
two sclp consoles complaining.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 include/hw/s390x/sclp.h    | 2 ++
 target/s390x/cpu.h         | 1 -
 target/s390x/misc_helper.c | 1 +
 3 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
index a72d096081..4b86a8a293 100644
--- a/include/hw/s390x/sclp.h
+++ b/include/hw/s390x/sclp.h
@@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
 sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
 void sclp_service_interrupt(uint32_t sccb);
 void raise_irq_cpu_hotplug(void);
+typedef struct CPUS390XState CPUS390XState;
+int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
 
 #endif
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 3aa2e46aac..032d1de2e8 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -721,6 +721,5 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
 
 /* outside of target/s390x/ */
 S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
-int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
 
 #endif
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index b142db71c6..8b07535b02 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -35,6 +35,7 @@
 #include "sysemu/sysemu.h"
 #include "hw/s390x/ebcdic.h"
 #include "hw/s390x/s390-virtio-hcall.h"
+#include "hw/s390x/sclp.h"
 #endif
 
 /* #define DEBUG_HELPER */
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 09/21] target/s390x: use trigger_pgm_exception() in s390_cpu_handle_mmu_fault()
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (7 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 10/21] target/s390x: use program_interrupt() in per_check_exception() David Hildenbrand
                   ` (11 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

This looks cleaner. linux-user will not use the ilen field, so setting
it doesn't do any harm.

Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/excp_helper.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index 361f970db3..14d3160e92 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -59,8 +59,7 @@ int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr address,
 {
     S390CPU *cpu = S390_CPU(cs);
 
-    cs->exception_index = EXCP_PGM;
-    cpu->env.int_pgm_code = PGM_ADDRESSING;
+    trigger_pgm_exception(&cpu->env, PGM_ADDRESSING, ILEN_AUTO);
     /* On real machines this value is dropped into LowMem.  Since this
        is userland, simply put this someplace that cpu_loop can find it.  */
     cpu->env.__excp_addr = address;
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 10/21] target/s390x: use program_interrupt() in per_check_exception()
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (8 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 09/21] target/s390x: use trigger_pgm_exception() in s390_cpu_handle_mmu_fault() David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 11/21] s390x: allow only 1 CPU with TCG David Hildenbrand
                   ` (10 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Clean it up by reusing program_interrupt(). Add a concern regarding
ilen.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/misc_helper.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index 8b07535b02..f3624d75eb 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -447,14 +447,17 @@ void HELPER(chsc)(CPUS390XState *env, uint64_t inst)
 #ifndef CONFIG_USER_ONLY
 void HELPER(per_check_exception)(CPUS390XState *env)
 {
-    CPUState *cs = CPU(s390_env_get_cpu(env));
+    uint32_t ilen;
 
     if (env->per_perc_atmid) {
-        env->int_pgm_code = PGM_PER;
-        env->int_pgm_ilen = get_ilen(cpu_ldub_code(env, env->per_address));
-
-        cs->exception_index = EXCP_PGM;
-        cpu_loop_exit(cs);
+        /*
+         * FIXME: ILEN_AUTO is most probably the right thing to use. ilen
+         * always has to match the instruction referenced in the PSW. E.g.
+         * if a PER interrupt is triggered via EXECUTE, we have to use ilen
+         * of EXECUTE, while per_address contains the target of EXECUTE.
+         */
+        ilen = get_ilen(cpu_ldub_code(env, env->per_address));
+        program_interrupt(env, PGM_PER, ilen);
     }
 }
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 11/21] s390x: allow only 1 CPU with TCG
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (9 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 10/21] target/s390x: use program_interrupt() in per_check_exception() David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 12/21] target/s390x: set cpu->id for linux user when realizing David Hildenbrand
                   ` (9 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Specifying more than 1 CPU (e.g. -smp 5) leads to SIGP errors (the
guest tries to bring these CPUs up but fails), because we don't support
multiple CPUs on s390x under TCG.

Let's bail out if more than 1 is specified, so we don't raise people's
hope. Make it a define, so we can easily bump it up later.

Tested-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index f67b4b5d58..f1198b2745 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -23,6 +23,7 @@
 #include "hw/s390x/css.h"
 #include "virtio-ccw.h"
 #include "qemu/config-file.h"
+#include "qemu/error-report.h"
 #include "s390-pci-bus.h"
 #include "hw/s390x/storage-keys.h"
 #include "hw/s390x/storage-attributes.h"
@@ -47,6 +48,8 @@ S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
     return cpu_states[cpu_addr];
 }
 
+/* #define S390_TCG_SMP_SUPPORT */
+
 static void s390_init_cpus(MachineState *machine)
 {
     int i;
@@ -55,6 +58,13 @@ static void s390_init_cpus(MachineState *machine)
     if (machine->cpu_model == NULL) {
         machine->cpu_model = s390_default_cpu_model_name();
     }
+#ifndef S390_TCG_SMP_SUPPORT
+    if (tcg_enabled() && max_cpus > 1) {
+        error_report("Number of SMP CPUs requested (%d) exceeds max CPUs "
+                     "supported by TCG (1) on s390x", max_cpus);
+        exit(1);
+    }
+#endif
 
     cpu_states = g_new0(S390CPU *, max_cpus);
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 12/21] target/s390x: set cpu->id for linux user when realizing
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (10 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 11/21] s390x: allow only 1 CPU with TCG David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 13/21] target/s390x: use "core-id" for cpu number/address/id handling David Hildenbrand
                   ` (8 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

scc->next_cpu_id is updated when realizing. Setting it just before that
point looks cleaner.

Reviewed-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/cpu.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 74b3e4fd0d..5f9315fb16 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -194,7 +194,11 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
                    ", max allowed: %d", cpu->id, max_cpus - 1);
         goto out;
     }
+#else
+    /* implicitly set for linux-user only */
+    cpu->id = scc->next_cpu_id;
 #endif
+
     if (cpu_exists(cpu->id)) {
         error_setg(&err, "Unable to add CPU: %" PRIi64
                    ", it already exists", cpu->id);
@@ -306,13 +310,6 @@ static void s390_cpu_initfn(Object *obj)
         inited = true;
         s390x_translate_init();
     }
-
-#if defined(CONFIG_USER_ONLY)
-    {
-        S390CPUClass *scc = S390_CPU_GET_CLASS(obj);
-        cpu->id = scc->next_cpu_id;
-    }
-#endif
 }
 
 static void s390_cpu_finalize(Object *obj)
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 13/21] target/s390x: use "core-id" for cpu number/address/id handling
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (11 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 12/21] target/s390x: set cpu->id for linux user when realizing David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 14/21] target/s390x: rename next_cpu_id to next_core_id David Hildenbrand
                   ` (7 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Some time ago we discussed that using "id" as property name is not the
right thing to do, as it is a reserved property for other devices and
will not work with device_add.

Switch to the term "core-id" instead, and use it as an equivalent to
"CPU address" mentioned in the PoP. There is no such thing as cpu number,
so rename env.cpu_num to env.core_id. We use "core-id" as this is the
common term to use for device_add later on (x86 and ppc).

We can get rid of cpu->id now. Keep cpu_index and env->core_id in sync.
cpu_index was already implicitly used by e.g. cpu_exists(), so keeping
both in sync seems to be the right thing to do.

cpu_index will now no longer automatically get set via
cpu_exec_realizefn(). For now, we were lucky that both implicitly stayed
in sync.

Our new cpu property "core-id" can be a static property. Range checks can
be avoided by using the correct type and the "setting after realized"
check is done implicitly.

device_add will later need the reserved "id" property. Hotplugging a CPU
on s390x will then be: "device_add host-s390-cpu,id=cpu2,core-id=2".

Reviewed-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c |  2 +-
 target/s390x/cpu.c         | 71 +++++++++++++---------------------------------
 target/s390x/cpu.h         |  5 ++--
 target/s390x/cpu_models.c  |  2 +-
 target/s390x/excp_helper.c |  2 +-
 target/s390x/helper.c      |  4 +--
 target/s390x/misc_helper.c |  4 +--
 target/s390x/translate.c   |  5 +---
 8 files changed, 29 insertions(+), 66 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index f1198b2745..2086eb6ca6 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -314,7 +314,7 @@ static void s390_cpu_plug(HotplugHandler *hotplug_dev,
     S390CPU *cpu = S390_CPU(dev);
     CPUState *cs = CPU(dev);
 
-    name = g_strdup_printf("cpu[%i]", cpu->env.cpu_num);
+    name = g_strdup_printf("cpu[%i]", cpu->env.core_id);
     object_property_set_link(OBJECT(hotplug_dev), OBJECT(cs), name,
                              errp);
     g_free(name);
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 5f9315fb16..a2570bbc6b 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -36,6 +36,7 @@
 #include "trace.h"
 #include "qapi/visitor.h"
 #include "exec/exec-all.h"
+#include "hw/qdev-properties.h"
 #ifndef CONFIG_USER_ONLY
 #include "hw/hw.h"
 #include "sysemu/arch_init.h"
@@ -189,28 +190,30 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
     }
 
 #if !defined(CONFIG_USER_ONLY)
-    if (cpu->id >= max_cpus) {
-        error_setg(&err, "Unable to add CPU: %" PRIi64
-                   ", max allowed: %d", cpu->id, max_cpus - 1);
+    if (cpu->env.core_id >= max_cpus) {
+        error_setg(&err, "Unable to add CPU: %" PRIu32 ", max allowed: %d",
+                   cpu->env.core_id, max_cpus - 1);
         goto out;
     }
 #else
     /* implicitly set for linux-user only */
-    cpu->id = scc->next_cpu_id;
+    cpu->env.core_id = scc->next_cpu_id;
 #endif
 
-    if (cpu_exists(cpu->id)) {
-        error_setg(&err, "Unable to add CPU: %" PRIi64
-                   ", it already exists", cpu->id);
+    if (cpu_exists(cpu->env.core_id)) {
+        error_setg(&err, "Unable to add CPU: %" PRIu32 ", it already exists",
+                   cpu->env.core_id);
         goto out;
     }
-    if (cpu->id != scc->next_cpu_id) {
-        error_setg(&err, "Unable to add CPU: %" PRIi64
-                   ", The next available id is %" PRIi64, cpu->id,
+    if (cpu->env.core_id != scc->next_cpu_id) {
+        error_setg(&err, "Unable to add CPU: %" PRIu32
+                   ", the next available nr is %" PRIi64, cpu->env.core_id,
                    scc->next_cpu_id);
         goto out;
     }
 
+    /* sync cs->cpu_index and env->core_id. The latter is needed for TCG. */
+    cs->cpu_index = env->core_id;
     cpu_exec_realizefn(cs, &err);
     if (err != NULL) {
         goto out;
@@ -220,7 +223,6 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
 #if !defined(CONFIG_USER_ONLY)
     qemu_register_reset(s390_cpu_machine_reset_cb, cpu);
 #endif
-    env->cpu_num = cpu->id;
     s390_cpu_gdb_init(cs);
     qemu_init_vcpu(cs);
 #if !defined(CONFIG_USER_ONLY)
@@ -241,45 +243,6 @@ out:
     error_propagate(errp, err);
 }
 
-static void s390x_cpu_get_id(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
-{
-    S390CPU *cpu = S390_CPU(obj);
-    int64_t value = cpu->id;
-
-    visit_type_int(v, name, &value, errp);
-}
-
-static void s390x_cpu_set_id(Object *obj, Visitor *v, const char *name,
-                             void *opaque, Error **errp)
-{
-    S390CPU *cpu = S390_CPU(obj);
-    DeviceState *dev = DEVICE(obj);
-    const int64_t min = 0;
-    const int64_t max = UINT32_MAX;
-    Error *err = NULL;
-    int64_t value;
-
-    if (dev->realized) {
-        error_setg(errp, "Attempt to set property '%s' on '%s' after "
-                   "it was realized", name, object_get_typename(obj));
-        return;
-    }
-
-    visit_type_int(v, name, &value, &err);
-    if (err) {
-        error_propagate(errp, err);
-        return;
-    }
-    if (value < min || value > max) {
-        error_setg(errp, "Property %s.%s doesn't take value %" PRId64
-                   " (minimum: %" PRId64 ", maximum: %" PRId64 ")" ,
-                   object_get_typename(obj), name, value, min, max);
-        return;
-    }
-    cpu->id = value;
-}
-
 static void s390_cpu_initfn(Object *obj)
 {
     CPUState *cs = CPU(obj);
@@ -293,8 +256,6 @@ static void s390_cpu_initfn(Object *obj)
     cs->env_ptr = env;
     cs->halted = 1;
     cs->exception_index = EXCP_HLT;
-    object_property_add(OBJECT(cpu), "id", "int64_t", s390x_cpu_get_id,
-                        s390x_cpu_set_id, NULL, NULL, NULL);
     s390_cpu_model_register_props(obj);
 #if !defined(CONFIG_USER_ONLY)
     qemu_get_timedate(&tm, 0);
@@ -491,6 +452,11 @@ static gchar *s390_gdb_arch_name(CPUState *cs)
     return g_strdup("s390:64-bit");
 }
 
+static Property s390x_cpu_properties[] = {
+    DEFINE_PROP_UINT32("core-id", S390CPU, env.core_id, 0),
+    DEFINE_PROP_END_OF_LIST()
+};
+
 static void s390_cpu_class_init(ObjectClass *oc, void *data)
 {
     S390CPUClass *scc = S390_CPU_CLASS(oc);
@@ -500,6 +466,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
     scc->next_cpu_id = 0;
     scc->parent_realize = dc->realize;
     dc->realize = s390_cpu_realizefn;
+    dc->props = s390x_cpu_properties;
 
     scc->parent_reset = cc->reset;
 #if !defined(CONFIG_USER_ONLY)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 032d1de2e8..ad88cbf368 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -149,7 +149,7 @@ typedef struct CPUS390XState {
 
     CPU_COMMON
 
-    uint32_t cpu_num;
+    uint32_t core_id; /* PoP "CPU address", same as cpu_index */
     uint64_t cpuid;
 
     uint64_t tod_offset;
@@ -193,7 +193,6 @@ typedef struct S390CPU {
     /*< public >*/
 
     CPUS390XState env;
-    int64_t id;
     S390CPUModel *model;
     /* needed for live migration */
     void *irqstate;
@@ -689,7 +688,7 @@ const char *s390_default_cpu_model_name(void);
 
 /* helper.c */
 #define cpu_init(cpu_model) cpu_generic_init(TYPE_S390_CPU, cpu_model)
-S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp);
+S390CPU *s390x_new_cpu(const char *cpu_model, uint32_t core_id, Error **errp);
 /* you can call this signal handler from your SIGBUS and SIGSEGV
    signal handlers to inform the virtual CPU of exceptions. non zero
    is returned if the signal was handled by the virtual CPU.  */
diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 18cbf91d9c..8e20e7637b 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -915,7 +915,7 @@ void s390_realize_cpu_model(CPUState *cs, Error **errp)
     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.cpu_num);
+        cpu->env.cpuid = deposit64(cpu->env.cpuid, 54, 4, cpu->env.core_id);
     }
 }
 
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index 14d3160e92..470cf8f5bc 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -250,7 +250,7 @@ static void do_ext_interrupt(CPUS390XState *env)
     lowcore->ext_params2 = cpu_to_be64(q->param64);
     lowcore->external_old_psw.mask = cpu_to_be64(get_psw_mask(env));
     lowcore->external_old_psw.addr = cpu_to_be64(env->psw.addr);
-    lowcore->cpu_addr = cpu_to_be16(env->cpu_num | VIRTIO_SUBCODE_64);
+    lowcore->cpu_addr = cpu_to_be16(env->core_id | VIRTIO_SUBCODE_64);
     mask = be64_to_cpu(lowcore->external_new_psw.mask);
     addr = be64_to_cpu(lowcore->external_new_psw.addr);
 
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index ba29504476..dfb24ef5b2 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -104,7 +104,7 @@ S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp)
     return S390_CPU(CPU(object_new(typename)));
 }
 
-S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp)
+S390CPU *s390x_new_cpu(const char *cpu_model, uint32_t core_id, Error **errp)
 {
     S390CPU *cpu;
     Error *err = NULL;
@@ -114,7 +114,7 @@ S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp)
         goto out;
     }
 
-    object_property_set_int(OBJECT(cpu), id, "id", &err);
+    object_property_set_int(OBJECT(cpu), core_id, "core-id", &err);
     if (err != NULL) {
         goto out;
     }
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index f3624d75eb..293fc8428a 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -232,7 +232,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0,
             /* XXX make different for different CPUs? */
             ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16);
             ebcdic_put(sysib.plant, "QEMU", 4);
-            stw_p(&sysib.cpu_addr, env->cpu_num);
+            stw_p(&sysib.cpu_addr, env->core_id);
             cpu_physical_memory_write(a0, &sysib, sizeof(sysib));
         } else if ((sel1 == 2) && (sel2 == 2)) {
             /* Basic Machine CPUs */
@@ -260,7 +260,7 @@ uint32_t HELPER(stsi)(CPUS390XState *env, uint64_t a0,
                 /* XXX make different for different CPUs? */
                 ebcdic_put(sysib.sequence, "QEMUQEMUQEMUQEMU", 16);
                 ebcdic_put(sysib.plant, "QEMU", 4);
-                stw_p(&sysib.cpu_addr, env->cpu_num);
+                stw_p(&sysib.cpu_addr, env->core_id);
                 stw_p(&sysib.cpu_id, 0);
                 cpu_physical_memory_write(a0, &sysib, sizeof(sysib));
             } else if ((sel1 == 2) && (sel2 == 2)) {
diff --git a/target/s390x/translate.c b/target/s390x/translate.c
index 909b12818d..5abd34fb34 100644
--- a/target/s390x/translate.c
+++ b/target/s390x/translate.c
@@ -3823,10 +3823,7 @@ static ExitStatus op_ssm(DisasContext *s, DisasOps *o)
 static ExitStatus op_stap(DisasContext *s, DisasOps *o)
 {
     check_privileged(s);
-    /* ??? Surely cpu address != cpu number.  In any case the previous
-       version of this stored more than the required half-word, so it
-       is unlikely this has ever been tested.  */
-    tcg_gen_ld32u_i64(o->out, cpu_env, offsetof(CPUS390XState, cpu_num));
+    tcg_gen_ld32u_i64(o->out, cpu_env, offsetof(CPUS390XState, core_id));
     return NO_EXIT;
 }
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 14/21] target/s390x: rename next_cpu_id to next_core_id
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (12 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 13/21] target/s390x: use "core-id" for cpu number/address/id handling David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 15/21] s390x: print CPU definitions in sorted order David Hildenbrand
                   ` (6 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Adapt to the new term "core_id". While at it, fix the type and drop the
initialization to 0 (which is superfluous).

Reviewed-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/cpu-qom.h |  2 +-
 target/s390x/cpu.c     | 11 +++++------
 2 files changed, 6 insertions(+), 7 deletions(-)

diff --git a/target/s390x/cpu-qom.h b/target/s390x/cpu-qom.h
index c8fbf8ae03..21ea15e642 100644
--- a/target/s390x/cpu-qom.h
+++ b/target/s390x/cpu-qom.h
@@ -52,7 +52,7 @@ typedef struct S390CPUClass {
     bool is_migration_safe;
     const char *desc;
 
-    int64_t next_cpu_id;
+    uint32_t next_core_id;
 
     DeviceRealize parent_realize;
     void (*parent_reset)(CPUState *cpu);
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index a2570bbc6b..105ff13034 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -197,7 +197,7 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
     }
 #else
     /* implicitly set for linux-user only */
-    cpu->env.core_id = scc->next_cpu_id;
+    cpu->env.core_id = scc->next_core_id;
 #endif
 
     if (cpu_exists(cpu->env.core_id)) {
@@ -205,10 +205,10 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
                    cpu->env.core_id);
         goto out;
     }
-    if (cpu->env.core_id != scc->next_cpu_id) {
+    if (cpu->env.core_id != scc->next_core_id) {
         error_setg(&err, "Unable to add CPU: %" PRIu32
-                   ", the next available nr is %" PRIi64, cpu->env.core_id,
-                   scc->next_cpu_id);
+                   ", the next available id is %" PRIu32, cpu->env.core_id,
+                   scc->next_core_id);
         goto out;
     }
 
@@ -218,7 +218,7 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
     if (err != NULL) {
         goto out;
     }
-    scc->next_cpu_id++;
+    scc->next_core_id++;
 
 #if !defined(CONFIG_USER_ONLY)
     qemu_register_reset(s390_cpu_machine_reset_cb, cpu);
@@ -463,7 +463,6 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
     CPUClass *cc = CPU_CLASS(scc);
     DeviceClass *dc = DEVICE_CLASS(oc);
 
-    scc->next_cpu_id = 0;
     scc->parent_realize = dc->realize;
     dc->realize = s390_cpu_realizefn;
     dc->props = s390x_cpu_properties;
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 15/21] s390x: print CPU definitions in sorted order
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (13 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 14/21] target/s390x: rename next_cpu_id to next_core_id David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 16/21] s390x: allow cpu hotplug via device_add David Hildenbrand
                   ` (5 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Other architectures provide nicely sorted lists, let's do it similarly on
s390x.

While at it, clean up the code we have to touch either way.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/cpu_models.c | 56 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 41 insertions(+), 15 deletions(-)

diff --git a/target/s390x/cpu_models.c b/target/s390x/cpu_models.c
index 8e20e7637b..c295e641e6 100644
--- a/target/s390x/cpu_models.c
+++ b/target/s390x/cpu_models.c
@@ -270,16 +270,11 @@ const S390CPUDef *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga,
     return last_compatible;
 }
 
-struct S390PrintCpuListInfo {
-    FILE *f;
-    fprintf_function print;
-};
-
-static void print_cpu_model_list(ObjectClass *klass, void *opaque)
+static void s390_print_cpu_model_list_entry(gpointer data, gpointer user_data)
 {
-    struct S390PrintCpuListInfo *info = opaque;
-    S390CPUClass *scc = S390_CPU_CLASS(klass);
-    char *name = g_strdup(object_class_get_name(klass));
+    CPUListState *s = user_data;
+    const S390CPUClass *scc = S390_CPU_CLASS((ObjectClass *)data);
+    char *name = g_strdup(object_class_get_name((ObjectClass *)data));
     const char *details = "";
 
     if (scc->is_static) {
@@ -290,21 +285,52 @@ static void print_cpu_model_list(ObjectClass *klass, void *opaque)
 
     /* strip off the -s390-cpu */
     g_strrstr(name, "-" TYPE_S390_CPU)[0] = 0;
-    (*info->print)(info->f, "s390 %-15s %-35s %s\n", name, scc->desc,
-                   details);
+    (*s->cpu_fprintf)(s->file, "s390 %-15s %-35s %s\n", name, scc->desc,
+                      details);
     g_free(name);
 }
 
+static gint s390_cpu_list_compare(gconstpointer a, gconstpointer b)
+{
+    const S390CPUClass *cc_a = S390_CPU_CLASS((ObjectClass *)a);
+    const S390CPUClass *cc_b = S390_CPU_CLASS((ObjectClass *)b);
+    const char *name_a = object_class_get_name((ObjectClass *)a);
+    const char *name_b = object_class_get_name((ObjectClass *)b);
+
+    /* move qemu and host to the top of the list, qemu first, host second */
+    if (name_a[0] == 'q') {
+        return -1;
+    } else if (name_b[0] == 'q') {
+        return 1;
+    } else if (name_a[0] == 'h') {
+        return -1;
+    } else if (name_b[0] == 'h') {
+        return 1;
+    }
+
+    /* keep the same order we have in our table (sorted by release date) */
+    if (cc_a->cpu_def != cc_b->cpu_def) {
+        return cc_a->cpu_def - cc_b->cpu_def;
+    }
+
+    /* exact same definition - list base model first */
+    return cc_a->is_static ? -1 : 1;
+}
+
 void s390_cpu_list(FILE *f, fprintf_function print)
 {
-    struct S390PrintCpuListInfo info = {
-        .f = f,
-        .print = print,
+    CPUListState s = {
+        .file = f,
+        .cpu_fprintf = print,
     };
     S390FeatGroup group;
     S390Feat feat;
+    GSList *list;
 
-    object_class_foreach(print_cpu_model_list, TYPE_S390_CPU, false, &info);
+    list = object_class_get_list(TYPE_S390_CPU, false);
+    list = g_slist_sort(list, s390_cpu_list_compare);
+    g_slist_foreach(list, s390_print_cpu_model_list_entry, &s);
+    g_slist_free(list);
 
     (*print)(f, "\nRecognized feature flags:\n");
     for (feat = 0; feat < S390_FEAT_MAX; feat++) {
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 16/21] s390x: allow cpu hotplug via device_add
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (14 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 15/21] s390x: print CPU definitions in sorted order David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 17/21] s390x: CPU hot unplug via device_del cannot work for now David Hildenbrand
                   ` (4 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

E.g. the following now works:
    device_add host-s390-cpu,id=cpu1,core-id=1

The system will perform the same checks as when using cpu_add:
- If the core_id is already in use
- If the next sequential core_id isn't used
- If core-id >= max_cpu is specified

In addition, mixed CPU models are checked. E.g. if starting with
-cpu host and trying to hotplug "qemu-s390-cpu":
    "Mixed CPU models are not supported on s390x."

Reviewed-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/cpu.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 105ff13034..be20c2fb0f 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -466,6 +466,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
     scc->parent_realize = dc->realize;
     dc->realize = s390_cpu_realizefn;
     dc->props = s390x_cpu_properties;
+    dc->user_creatable = true;
 
     scc->parent_reset = cc->reset;
 #if !defined(CONFIG_USER_ONLY)
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 17/21] s390x: CPU hot unplug via device_del cannot work for now
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (15 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 16/21] s390x: allow cpu hotplug via device_add David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 18/21] s390x: implement query-hotpluggable-cpus David Hildenbrand
                   ` (3 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

device_del on a CPU will currently do nothing. Let's emmit an error
telling that this is will currently not work (there is no architecture
support on s390x). Error message copied from ppc.

(qemu) device_del cpu1
device_del cpu1
CPU hot unplug not supported on this machine

Reviewed-by: Matthew Rosato <mjrosato@linux.vnet.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 2086eb6ca6..120f82e339 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -341,6 +341,15 @@ static void s390_machine_device_plug(HotplugHandler *hotplug_dev,
     }
 }
 
+static void s390_machine_device_unplug_request(HotplugHandler *hotplug_dev,
+                                               DeviceState *dev, Error **errp)
+{
+    if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) {
+        error_setg(errp, "CPU hot unplug not supported on this machine");
+        return;
+    }
+}
+
 static HotplugHandler *s390_get_hotplug_handler(MachineState *machine,
                                                 DeviceState *dev)
 {
@@ -390,6 +399,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
     mc->max_cpus = 248;
     mc->get_hotplug_handler = s390_get_hotplug_handler;
     hc->plug = s390_machine_device_plug;
+    hc->unplug_request = s390_machine_device_unplug_request;
     nc->nmi_monitor_handler = s390_nmi;
 }
 
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 18/21] s390x: implement query-hotpluggable-cpus
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (16 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 17/21] s390x: CPU hot unplug via device_del cannot work for now David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 19/21] s390x: get rid of cpu_s390x_create() David Hildenbrand
                   ` (2 subsequent siblings)
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

CPU hotplug is only possible on a per core basis on s390x.

As we now have ms->possible_cpus, we can get rid of the global variable
cpu_states.

While rewriting s390_cpu_addr2state() completely to be based on
possible_cpus, move it to cpu.c, as it is independent of the virtio-ccw
machine.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 87 +++++++++++++++++++++++++++++-----------------
 qapi-schema.json           | 16 +++++++++
 target/s390x/cpu.c         | 17 +++++++++
 target/s390x/cpu.h         |  5 +--
 4 files changed, 89 insertions(+), 36 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 120f82e339..0e10a4c73a 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -36,24 +36,12 @@
 #include "qapi/qmp/qerror.h"
 #include "hw/nmi.h"
 
-static S390CPU **cpu_states;
-
-S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
-{
-    if (cpu_addr >= max_cpus) {
-        return NULL;
-    }
-
-    /* Fast lookup via CPU ID */
-    return cpu_states[cpu_addr];
-}
-
 /* #define S390_TCG_SMP_SUPPORT */
 
 static void s390_init_cpus(MachineState *machine)
 {
+    MachineClass *mc = MACHINE_GET_CLASS(machine);
     int i;
-    gchar *name;
 
     if (machine->cpu_model == NULL) {
         machine->cpu_model = s390_default_cpu_model_name();
@@ -66,17 +54,8 @@ static void s390_init_cpus(MachineState *machine)
     }
 #endif
 
-    cpu_states = g_new0(S390CPU *, max_cpus);
-
-    for (i = 0; i < max_cpus; i++) {
-        name = g_strdup_printf("cpu[%i]", i);
-        object_property_add_link(OBJECT(machine), name, TYPE_S390_CPU,
-                                 (Object **) &cpu_states[i],
-                                 object_property_allow_set_link,
-                                 OBJ_PROP_LINK_UNREF_ON_RELEASE,
-                                 &error_abort);
-        g_free(name);
-    }
+    /* initialize possible_cpus */
+    mc->possible_cpu_arch_ids(machine);
 
     for (i = 0; i < smp_cpus; i++) {
         s390x_new_cpu(machine->cpu_model, i, &error_fatal);
@@ -307,17 +286,14 @@ static void ccw_init(MachineState *machine)
     register_savevm_live(NULL, "todclock", 0, 1, &savevm_gtod, NULL);
 }
 
-static void s390_cpu_plug(HotplugHandler *hotplug_dev,
-                        DeviceState *dev, Error **errp)
+static void s390_cpu_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
+                          Error **errp)
 {
-    gchar *name;
+    MachineState *ms = MACHINE(hotplug_dev);
     S390CPU *cpu = S390_CPU(dev);
-    CPUState *cs = CPU(dev);
 
-    name = g_strdup_printf("cpu[%i]", cpu->env.core_id);
-    object_property_set_link(OBJECT(hotplug_dev), OBJECT(cs), name,
-                             errp);
-    g_free(name);
+    g_assert(!ms->possible_cpus->cpus[cpu->env.core_id].cpu);
+    ms->possible_cpus->cpus[cpu->env.core_id].cpu = OBJECT(dev);
 }
 
 static void s390_machine_reset(void)
@@ -350,6 +326,50 @@ static void s390_machine_device_unplug_request(HotplugHandler *hotplug_dev,
     }
 }
 
+static CPUArchId *s390_find_cpu_slot(MachineState *ms, uint32_t core_id,
+                                     int *idx)
+{
+    if (core_id >= ms->possible_cpus->len) {
+        return NULL;
+    }
+    /* core_id corresponds to the index */
+    if (idx) {
+        *idx = core_id;
+    }
+    return &ms->possible_cpus->cpus[core_id];
+}
+
+static CpuInstanceProperties s390_cpu_index_to_props(MachineState *machine,
+                                                     unsigned cpu_index)
+{
+    CPUArchId *slot = s390_find_cpu_slot(machine, cpu_index, NULL);
+
+    assert(slot);
+    return slot->props;
+}
+
+static const CPUArchIdList *s390_possible_cpu_arch_ids(MachineState *ms)
+{
+    int i;
+
+    if (ms->possible_cpus) {
+        g_assert(ms->possible_cpus && ms->possible_cpus->len == max_cpus);
+        return ms->possible_cpus;
+    }
+
+    ms->possible_cpus = g_malloc0(sizeof(CPUArchIdList) +
+                                  sizeof(CPUArchId) * max_cpus);
+    ms->possible_cpus->len = max_cpus;
+    for (i = 0; i < ms->possible_cpus->len; i++) {
+        ms->possible_cpus->cpus[i].vcpus_count = 1;
+        ms->possible_cpus->cpus[i].arch_id = i;
+        ms->possible_cpus->cpus[i].props.has_core_id = true;
+        ms->possible_cpus->cpus[i].props.core_id = i;
+    }
+
+    return ms->possible_cpus;
+}
+
 static HotplugHandler *s390_get_hotplug_handler(MachineState *machine,
                                                 DeviceState *dev)
 {
@@ -397,7 +417,10 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
     mc->no_sdcard = 1;
     mc->use_sclp = 1;
     mc->max_cpus = 248;
+    mc->has_hotpluggable_cpus = true;
     mc->get_hotplug_handler = s390_get_hotplug_handler;
+    mc->cpu_index_to_instance_props = s390_cpu_index_to_props;
+    mc->possible_cpu_arch_ids = s390_possible_cpu_arch_ids;
     hc->plug = s390_machine_device_plug;
     hc->unplug_request = s390_machine_device_unplug_request;
     nc->nmi_monitor_handler = s390_nmi;
diff --git a/qapi-schema.json b/qapi-schema.json
index f3af2cb851..79e9f85404 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3121,6 +3121,22 @@
 #      }
 #    ]}
 #
+# For s390x-virtio-ccw machine type started with -smp 1,maxcpus=2 -cpu qemu
+# (Since: 2.11):
+#
+# -> { "execute": "query-hotpluggable-cpus" }
+# <- {"return": [
+#      {
+#         "type": "qemu-s390-cpu", "vcpus-count": 1,
+#         "props": { "core-id": 1 }
+#      },
+#      {
+#         "qom-path": "/machine/unattached/device[0]",
+#         "type": "qemu-s390-cpu", "vcpus-count": 1,
+#         "props": { "core-id": 0 }
+#      }
+#    ]}
+#
 ##
 { 'command': 'query-hotpluggable-cpus', 'returns': ['HotpluggableCPU'] }
 
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index be20c2fb0f..ad9dcdaaf1 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -38,6 +38,7 @@
 #include "exec/exec-all.h"
 #include "hw/qdev-properties.h"
 #ifndef CONFIG_USER_ONLY
+#include "hw/boards.h"
 #include "hw/hw.h"
 #include "sysemu/arch_init.h"
 #include "sysemu/sysemu.h"
@@ -445,6 +446,22 @@ void s390_enable_css_support(S390CPU *cpu)
         kvm_s390_enable_css_support(cpu);
     }
 }
+
+S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
+{
+    static MachineState *ms;
+
+    if (!ms) {
+        ms = MACHINE(qdev_get_machine());
+        g_assert(ms->possible_cpus);
+    }
+
+    /* CPU address corresponds to the core_id and the index */
+    if (cpu_addr >= ms->possible_cpus->len) {
+        return NULL;
+    }
+    return S390_CPU(ms->possible_cpus->cpus[cpu_addr].cpu);
+}
 #endif
 
 static gchar *s390_gdb_arch_name(CPUState *cs)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index ad88cbf368..5707268e43 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -670,6 +670,7 @@ int s390_cpu_restart(S390CPU *cpu);
 void s390_enable_css_support(S390CPU *cpu);
 int s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch_id,
                                 int vq, bool assign);
+S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
 #ifndef CONFIG_USER_ONLY
 unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu);
 #else
@@ -717,8 +718,4 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
 #define s390_cpu_virt_mem_check_write(cpu, laddr, ar, len)   \
         s390_cpu_virt_mem_rw(cpu, laddr, ar, NULL, len, true)
 
-
-/* outside of target/s390x/ */
-S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
-
 #endif
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 19/21] s390x: get rid of cpu_s390x_create()
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (17 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 18/21] s390x: implement query-hotpluggable-cpus David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 20/21] s390x: generate sclp cpu information from possible_cpus David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 21/21] s390x: allow CPU hotplug in random core-id order David Hildenbrand
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

Now that there is only one user of cpu_s390x_create() left, make cpu
creation look like on x86.
- Perform the model/properties split and checks in s390_init_cpus()
- Parse features only once without having to remember if already parsed
- Pass only the typename to s390x_new_cpu()
- Use the typename of an existing CPU for hotplug via cpu-add

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 29 +++++++++++++++++++++++++++--
 target/s390x/cpu.h         |  2 +-
 target/s390x/helper.c      | 45 ++-------------------------------------------
 target/s390x/internal.h    |  1 -
 4 files changed, 30 insertions(+), 47 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 0e10a4c73a..10f6933fbd 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -41,6 +41,10 @@
 static void s390_init_cpus(MachineState *machine)
 {
     MachineClass *mc = MACHINE_GET_CLASS(machine);
+    const char *typename;
+    gchar **model_pieces;
+    ObjectClass *oc;
+    CPUClass *cc;
     int i;
 
     if (machine->cpu_model == NULL) {
@@ -57,8 +61,25 @@ static void s390_init_cpus(MachineState *machine)
     /* initialize possible_cpus */
     mc->possible_cpu_arch_ids(machine);
 
+    model_pieces = g_strsplit(machine->cpu_model, ",", 2);
+    if (!model_pieces[0]) {
+        error_report("Invalid/empty CPU model name");
+        exit(1);
+    }
+
+    oc = cpu_class_by_name(TYPE_S390_CPU, model_pieces[0]);
+    if (!oc) {
+        error_report("Unable to find CPU definition: %s", model_pieces[0]);
+        exit(1);
+    }
+    typename = object_class_get_name(oc);
+    cc = CPU_CLASS(oc);
+    /* after parsing, properties will be applied to all *typename* instances */
+    cc->parse_features(typename, model_pieces[1], &error_fatal);
+    g_strfreev(model_pieces);
+
     for (i = 0; i < smp_cpus; i++) {
-        s390x_new_cpu(machine->cpu_model, i, &error_fatal);
+        s390x_new_cpu(typename, i, &error_fatal);
     }
 }
 
@@ -382,8 +403,12 @@ static HotplugHandler *s390_get_hotplug_handler(MachineState *machine,
 static void s390_hot_add_cpu(const int64_t id, Error **errp)
 {
     MachineState *machine = MACHINE(qdev_get_machine());
+    ObjectClass *oc;
+
+    g_assert(machine->possible_cpus->cpus[0].cpu);
+    oc = OBJECT_CLASS(CPU_GET_CLASS(machine->possible_cpus->cpus[0].cpu));
 
-    s390x_new_cpu(machine->cpu_model, id, errp);
+    s390x_new_cpu(object_class_get_name(oc), id, errp);
 }
 
 static void s390_nmi(NMIState *n, int cpu_index, Error **errp)
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 5707268e43..a197869b0e 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -689,7 +689,7 @@ const char *s390_default_cpu_model_name(void);
 
 /* helper.c */
 #define cpu_init(cpu_model) cpu_generic_init(TYPE_S390_CPU, cpu_model)
-S390CPU *s390x_new_cpu(const char *cpu_model, uint32_t core_id, Error **errp);
+S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id, Error **errp);
 /* you can call this signal handler from your SIGBUS and SIGSEGV
    signal handlers to inform the virtual CPU of exceptions. non zero
    is returned if the signal was handled by the virtual CPU.  */
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index dfb24ef5b2..97adbcc86d 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -68,52 +68,11 @@ void s390x_cpu_timer(void *opaque)
 }
 #endif
 
-S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp)
+S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id, Error **errp)
 {
-    static bool features_parsed;
-    char *name, *features;
-    const char *typename;
-    ObjectClass *oc;
-    CPUClass *cc;
-
-    name = g_strdup(cpu_model);
-    features = strchr(name, ',');
-    if (features) {
-        features[0] = 0;
-        features++;
-    }
-
-    oc = cpu_class_by_name(TYPE_S390_CPU, name);
-    if (!oc) {
-        error_setg(errp, "Unknown CPU definition \'%s\'", name);
-        g_free(name);
-        return NULL;
-    }
-    typename = object_class_get_name(oc);
-
-    if (!features_parsed) {
-        features_parsed = true;
-        cc = CPU_CLASS(oc);
-        cc->parse_features(typename, features, errp);
-    }
-    g_free(name);
-
-    if (*errp) {
-        return NULL;
-    }
-    return S390_CPU(CPU(object_new(typename)));
-}
-
-S390CPU *s390x_new_cpu(const char *cpu_model, uint32_t core_id, Error **errp)
-{
-    S390CPU *cpu;
+    S390CPU *cpu = S390_CPU(object_new(typename));
     Error *err = NULL;
 
-    cpu = cpu_s390x_create(cpu_model, &err);
-    if (err != NULL) {
-        goto out;
-    }
-
     object_property_set_int(OBJECT(cpu), core_id, "core-id", &err);
     if (err != NULL) {
         goto out;
diff --git a/target/s390x/internal.h b/target/s390x/internal.h
index b4d3583b24..bc8f83129a 100644
--- a/target/s390x/internal.h
+++ b/target/s390x/internal.h
@@ -337,7 +337,6 @@ uint64_t get_psw_mask(CPUS390XState *env);
 void s390_cpu_recompute_watchpoints(CPUState *cs);
 void s390x_tod_timer(void *opaque);
 void s390x_cpu_timer(void *opaque);
-S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp);
 void do_restart_interrupt(CPUS390XState *env);
 #ifndef CONFIG_USER_ONLY
 LowCore *cpu_map_lowcore(CPUS390XState *env);
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 20/21] s390x: generate sclp cpu information from possible_cpus
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (18 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 19/21] s390x: get rid of cpu_s390x_create() David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 21/21] s390x: allow CPU hotplug in random core-id order David Hildenbrand
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

This is the first step to allow hot plugging of CPUs in a non-sequential
order. If a cpu is available ("plugged") can directly be decided by
looking at the cpu state pointer.

This makes sure, that really only cpus attached to the machine are
reported.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 hw/s390x/sclp.c | 34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index fd097262c7..30aefbfd15 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -34,16 +34,21 @@ static inline SCLPDevice *get_sclp_device(void)
     return sclp;
 }
 
-static void prepare_cpu_entries(SCLPDevice *sclp, CPUEntry *entry, int count)
+static void prepare_cpu_entries(SCLPDevice *sclp, CPUEntry *entry, int *count)
 {
+    MachineState *ms = MACHINE(qdev_get_machine());
     uint8_t features[SCCB_CPU_FEATURE_LEN] = { 0 };
     int i;
 
     s390_get_feat_block(S390_FEAT_TYPE_SCLP_CPU, features);
-    for (i = 0; i < count; i++) {
-        entry[i].address = i;
-        entry[i].type = 0;
-        memcpy(entry[i].features, features, sizeof(entry[i].features));
+    for (i = 0, *count = 0; i < ms->possible_cpus->len; i++) {
+        if (!ms->possible_cpus->cpus[i].cpu) {
+            continue;
+        }
+        entry[*count].address = ms->possible_cpus->cpus[i].arch_id;
+        entry[*count].type = 0;
+        memcpy(entry[*count].features, features, sizeof(features));
+        (*count)++;
     }
 }
 
@@ -53,17 +58,13 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
     ReadInfo *read_info = (ReadInfo *) sccb;
     MachineState *machine = MACHINE(qdev_get_machine());
     sclpMemoryHotplugDev *mhd = get_sclp_memory_hotplug_dev();
-    CPUState *cpu;
-    int cpu_count = 0;
+    int cpu_count;
     int rnsize, rnmax;
     int slots = MIN(machine->ram_slots, s390_get_memslot_count());
     IplParameterBlock *ipib = s390_ipl_get_iplb();
 
-    CPU_FOREACH(cpu) {
-        cpu_count++;
-    }
-
     /* CPU information */
+    prepare_cpu_entries(sclp, read_info->entries, &cpu_count);
     read_info->entries_cpu = cpu_to_be16(cpu_count);
     read_info->offset_cpu = cpu_to_be16(offsetof(ReadInfo, entries));
     read_info->highest_cpu = cpu_to_be16(max_cpus);
@@ -76,8 +77,6 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
     s390_get_feat_block(S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
                          read_info->conf_char_ext);
 
-    prepare_cpu_entries(sclp, read_info->entries, cpu_count);
-
     read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
                                         SCLP_HAS_IOA_RECONFIG);
 
@@ -333,13 +332,9 @@ static void unassign_storage(SCLPDevice *sclp, SCCB *sccb)
 static void sclp_read_cpu_info(SCLPDevice *sclp, SCCB *sccb)
 {
     ReadCpuInfo *cpu_info = (ReadCpuInfo *) sccb;
-    CPUState *cpu;
-    int cpu_count = 0;
-
-    CPU_FOREACH(cpu) {
-        cpu_count++;
-    }
+    int cpu_count;
 
+    prepare_cpu_entries(sclp, cpu_info->entries, &cpu_count);
     cpu_info->nr_configured = cpu_to_be16(cpu_count);
     cpu_info->offset_configured = cpu_to_be16(offsetof(ReadCpuInfo, entries));
     cpu_info->nr_standby = cpu_to_be16(0);
@@ -348,7 +343,6 @@ static void sclp_read_cpu_info(SCLPDevice *sclp, SCCB *sccb)
     cpu_info->offset_standby = cpu_to_be16(cpu_info->offset_configured
         + cpu_info->nr_configured*sizeof(CPUEntry));
 
-    prepare_cpu_entries(sclp, cpu_info->entries, cpu_count);
 
     sccb->h.response_code = cpu_to_be16(SCLP_RC_NORMAL_READ_COMPLETION);
 }
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* [Qemu-devel] [PATCH v3 21/21] s390x: allow CPU hotplug in random core-id order
  2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
                   ` (19 preceding siblings ...)
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 20/21] s390x: generate sclp cpu information from possible_cpus David Hildenbrand
@ 2017-09-07 20:13 ` David Hildenbrand
  20 siblings, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-07 20:13 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, thuth, cohuck, david, borntraeger,
	Alexander Graf, Eduardo Habkost, Matthew Rosato

SCLP correctly indicates the core-id aka. CPU address for each available
CPU.

As the core-id corresponds to cpu_index, also a newly created kvm vcpu
gets assigned this core-id as vcpu id. So SIGP in the kernel works
correctly (it uses the vcpu id to lookup the correct CPU).

So there should be nothing hindering us from hotplugging CPUs in random
core-id order.

This now makes sure that the output from "query-hotpluggable-cpus"
is completely true. Until now, a specific order is implicit. Performance
vice, hotplugging CPUs in non-sequential order might not be the best thing
to do, as VCPU lookup inside KVM might be a little slower. But that
doesn't hinder us from supporting it.

next_core_id is now used by linux user only.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/cpu.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index ad9dcdaaf1..5701a41112 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -199,6 +199,7 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
 #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)) {
@@ -206,12 +207,6 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
                    cpu->env.core_id);
         goto out;
     }
-    if (cpu->env.core_id != scc->next_core_id) {
-        error_setg(&err, "Unable to add CPU: %" PRIu32
-                   ", the next available id is %" PRIu32, cpu->env.core_id,
-                   scc->next_core_id);
-        goto out;
-    }
 
     /* sync cs->cpu_index and env->core_id. The latter is needed for TCG. */
     cs->cpu_index = env->core_id;
@@ -219,7 +214,6 @@ static void s390_cpu_realizefn(DeviceState *dev, Error **errp)
     if (err != NULL) {
         goto out;
     }
-    scc->next_core_id++;
 
 #if !defined(CONFIG_USER_ONLY)
     qemu_register_reset(s390_cpu_machine_reset_cb, cpu);
-- 
2.13.5

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h David Hildenbrand
@ 2017-09-08  3:58   ` Thomas Huth
  2017-09-08  7:50   ` Christian Borntraeger
  1 sibling, 0 replies; 37+ messages in thread
From: Thomas Huth @ 2017-09-08  3:58 UTC (permalink / raw)
  To: David Hildenbrand, qemu-devel
  Cc: Richard Henderson, cohuck, borntraeger, Alexander Graf,
	Eduardo Habkost, Matthew Rosato

On 07.09.2017 22:13, David Hildenbrand wrote:
> Implemented in s390-virtio-ccw.c, so move it to the right header.
> We can also drop the extern. Fix up one include.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  include/hw/s390x/s390-virtio-ccw.h | 2 ++
>  target/s390x/cpu.h                 | 1 -
>  target/s390x/diag.c                | 1 +
>  3 files changed, 3 insertions(+), 1 deletion(-)

Reviewed-by: Thomas Huth <thuth@redhat.com>

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h David Hildenbrand
@ 2017-09-08  4:21   ` Thomas Huth
  2017-09-08 12:29     ` Markus Armbruster
  2017-09-08 12:46     ` David Hildenbrand
  0 siblings, 2 replies; 37+ messages in thread
From: Thomas Huth @ 2017-09-08  4:21 UTC (permalink / raw)
  To: David Hildenbrand, qemu-devel
  Cc: Richard Henderson, cohuck, borntraeger, Alexander Graf,
	Eduardo Habkost, Matthew Rosato, Eric Blake, Markus Armbruster,
	Paolo Bonzini

On 07.09.2017 22:13, David Hildenbrand wrote:
> Implemented in sclp.c, so let's move it to the right include file.
> Fix up one include. Do a forward declaration of CPUS390XState to fix the
> two sclp consoles complaining.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
>  include/hw/s390x/sclp.h    | 2 ++
>  target/s390x/cpu.h         | 1 -
>  target/s390x/misc_helper.c | 1 +
>  3 files changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> index a72d096081..4b86a8a293 100644
> --- a/include/hw/s390x/sclp.h
> +++ b/include/hw/s390x/sclp.h
> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>  void sclp_service_interrupt(uint32_t sccb);
>  void raise_irq_cpu_hotplug(void);
> +typedef struct CPUS390XState CPUS390XState;
> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);

That's dangerous and likely does not work with certain versions of GCC.
You can't do a "forward declaration" with typedef in C, I'm afraid. See
for example:

 https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
 https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
 https://stackoverflow.com/questions/8367646/redefinition-of-typedef

All this typedef'ing in QEMU is pretty bad ... we run into this problem
again and again. include/qemu/typedefs.h is just a work-around for this.
I know people like typedefs for some reasons (I used to do that, too,
before I realized the trouble with them), but IMHO we should rather
adopt the typedef-related rules from the kernel coding conventions instead:

 https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs

  Thomas

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h
  2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h David Hildenbrand
  2017-09-08  3:58   ` Thomas Huth
@ 2017-09-08  7:50   ` Christian Borntraeger
  1 sibling, 0 replies; 37+ messages in thread
From: Christian Borntraeger @ 2017-09-08  7:50 UTC (permalink / raw)
  To: David Hildenbrand, qemu-devel
  Cc: Richard Henderson, thuth, cohuck, Alexander Graf,
	Eduardo Habkost, Matthew Rosato

On 09/07/2017 10:13 PM, David Hildenbrand wrote:
> Implemented in s390-virtio-ccw.c, so move it to the right header.
> We can also drop the extern. Fix up one include.
> 
> Signed-off-by: David Hildenbrand <david@redhat.com>

Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>

> ---
>  include/hw/s390x/s390-virtio-ccw.h | 2 ++
>  target/s390x/cpu.h                 | 1 -
>  target/s390x/diag.c                | 1 +
>  3 files changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h
> index 41a9d2862b..a9a90c2022 100644
> --- a/include/hw/s390x/s390-virtio-ccw.h
> +++ b/include/hw/s390x/s390-virtio-ccw.h
> @@ -56,4 +56,6 @@ bool gs_allowed(void);
>   */
>  bool css_migration_enabled(void);
> 
> +void subsystem_reset(void);
> +
>  #endif
> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> index 2343f2f1f7..3aa2e46aac 100644
> --- a/target/s390x/cpu.h
> +++ b/target/s390x/cpu.h
> @@ -721,7 +721,6 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
> 
>  /* outside of target/s390x/ */
>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
> -extern void subsystem_reset(void);
>  int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> 
>  #endif
> diff --git a/target/s390x/diag.c b/target/s390x/diag.c
> index e6b5e6de37..82a623948d 100644
> --- a/target/s390x/diag.c
> +++ b/target/s390x/diag.c
> @@ -20,6 +20,7 @@
>  #include "hw/watchdog/wdt_diag288.h"
>  #include "sysemu/cpus.h"
>  #include "hw/s390x/ipl.h"
> +#include "hw/s390x/s390-virtio-ccw.h"
> 
>  static int modified_clear_reset(S390CPU *cpu)
>  {
> 

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-08  4:21   ` Thomas Huth
@ 2017-09-08 12:29     ` Markus Armbruster
  2017-09-11  2:19       ` Thomas Huth
  2017-09-08 12:46     ` David Hildenbrand
  1 sibling, 1 reply; 37+ messages in thread
From: Markus Armbruster @ 2017-09-08 12:29 UTC (permalink / raw)
  To: Thomas Huth
  Cc: David Hildenbrand, qemu-devel, Matthew Rosato, Eduardo Habkost,
	cohuck, Richard Henderson, Alexander Graf, borntraeger,
	Paolo Bonzini

Thomas Huth <thuth@redhat.com> writes:

> On 07.09.2017 22:13, David Hildenbrand wrote:
>> Implemented in sclp.c, so let's move it to the right include file.
>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
>> two sclp consoles complaining.
>> 
>> Signed-off-by: David Hildenbrand <david@redhat.com>
>> ---
>>  include/hw/s390x/sclp.h    | 2 ++
>>  target/s390x/cpu.h         | 1 -
>>  target/s390x/misc_helper.c | 1 +
>>  3 files changed, 3 insertions(+), 1 deletion(-)
>> 
>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>> index a72d096081..4b86a8a293 100644
>> --- a/include/hw/s390x/sclp.h
>> +++ b/include/hw/s390x/sclp.h
>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>  void sclp_service_interrupt(uint32_t sccb);
>>  void raise_irq_cpu_hotplug(void);
>> +typedef struct CPUS390XState CPUS390XState;
>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>
> That's dangerous and likely does not work with certain versions of GCC.
> You can't do a "forward declaration" with typedef in C, I'm afraid. See
> for example:
>
>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
>
> All this typedef'ing in QEMU is pretty bad ... we run into this problem
> again and again. include/qemu/typedefs.h is just a work-around for this.
> I know people like typedefs for some reasons (I used to do that, too,
> before I realized the trouble with them), but IMHO we should rather
> adopt the typedef-related rules from the kernel coding conventions instead:
>
>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs

I prefer the kernel style for typedefs myself.  But it's strictly a
matter of style.  Excessive typedeffing makes code harder to understand,
it isn't wrong.  The part that's wrong is defining things more than
once, and that applies to everything, not just typedefs.

Sometimes you get away with defining something more than once.  It's
still wrong.

You're not supposed to define the same variable more than once, either
(although many C compilers let you get away with it, see -fno-common).
You define it in *one* place.  If you need to declare it, declare it in
*one* place, and make sure that place is in scope at the definition, so
the compiler can check the two match.

Likewise, you're not supposed to define the same struct tag more than
once, and you should declare it in just one place.

Likewise, you're not supposed to define (with typedef) the same type
more than once.  There is no such thing as a typedef declaration.

qemu/typedefs.h is not a work-around for a typedef-happy style.  Its
purpose is breaking inclusion cycles.  Secondary purpose is reducing the
need for non-cyclic includes.  If we didn't typedef, we'd still put our
struct declarations there.

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-08  4:21   ` Thomas Huth
  2017-09-08 12:29     ` Markus Armbruster
@ 2017-09-08 12:46     ` David Hildenbrand
  2017-09-09 22:07       ` Eduardo Habkost
  1 sibling, 1 reply; 37+ messages in thread
From: David Hildenbrand @ 2017-09-08 12:46 UTC (permalink / raw)
  To: Thomas Huth, qemu-devel
  Cc: Richard Henderson, cohuck, borntraeger, Alexander Graf,
	Eduardo Habkost, Matthew Rosato, Eric Blake, Markus Armbruster,
	Paolo Bonzini

On 08.09.2017 06:21, Thomas Huth wrote:
> On 07.09.2017 22:13, David Hildenbrand wrote:
>> Implemented in sclp.c, so let's move it to the right include file.
>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
>> two sclp consoles complaining.
>>
>> Signed-off-by: David Hildenbrand <david@redhat.com>
>> ---
>>  include/hw/s390x/sclp.h    | 2 ++
>>  target/s390x/cpu.h         | 1 -
>>  target/s390x/misc_helper.c | 1 +
>>  3 files changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>> index a72d096081..4b86a8a293 100644
>> --- a/include/hw/s390x/sclp.h
>> +++ b/include/hw/s390x/sclp.h
>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>  void sclp_service_interrupt(uint32_t sccb);
>>  void raise_irq_cpu_hotplug(void);
>> +typedef struct CPUS390XState CPUS390XState;
>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> 
> That's dangerous and likely does not work with certain versions of GCC.
> You can't do a "forward declaration" with typedef in C, I'm afraid. See
> for example:
> 
>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
> 
> All this typedef'ing in QEMU is pretty bad ... we run into this problem
> again and again. include/qemu/typedefs.h is just a work-around for this.
> I know people like typedefs for some reasons (I used to do that, too,
> before I realized the trouble with them), but IMHO we should rather
> adopt the typedef-related rules from the kernel coding conventions instead:
> 
>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
> 
>   Thomas
> 

Yes, this is really nasty. And I wasn't aware of the involved issues.

This seems to be the only feasible solution (including cpu.h sounds
wrong and will require a bunch of other includes):


diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
index a72d096081..ce80915a02 100644
--- a/include/hw/s390x/sclp.h
+++ b/include/hw/s390x/sclp.h
@@ -242,5 +242,7 @@ sclpMemoryHotplugDev
*init_sclp_memory_hotplug_dev(void);
 sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
 void sclp_service_interrupt(uint32_t sccb);
 void raise_irq_cpu_hotplug(void);
+struct CPUS390XState;
+int sclp_service_call(struct CPUS390XState *env, uint64_t sccb,
uint32_t code);

 #endif
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 3aa2e46aac..032d1de2e8 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -721,6 +721,5 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr,
uint8_t ar, void *hostbuf,

 /* outside of target/s390x/ */
 S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
-int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);

 #endif
diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
index b142db71c6..8b07535b02 100644
--- a/target/s390x/misc_helper.c
+++ b/target/s390x/misc_helper.c
@@ -35,6 +35,7 @@
 #include "sysemu/sysemu.h"
 #include "hw/s390x/ebcdic.h"
 #include "hw/s390x/s390-virtio-hcall.h"
+#include "hw/s390x/sclp.h"
 #endif

 /* #define DEBUG_HELPER */


Opinions?



-- 

Thanks,

David

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-08 12:46     ` David Hildenbrand
@ 2017-09-09 22:07       ` Eduardo Habkost
  2017-09-11  2:23         ` Thomas Huth
  2017-09-11 10:23         ` Paolo Bonzini
  0 siblings, 2 replies; 37+ messages in thread
From: Eduardo Habkost @ 2017-09-09 22:07 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: Thomas Huth, qemu-devel, Richard Henderson, cohuck, borntraeger,
	Alexander Graf, Matthew Rosato, Eric Blake, Markus Armbruster,
	Paolo Bonzini

On Fri, Sep 08, 2017 at 02:46:36PM +0200, David Hildenbrand wrote:
> On 08.09.2017 06:21, Thomas Huth wrote:
> > On 07.09.2017 22:13, David Hildenbrand wrote:
> >> Implemented in sclp.c, so let's move it to the right include file.
> >> Fix up one include. Do a forward declaration of CPUS390XState to fix the
> >> two sclp consoles complaining.
> >>
> >> Signed-off-by: David Hildenbrand <david@redhat.com>
> >> ---
> >>  include/hw/s390x/sclp.h    | 2 ++
> >>  target/s390x/cpu.h         | 1 -
> >>  target/s390x/misc_helper.c | 1 +
> >>  3 files changed, 3 insertions(+), 1 deletion(-)
> >>
> >> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> >> index a72d096081..4b86a8a293 100644
> >> --- a/include/hw/s390x/sclp.h
> >> +++ b/include/hw/s390x/sclp.h
> >> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
> >>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
> >>  void sclp_service_interrupt(uint32_t sccb);
> >>  void raise_irq_cpu_hotplug(void);
> >> +typedef struct CPUS390XState CPUS390XState;
> >> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> > 
> > That's dangerous and likely does not work with certain versions of GCC.
> > You can't do a "forward declaration" with typedef in C, I'm afraid. See
> > for example:
> > 
> >  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
> >  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
> >  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
> > 
> > All this typedef'ing in QEMU is pretty bad ... we run into this problem
> > again and again. include/qemu/typedefs.h is just a work-around for this.
> > I know people like typedefs for some reasons (I used to do that, too,
> > before I realized the trouble with them), but IMHO we should rather
> > adopt the typedef-related rules from the kernel coding conventions instead:
> > 
> >  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
> > 
> >   Thomas
> > 
> 
> Yes, this is really nasty. And I wasn't aware of the involved issues.
> 
> This seems to be the only feasible solution (including cpu.h sounds
> wrong and will require a bunch of other includes):
> 
> 
> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> index a72d096081..ce80915a02 100644
> --- a/include/hw/s390x/sclp.h
> +++ b/include/hw/s390x/sclp.h
> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev
> *init_sclp_memory_hotplug_dev(void);
>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>  void sclp_service_interrupt(uint32_t sccb);
>  void raise_irq_cpu_hotplug(void);
> +struct CPUS390XState;
> +int sclp_service_call(struct CPUS390XState *env, uint64_t sccb,
> uint32_t code);
> 
>  #endif

Why not use typedefs.h?

Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
index 4b86a8a293..3512bf8283 100644
--- a/include/hw/s390x/sclp.h
+++ b/include/hw/s390x/sclp.h
@@ -242,7 +242,6 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
 sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
 void sclp_service_interrupt(uint32_t sccb);
 void raise_irq_cpu_hotplug(void);
-typedef struct CPUS390XState CPUS390XState;
 int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
 
 #endif
diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
index 39bc8351a3..9c97bffa92 100644
--- a/include/qemu/typedefs.h
+++ b/include/qemu/typedefs.h
@@ -21,6 +21,7 @@ typedef struct Chardev Chardev;
 typedef struct CompatProperty CompatProperty;
 typedef struct CPUAddressSpace CPUAddressSpace;
 typedef struct CPUState CPUState;
+typedef struct CPUS390XState CPUS390XState;
 typedef struct DeviceListener DeviceListener;
 typedef struct DeviceState DeviceState;
 typedef struct DirtyBitmapSnapshot DirtyBitmapSnapshot;
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 032d1de2e8..f99a82cd5e 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -80,7 +80,7 @@ typedef struct MchkQueue {
     uint16_t type;
 } MchkQueue;
 
-typedef struct CPUS390XState {
+struct CPUS390XState {
     uint64_t regs[16];     /* GP registers */
     /*
      * The floating point registers are part of the vector registers.
@@ -174,7 +174,7 @@ typedef struct CPUS390XState {
     /* currently processed sigp order */
     uint8_t sigp_order;
 
-} CPUS390XState;
+};
 
 static inline CPU_DoubleU *get_freg(CPUS390XState *cs, int nr)
 {



> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> index 3aa2e46aac..032d1de2e8 100644
> --- a/target/s390x/cpu.h
> +++ b/target/s390x/cpu.h
> @@ -721,6 +721,5 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr,
> uint8_t ar, void *hostbuf,
> 
>  /* outside of target/s390x/ */
>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
> -int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> 
>  #endif
> diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
> index b142db71c6..8b07535b02 100644
> --- a/target/s390x/misc_helper.c
> +++ b/target/s390x/misc_helper.c
> @@ -35,6 +35,7 @@
>  #include "sysemu/sysemu.h"
>  #include "hw/s390x/ebcdic.h"
>  #include "hw/s390x/s390-virtio-hcall.h"
> +#include "hw/s390x/sclp.h"
>  #endif
> 
>  /* #define DEBUG_HELPER */
> 
> 
> Opinions?
> 
> 
> 
> -- 
> 
> Thanks,
> 
> David

-- 
Eduardo

^ permalink raw reply related	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-08 12:29     ` Markus Armbruster
@ 2017-09-11  2:19       ` Thomas Huth
  2017-10-02  7:01         ` Markus Armbruster
  0 siblings, 1 reply; 37+ messages in thread
From: Thomas Huth @ 2017-09-11  2:19 UTC (permalink / raw)
  To: Markus Armbruster
  Cc: David Hildenbrand, qemu-devel, Matthew Rosato, Eduardo Habkost,
	cohuck, Richard Henderson, Alexander Graf, borntraeger,
	Paolo Bonzini

On 08.09.2017 14:29, Markus Armbruster wrote:
> Thomas Huth <thuth@redhat.com> writes:
> 
>> On 07.09.2017 22:13, David Hildenbrand wrote:
>>> Implemented in sclp.c, so let's move it to the right include file.
>>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
>>> two sclp consoles complaining.
>>>
>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>> ---
>>>  include/hw/s390x/sclp.h    | 2 ++
>>>  target/s390x/cpu.h         | 1 -
>>>  target/s390x/misc_helper.c | 1 +
>>>  3 files changed, 3 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>>> index a72d096081..4b86a8a293 100644
>>> --- a/include/hw/s390x/sclp.h
>>> +++ b/include/hw/s390x/sclp.h
>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>>  void sclp_service_interrupt(uint32_t sccb);
>>>  void raise_irq_cpu_hotplug(void);
>>> +typedef struct CPUS390XState CPUS390XState;
>>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>>
>> That's dangerous and likely does not work with certain versions of GCC.
>> You can't do a "forward declaration" with typedef in C, I'm afraid. See
>> for example:
>>
>>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
>>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
>>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
>>
>> All this typedef'ing in QEMU is pretty bad ... we run into this problem
>> again and again. include/qemu/typedefs.h is just a work-around for this.
>> I know people like typedefs for some reasons (I used to do that, too,
>> before I realized the trouble with them), but IMHO we should rather
>> adopt the typedef-related rules from the kernel coding conventions instead:
>>
>>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
> 
> I prefer the kernel style for typedefs myself.  But it's strictly a
> matter of style.  Excessive typedeffing makes code harder to understand,
> it isn't wrong.  The part that's wrong is defining things more than
> once, and that applies to everything, not just typedefs.
> 
> Sometimes you get away with defining something more than once.  It's
> still wrong.
> 
> You're not supposed to define the same variable more than once, either
> (although many C compilers let you get away with it, see -fno-common).
> You define it in *one* place.  If you need to declare it, declare it in
> *one* place, and make sure that place is in scope at the definition, so
> the compiler can check the two match.
> 
> Likewise, you're not supposed to define the same struct tag more than
> once, and you should declare it in just one place.

AFAIK it's perfect valid C to do a forward declaration of a struct
multiple times by just writing e.g. "struct CPUS390XState;" somewhere in
your code. This is also what is done in various Linux kernel headers all
over the place.

> Likewise, you're not supposed to define (with typedef) the same type
> more than once.  There is no such thing as a typedef declaration.
> 
> qemu/typedefs.h is not a work-around for a typedef-happy style.  Its
> purpose is breaking inclusion cycles.  Secondary purpose is reducing the
> need for non-cyclic includes.  If we didn't typedef, we'd still put our
> struct declarations there.

No, since it's not required for struct forward declarations, only to
avoid multiple typedef definitions.

 Thomas

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-09 22:07       ` Eduardo Habkost
@ 2017-09-11  2:23         ` Thomas Huth
  2017-09-11 18:22           ` Eduardo Habkost
  2017-09-11 10:23         ` Paolo Bonzini
  1 sibling, 1 reply; 37+ messages in thread
From: Thomas Huth @ 2017-09-11  2:23 UTC (permalink / raw)
  To: Eduardo Habkost, David Hildenbrand
  Cc: qemu-devel, Richard Henderson, cohuck, borntraeger,
	Alexander Graf, Matthew Rosato, Eric Blake, Markus Armbruster,
	Paolo Bonzini

On 10.09.2017 00:07, Eduardo Habkost wrote:
> On Fri, Sep 08, 2017 at 02:46:36PM +0200, David Hildenbrand wrote:
>> On 08.09.2017 06:21, Thomas Huth wrote:
>>> On 07.09.2017 22:13, David Hildenbrand wrote:
>>>> Implemented in sclp.c, so let's move it to the right include file.
>>>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
>>>> two sclp consoles complaining.
>>>>
>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>> ---
>>>>  include/hw/s390x/sclp.h    | 2 ++
>>>>  target/s390x/cpu.h         | 1 -
>>>>  target/s390x/misc_helper.c | 1 +
>>>>  3 files changed, 3 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>>>> index a72d096081..4b86a8a293 100644
>>>> --- a/include/hw/s390x/sclp.h
>>>> +++ b/include/hw/s390x/sclp.h
>>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>>>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>>>  void sclp_service_interrupt(uint32_t sccb);
>>>>  void raise_irq_cpu_hotplug(void);
>>>> +typedef struct CPUS390XState CPUS390XState;
>>>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>>>
>>> That's dangerous and likely does not work with certain versions of GCC.
>>> You can't do a "forward declaration" with typedef in C, I'm afraid. See
>>> for example:
>>>
>>>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
>>>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
>>>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
>>>
>>> All this typedef'ing in QEMU is pretty bad ... we run into this problem
>>> again and again. include/qemu/typedefs.h is just a work-around for this.
>>> I know people like typedefs for some reasons (I used to do that, too,
>>> before I realized the trouble with them), but IMHO we should rather
>>> adopt the typedef-related rules from the kernel coding conventions instead:
>>>
>>>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
>>>
>>>   Thomas
>>>
>>
>> Yes, this is really nasty. And I wasn't aware of the involved issues.
>>
>> This seems to be the only feasible solution (including cpu.h sounds
>> wrong and will require a bunch of other includes):
>>
>>
>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>> index a72d096081..ce80915a02 100644
>> --- a/include/hw/s390x/sclp.h
>> +++ b/include/hw/s390x/sclp.h
>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev
>> *init_sclp_memory_hotplug_dev(void);
>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>  void sclp_service_interrupt(uint32_t sccb);
>>  void raise_irq_cpu_hotplug(void);
>> +struct CPUS390XState;
>> +int sclp_service_call(struct CPUS390XState *env, uint64_t sccb,
>> uint32_t code);
>>
>>  #endif
> 
> Why not use typedefs.h?
> 
> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> index 4b86a8a293..3512bf8283 100644
> --- a/include/hw/s390x/sclp.h
> +++ b/include/hw/s390x/sclp.h
> @@ -242,7 +242,6 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>  void sclp_service_interrupt(uint32_t sccb);
>  void raise_irq_cpu_hotplug(void);
> -typedef struct CPUS390XState CPUS390XState;
>  int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>  
>  #endif
> diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
> index 39bc8351a3..9c97bffa92 100644
> --- a/include/qemu/typedefs.h
> +++ b/include/qemu/typedefs.h

Using include/qemu/typedefs.h here is IMHO really ugly. Do we really
want to pollute a common include file with target specific code? My
preferences are first to avoid typdefs, but if we really need/want them
(do we? There is no comment about this in our coding styles), I think we
should rather introduce target-specific typedefs.h headers, too, for
everything that is not part of the common code.

 Thomas

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-09 22:07       ` Eduardo Habkost
  2017-09-11  2:23         ` Thomas Huth
@ 2017-09-11 10:23         ` Paolo Bonzini
  2017-09-11 13:45           ` David Hildenbrand
  2017-09-11 17:52           ` Eduardo Habkost
  1 sibling, 2 replies; 37+ messages in thread
From: Paolo Bonzini @ 2017-09-11 10:23 UTC (permalink / raw)
  To: Eduardo Habkost, David Hildenbrand
  Cc: Thomas Huth, qemu-devel, Richard Henderson, cohuck, borntraeger,
	Alexander Graf, Matthew Rosato, Eric Blake, Markus Armbruster

On 10/09/2017 00:07, Eduardo Habkost wrote:
> On Fri, Sep 08, 2017 at 02:46:36PM +0200, David Hildenbrand wrote:
>> On 08.09.2017 06:21, Thomas Huth wrote:
>>> On 07.09.2017 22:13, David Hildenbrand wrote:
>>>> Implemented in sclp.c, so let's move it to the right include file.
>>>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
>>>> two sclp consoles complaining.
>>>>
>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>> ---
>>>>  include/hw/s390x/sclp.h    | 2 ++
>>>>  target/s390x/cpu.h         | 1 -
>>>>  target/s390x/misc_helper.c | 1 +
>>>>  3 files changed, 3 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>>>> index a72d096081..4b86a8a293 100644
>>>> --- a/include/hw/s390x/sclp.h
>>>> +++ b/include/hw/s390x/sclp.h
>>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>>>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>>>  void sclp_service_interrupt(uint32_t sccb);
>>>>  void raise_irq_cpu_hotplug(void);
>>>> +typedef struct CPUS390XState CPUS390XState;
>>>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>>>
>>> That's dangerous and likely does not work with certain versions of GCC.
>>> You can't do a "forward declaration" with typedef in C, I'm afraid. See
>>> for example:
>>>
>>>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
>>>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
>>>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
>>>
>>> All this typedef'ing in QEMU is pretty bad ... we run into this problem
>>> again and again. include/qemu/typedefs.h is just a work-around for this.
>>> I know people like typedefs for some reasons (I used to do that, too,
>>> before I realized the trouble with them), but IMHO we should rather
>>> adopt the typedef-related rules from the kernel coding conventions instead:
>>>
>>>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
>>>
>>>   Thomas
>>>
>>
>> Yes, this is really nasty. And I wasn't aware of the involved issues.
>>
>> This seems to be the only feasible solution (including cpu.h sounds
>> wrong and will require a bunch of other includes):
>>
>>
>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>> index a72d096081..ce80915a02 100644
>> --- a/include/hw/s390x/sclp.h
>> +++ b/include/hw/s390x/sclp.h
>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev
>> *init_sclp_memory_hotplug_dev(void);
>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>  void sclp_service_interrupt(uint32_t sccb);
>>  void raise_irq_cpu_hotplug(void);
>> +struct CPUS390XState;
>> +int sclp_service_call(struct CPUS390XState *env, uint64_t sccb,
>> uint32_t code);
>>
>>  #endif
> 
> Why not use typedefs.h?

See Markus's reply.  But, maybe it's even better to use S390CPU* and
include target/s390x/cpu-qom.h, which by design provides as little
definitions as needed.

> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> ---
> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> index 4b86a8a293..3512bf8283 100644
> --- a/include/hw/s390x/sclp.h
> +++ b/include/hw/s390x/sclp.h
> @@ -242,7 +242,6 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>  void sclp_service_interrupt(uint32_t sccb);
>  void raise_irq_cpu_hotplug(void);
> -typedef struct CPUS390XState CPUS390XState;
>  int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>  
>  #endif
> diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
> index 39bc8351a3..9c97bffa92 100644
> --- a/include/qemu/typedefs.h
> +++ b/include/qemu/typedefs.h
> @@ -21,6 +21,7 @@ typedef struct Chardev Chardev;
>  typedef struct CompatProperty CompatProperty;
>  typedef struct CPUAddressSpace CPUAddressSpace;
>  typedef struct CPUState CPUState;
> +typedef struct CPUS390XState CPUS390XState;
>  typedef struct DeviceListener DeviceListener;
>  typedef struct DeviceState DeviceState;
>  typedef struct DirtyBitmapSnapshot DirtyBitmapSnapshot;
> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> index 032d1de2e8..f99a82cd5e 100644
> --- a/target/s390x/cpu.h
> +++ b/target/s390x/cpu.h
> @@ -80,7 +80,7 @@ typedef struct MchkQueue {
>      uint16_t type;
>  } MchkQueue;
>  
> -typedef struct CPUS390XState {
> +struct CPUS390XState {
>      uint64_t regs[16];     /* GP registers */
>      /*
>       * The floating point registers are part of the vector registers.
> @@ -174,7 +174,7 @@ typedef struct CPUS390XState {
>      /* currently processed sigp order */
>      uint8_t sigp_order;
>  
> -} CPUS390XState;
> +};
>  
>  static inline CPU_DoubleU *get_freg(CPUS390XState *cs, int nr)
>  {
> 
> 
> 
>> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
>> index 3aa2e46aac..032d1de2e8 100644
>> --- a/target/s390x/cpu.h
>> +++ b/target/s390x/cpu.h
>> @@ -721,6 +721,5 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr,
>> uint8_t ar, void *hostbuf,
>>
>>  /* outside of target/s390x/ */
>>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
>> -int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>>
>>  #endif
>> diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
>> index b142db71c6..8b07535b02 100644
>> --- a/target/s390x/misc_helper.c
>> +++ b/target/s390x/misc_helper.c
>> @@ -35,6 +35,7 @@
>>  #include "sysemu/sysemu.h"
>>  #include "hw/s390x/ebcdic.h"
>>  #include "hw/s390x/s390-virtio-hcall.h"
>> +#include "hw/s390x/sclp.h"
>>  #endif
>>
>>  /* #define DEBUG_HELPER */
>>
>>
>> Opinions?
>>
>>
>>
>> -- 
>>
>> Thanks,
>>
>> David
> 

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-11 10:23         ` Paolo Bonzini
@ 2017-09-11 13:45           ` David Hildenbrand
  2017-09-11 17:52           ` Eduardo Habkost
  1 sibling, 0 replies; 37+ messages in thread
From: David Hildenbrand @ 2017-09-11 13:45 UTC (permalink / raw)
  To: Paolo Bonzini, Eduardo Habkost
  Cc: Thomas Huth, qemu-devel, Richard Henderson, cohuck, borntraeger,
	Alexander Graf, Matthew Rosato, Eric Blake, Markus Armbruster

On 11.09.2017 12:23, Paolo Bonzini wrote:
> On 10/09/2017 00:07, Eduardo Habkost wrote:
>> On Fri, Sep 08, 2017 at 02:46:36PM +0200, David Hildenbrand wrote:
>>> On 08.09.2017 06:21, Thomas Huth wrote:
>>>> On 07.09.2017 22:13, David Hildenbrand wrote:
>>>>> Implemented in sclp.c, so let's move it to the right include file.
>>>>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
>>>>> two sclp consoles complaining.
>>>>>
>>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>>> ---
>>>>>  include/hw/s390x/sclp.h    | 2 ++
>>>>>  target/s390x/cpu.h         | 1 -
>>>>>  target/s390x/misc_helper.c | 1 +
>>>>>  3 files changed, 3 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>>>>> index a72d096081..4b86a8a293 100644
>>>>> --- a/include/hw/s390x/sclp.h
>>>>> +++ b/include/hw/s390x/sclp.h
>>>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>>>>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>>>>  void sclp_service_interrupt(uint32_t sccb);
>>>>>  void raise_irq_cpu_hotplug(void);
>>>>> +typedef struct CPUS390XState CPUS390XState;
>>>>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>>>>
>>>> That's dangerous and likely does not work with certain versions of GCC.
>>>> You can't do a "forward declaration" with typedef in C, I'm afraid. See
>>>> for example:
>>>>
>>>>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
>>>>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
>>>>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
>>>>
>>>> All this typedef'ing in QEMU is pretty bad ... we run into this problem
>>>> again and again. include/qemu/typedefs.h is just a work-around for this.
>>>> I know people like typedefs for some reasons (I used to do that, too,
>>>> before I realized the trouble with them), but IMHO we should rather
>>>> adopt the typedef-related rules from the kernel coding conventions instead:
>>>>
>>>>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
>>>>
>>>>   Thomas
>>>>
>>>
>>> Yes, this is really nasty. And I wasn't aware of the involved issues.
>>>
>>> This seems to be the only feasible solution (including cpu.h sounds
>>> wrong and will require a bunch of other includes):
>>>
>>>
>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>>> index a72d096081..ce80915a02 100644
>>> --- a/include/hw/s390x/sclp.h
>>> +++ b/include/hw/s390x/sclp.h
>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev
>>> *init_sclp_memory_hotplug_dev(void);
>>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>>  void sclp_service_interrupt(uint32_t sccb);
>>>  void raise_irq_cpu_hotplug(void);
>>> +struct CPUS390XState;
>>> +int sclp_service_call(struct CPUS390XState *env, uint64_t sccb,
>>> uint32_t code);
>>>
>>>  #endif
>>
>> Why not use typedefs.h?
> 
> See Markus's reply.  But, maybe it's even better to use S390CPU* and
> include target/s390x/cpu-qom.h, which by design provides as little
> definitions as needed.

I'll go with that approach. I'll drop the dependency from cpu-qom.h to
cpu_models.h (by moving typedefs to cpu-qom.h). This makes it compile at
hopefully should then be good enough for now.

(this approach implies dropping patch "[PATCH v3 05/21] target/s390x:
move typedef of S390CPU to its definition").

Thanks!

> 
>> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>


-- 

Thanks,

David

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-11 10:23         ` Paolo Bonzini
  2017-09-11 13:45           ` David Hildenbrand
@ 2017-09-11 17:52           ` Eduardo Habkost
  2017-09-11 17:56             ` David Hildenbrand
  1 sibling, 1 reply; 37+ messages in thread
From: Eduardo Habkost @ 2017-09-11 17:52 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: David Hildenbrand, Thomas Huth, qemu-devel, Richard Henderson,
	cohuck, borntraeger, Alexander Graf, Matthew Rosato, Eric Blake,
	Markus Armbruster

On Mon, Sep 11, 2017 at 12:23:10PM +0200, Paolo Bonzini wrote:
> On 10/09/2017 00:07, Eduardo Habkost wrote:
> > On Fri, Sep 08, 2017 at 02:46:36PM +0200, David Hildenbrand wrote:
> >> On 08.09.2017 06:21, Thomas Huth wrote:
> >>> On 07.09.2017 22:13, David Hildenbrand wrote:
> >>>> Implemented in sclp.c, so let's move it to the right include file.
> >>>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
> >>>> two sclp consoles complaining.
> >>>>
> >>>> Signed-off-by: David Hildenbrand <david@redhat.com>
> >>>> ---
> >>>>  include/hw/s390x/sclp.h    | 2 ++
> >>>>  target/s390x/cpu.h         | 1 -
> >>>>  target/s390x/misc_helper.c | 1 +
> >>>>  3 files changed, 3 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> >>>> index a72d096081..4b86a8a293 100644
> >>>> --- a/include/hw/s390x/sclp.h
> >>>> +++ b/include/hw/s390x/sclp.h
> >>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
> >>>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
> >>>>  void sclp_service_interrupt(uint32_t sccb);
> >>>>  void raise_irq_cpu_hotplug(void);
> >>>> +typedef struct CPUS390XState CPUS390XState;
> >>>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> >>>
> >>> That's dangerous and likely does not work with certain versions of GCC.
> >>> You can't do a "forward declaration" with typedef in C, I'm afraid. See
> >>> for example:
> >>>
> >>>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
> >>>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
> >>>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
> >>>
> >>> All this typedef'ing in QEMU is pretty bad ... we run into this problem
> >>> again and again. include/qemu/typedefs.h is just a work-around for this.
> >>> I know people like typedefs for some reasons (I used to do that, too,
> >>> before I realized the trouble with them), but IMHO we should rather
> >>> adopt the typedef-related rules from the kernel coding conventions instead:
> >>>
> >>>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
> >>>
> >>>   Thomas
> >>>
> >>
> >> Yes, this is really nasty. And I wasn't aware of the involved issues.
> >>
> >> This seems to be the only feasible solution (including cpu.h sounds
> >> wrong and will require a bunch of other includes):
> >>
> >>
> >> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> >> index a72d096081..ce80915a02 100644
> >> --- a/include/hw/s390x/sclp.h
> >> +++ b/include/hw/s390x/sclp.h
> >> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev
> >> *init_sclp_memory_hotplug_dev(void);
> >>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
> >>  void sclp_service_interrupt(uint32_t sccb);
> >>  void raise_irq_cpu_hotplug(void);
> >> +struct CPUS390XState;
> >> +int sclp_service_call(struct CPUS390XState *env, uint64_t sccb,
> >> uint32_t code);
> >>
> >>  #endif
> > 
> > Why not use typedefs.h?
> 
> See Markus's reply.  But, maybe it's even better to use S390CPU* and
> include target/s390x/cpu-qom.h, which by design provides as little
> definitions as needed.

I don't see an argument against moving typedef CPUS390XState to
typedefs.h in Markus' reply.  I see one argument for it (reducing
the need for non-cyclic includes).

cpu-qom.h includes cpu.h, so I don't know why using S390CPU*
would solve any problem.  I don't disagree about changing the
function to use S390CPU* eventually, but it would still require
us make a choice between: a) including the header where the
typedef name is declared (cpu.h or cpu-qom.h); or b) moving the
typedef name declaration to typedefs.h.

> 
> > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> > ---
> > diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> > index 4b86a8a293..3512bf8283 100644
> > --- a/include/hw/s390x/sclp.h
> > +++ b/include/hw/s390x/sclp.h
> > @@ -242,7 +242,6 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
> >  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
> >  void sclp_service_interrupt(uint32_t sccb);
> >  void raise_irq_cpu_hotplug(void);
> > -typedef struct CPUS390XState CPUS390XState;
> >  int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> >  
> >  #endif
> > diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
> > index 39bc8351a3..9c97bffa92 100644
> > --- a/include/qemu/typedefs.h
> > +++ b/include/qemu/typedefs.h
> > @@ -21,6 +21,7 @@ typedef struct Chardev Chardev;
> >  typedef struct CompatProperty CompatProperty;
> >  typedef struct CPUAddressSpace CPUAddressSpace;
> >  typedef struct CPUState CPUState;
> > +typedef struct CPUS390XState CPUS390XState;
> >  typedef struct DeviceListener DeviceListener;
> >  typedef struct DeviceState DeviceState;
> >  typedef struct DirtyBitmapSnapshot DirtyBitmapSnapshot;
> > diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> > index 032d1de2e8..f99a82cd5e 100644
> > --- a/target/s390x/cpu.h
> > +++ b/target/s390x/cpu.h
> > @@ -80,7 +80,7 @@ typedef struct MchkQueue {
> >      uint16_t type;
> >  } MchkQueue;
> >  
> > -typedef struct CPUS390XState {
> > +struct CPUS390XState {
> >      uint64_t regs[16];     /* GP registers */
> >      /*
> >       * The floating point registers are part of the vector registers.
> > @@ -174,7 +174,7 @@ typedef struct CPUS390XState {
> >      /* currently processed sigp order */
> >      uint8_t sigp_order;
> >  
> > -} CPUS390XState;
> > +};
> >  
> >  static inline CPU_DoubleU *get_freg(CPUS390XState *cs, int nr)
> >  {
> > 
> > 
> > 
> >> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> >> index 3aa2e46aac..032d1de2e8 100644
> >> --- a/target/s390x/cpu.h
> >> +++ b/target/s390x/cpu.h
> >> @@ -721,6 +721,5 @@ int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr,
> >> uint8_t ar, void *hostbuf,
> >>
> >>  /* outside of target/s390x/ */
> >>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
> >> -int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> >>
> >>  #endif
> >> diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c
> >> index b142db71c6..8b07535b02 100644
> >> --- a/target/s390x/misc_helper.c
> >> +++ b/target/s390x/misc_helper.c
> >> @@ -35,6 +35,7 @@
> >>  #include "sysemu/sysemu.h"
> >>  #include "hw/s390x/ebcdic.h"
> >>  #include "hw/s390x/s390-virtio-hcall.h"
> >> +#include "hw/s390x/sclp.h"
> >>  #endif
> >>
> >>  /* #define DEBUG_HELPER */
> >>
> >>
> >> Opinions?
> >>
> >>
> >>
> >> -- 
> >>
> >> Thanks,
> >>
> >> David
> > 
> 

-- 
Eduardo

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-11 17:52           ` Eduardo Habkost
@ 2017-09-11 17:56             ` David Hildenbrand
  2017-09-11 18:06               ` Eduardo Habkost
  0 siblings, 1 reply; 37+ messages in thread
From: David Hildenbrand @ 2017-09-11 17:56 UTC (permalink / raw)
  To: Eduardo Habkost, Paolo Bonzini
  Cc: Thomas Huth, qemu-devel, Richard Henderson, cohuck, borntraeger,
	Alexander Graf, Matthew Rosato, Eric Blake, Markus Armbruster


>>>>
>>>>  #endif
>>>
>>> Why not use typedefs.h?
>>
>> See Markus's reply.  But, maybe it's even better to use S390CPU* and
>> include target/s390x/cpu-qom.h, which by design provides as little
>> definitions as needed.
> 
> I don't see an argument against moving typedef CPUS390XState to
> typedefs.h in Markus' reply.  I see one argument for it (reducing
> the need for non-cyclic includes).
> 
> cpu-qom.h includes cpu.h, so I don't know why using S390CPU*
> would solve any problem.  I don't disagree about changing the
> function to use S390CPU* eventually, but it would still require
> us make a choice between: a) including the header where the
> typedef name is declared (cpu.h or cpu-qom.h); or b) moving the
> typedef name declaration to typedefs.h.

It includes qom/cpu.h, not cpu.h. That's why using cpu-qom.h for such
typedefs works (see v4).

Thanks!

-- 

Thanks,

David

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-11 17:56             ` David Hildenbrand
@ 2017-09-11 18:06               ` Eduardo Habkost
  0 siblings, 0 replies; 37+ messages in thread
From: Eduardo Habkost @ 2017-09-11 18:06 UTC (permalink / raw)
  To: David Hildenbrand
  Cc: Paolo Bonzini, Thomas Huth, qemu-devel, Richard Henderson,
	cohuck, borntraeger, Alexander Graf, Matthew Rosato, Eric Blake,
	Markus Armbruster

On Mon, Sep 11, 2017 at 07:56:19PM +0200, David Hildenbrand wrote:
> 
> >>>>
> >>>>  #endif
> >>>
> >>> Why not use typedefs.h?
> >>
> >> See Markus's reply.  But, maybe it's even better to use S390CPU* and
> >> include target/s390x/cpu-qom.h, which by design provides as little
> >> definitions as needed.
> > 
> > I don't see an argument against moving typedef CPUS390XState to
> > typedefs.h in Markus' reply.  I see one argument for it (reducing
> > the need for non-cyclic includes).
> > 
> > cpu-qom.h includes cpu.h, so I don't know why using S390CPU*
> > would solve any problem.  I don't disagree about changing the
> > function to use S390CPU* eventually, but it would still require
> > us make a choice between: a) including the header where the
> > typedef name is declared (cpu.h or cpu-qom.h); or b) moving the
> > typedef name declaration to typedefs.h.
> 
> It includes qom/cpu.h, not cpu.h. That's why using cpu-qom.h for such
> typedefs works (see v4).
> 

Oops, I was looking at an older tree (before commit 347b1a5c).
You're right, sorry for the noise.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-11  2:23         ` Thomas Huth
@ 2017-09-11 18:22           ` Eduardo Habkost
  0 siblings, 0 replies; 37+ messages in thread
From: Eduardo Habkost @ 2017-09-11 18:22 UTC (permalink / raw)
  To: Thomas Huth
  Cc: David Hildenbrand, qemu-devel, Richard Henderson, cohuck,
	borntraeger, Alexander Graf, Matthew Rosato, Eric Blake,
	Markus Armbruster, Paolo Bonzini

On Mon, Sep 11, 2017 at 04:23:09AM +0200, Thomas Huth wrote:
> On 10.09.2017 00:07, Eduardo Habkost wrote:
> > On Fri, Sep 08, 2017 at 02:46:36PM +0200, David Hildenbrand wrote:
> >> On 08.09.2017 06:21, Thomas Huth wrote:
> >>> On 07.09.2017 22:13, David Hildenbrand wrote:
> >>>> Implemented in sclp.c, so let's move it to the right include file.
> >>>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
> >>>> two sclp consoles complaining.
> >>>>
> >>>> Signed-off-by: David Hildenbrand <david@redhat.com>
> >>>> ---
> >>>>  include/hw/s390x/sclp.h    | 2 ++
> >>>>  target/s390x/cpu.h         | 1 -
> >>>>  target/s390x/misc_helper.c | 1 +
> >>>>  3 files changed, 3 insertions(+), 1 deletion(-)
> >>>>
> >>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> >>>> index a72d096081..4b86a8a293 100644
> >>>> --- a/include/hw/s390x/sclp.h
> >>>> +++ b/include/hw/s390x/sclp.h
> >>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
> >>>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
> >>>>  void sclp_service_interrupt(uint32_t sccb);
> >>>>  void raise_irq_cpu_hotplug(void);
> >>>> +typedef struct CPUS390XState CPUS390XState;
> >>>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> >>>
> >>> That's dangerous and likely does not work with certain versions of GCC.
> >>> You can't do a "forward declaration" with typedef in C, I'm afraid. See
> >>> for example:
> >>>
> >>>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
> >>>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
> >>>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
> >>>
> >>> All this typedef'ing in QEMU is pretty bad ... we run into this problem
> >>> again and again. include/qemu/typedefs.h is just a work-around for this.
> >>> I know people like typedefs for some reasons (I used to do that, too,
> >>> before I realized the trouble with them), but IMHO we should rather
> >>> adopt the typedef-related rules from the kernel coding conventions instead:
> >>>
> >>>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
> >>>
> >>>   Thomas
> >>>
> >>
> >> Yes, this is really nasty. And I wasn't aware of the involved issues.
> >>
> >> This seems to be the only feasible solution (including cpu.h sounds
> >> wrong and will require a bunch of other includes):
> >>
> >>
> >> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> >> index a72d096081..ce80915a02 100644
> >> --- a/include/hw/s390x/sclp.h
> >> +++ b/include/hw/s390x/sclp.h
> >> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev
> >> *init_sclp_memory_hotplug_dev(void);
> >>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
> >>  void sclp_service_interrupt(uint32_t sccb);
> >>  void raise_irq_cpu_hotplug(void);
> >> +struct CPUS390XState;
> >> +int sclp_service_call(struct CPUS390XState *env, uint64_t sccb,
> >> uint32_t code);
> >>
> >>  #endif
> > 
> > Why not use typedefs.h?
> > 
> > Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
> > ---
> > diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> > index 4b86a8a293..3512bf8283 100644
> > --- a/include/hw/s390x/sclp.h
> > +++ b/include/hw/s390x/sclp.h
> > @@ -242,7 +242,6 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
> >  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
> >  void sclp_service_interrupt(uint32_t sccb);
> >  void raise_irq_cpu_hotplug(void);
> > -typedef struct CPUS390XState CPUS390XState;
> >  int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
> >  
> >  #endif
> > diff --git a/include/qemu/typedefs.h b/include/qemu/typedefs.h
> > index 39bc8351a3..9c97bffa92 100644
> > --- a/include/qemu/typedefs.h
> > +++ b/include/qemu/typedefs.h
> 
> Using include/qeemu/typedefs.h here is IMHO really ugly. Do we really
> want to pollute a common include file with target specific code? My
> preferences are first to avoid typdefs, but if we really need/want them
> (do we? There is no comment about this in our coding styles), I think we
> should rather introduce target-specific typedefs.h headers, too, for
> everything that is not part of the common code.

I don't see any advantage in splitting typedefs.h into
arch-specific files.  We don't split typedefs.h into
subsystem-specific or device-specific headers, so I don't see we
would need a per-architecture split either.  typedefs.h is just a
global collection of type identifiers that helps us reduce header
dependency hell.

(Anyway, the current problem is now going solved by using
S390CPU* instead of CPUS390XState*, so there's no need to touch
typedefs.h this time.)

About keeping using typedefs: I don't have an strong opinion
for/against them[1], but I would prefer to keep style consistent
even if it's not explicitly documented.

[1] The fact that it would make typedefs.h completely unnecessary
    makes me inclined towards the suggestion to stop using them.

-- 
Eduardo

^ permalink raw reply	[flat|nested] 37+ messages in thread

* Re: [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h
  2017-09-11  2:19       ` Thomas Huth
@ 2017-10-02  7:01         ` Markus Armbruster
  0 siblings, 0 replies; 37+ messages in thread
From: Markus Armbruster @ 2017-10-02  7:01 UTC (permalink / raw)
  To: Thomas Huth
  Cc: Matthew Rosato, Eduardo Habkost, David Hildenbrand, cohuck,
	Richard Henderson, qemu-devel, Alexander Graf, borntraeger,
	Paolo Bonzini

Thomas Huth <thuth@redhat.com> writes:

> On 08.09.2017 14:29, Markus Armbruster wrote:
>> Thomas Huth <thuth@redhat.com> writes:
>> 
>>> On 07.09.2017 22:13, David Hildenbrand wrote:
>>>> Implemented in sclp.c, so let's move it to the right include file.
>>>> Fix up one include. Do a forward declaration of CPUS390XState to fix the
>>>> two sclp consoles complaining.
>>>>
>>>> Signed-off-by: David Hildenbrand <david@redhat.com>
>>>> ---
>>>>  include/hw/s390x/sclp.h    | 2 ++
>>>>  target/s390x/cpu.h         | 1 -
>>>>  target/s390x/misc_helper.c | 1 +
>>>>  3 files changed, 3 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>>>> index a72d096081..4b86a8a293 100644
>>>> --- a/include/hw/s390x/sclp.h
>>>> +++ b/include/hw/s390x/sclp.h
>>>> @@ -242,5 +242,7 @@ sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev(void);
>>>>  sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev(void);
>>>>  void sclp_service_interrupt(uint32_t sccb);
>>>>  void raise_irq_cpu_hotplug(void);
>>>> +typedef struct CPUS390XState CPUS390XState;
>>>> +int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
>>>
>>> That's dangerous and likely does not work with certain versions of GCC.
>>> You can't do a "forward declaration" with typedef in C, I'm afraid. See
>>> for example:
>>>
>>>  https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg01454.html
>>>  https://lists.gnu.org/archive/html/qemu-devel/2017-06/msg03337.html
>>>  https://stackoverflow.com/questions/8367646/redefinition-of-typedef
>>>
>>> All this typedef'ing in QEMU is pretty bad ... we run into this problem
>>> again and again. include/qemu/typedefs.h is just a work-around for this.
>>> I know people like typedefs for some reasons (I used to do that, too,
>>> before I realized the trouble with them), but IMHO we should rather
>>> adopt the typedef-related rules from the kernel coding conventions instead:
>>>
>>>  https://www.kernel.org/doc/html/v4.13/process/coding-style.html#typedefs
>> 
>> I prefer the kernel style for typedefs myself.  But it's strictly a
>> matter of style.  Excessive typedeffing makes code harder to understand,
>> it isn't wrong.  The part that's wrong is defining things more than
>> once, and that applies to everything, not just typedefs.
>> 
>> Sometimes you get away with defining something more than once.  It's
>> still wrong.
>> 
>> You're not supposed to define the same variable more than once, either
>> (although many C compilers let you get away with it, see -fno-common).
>> You define it in *one* place.  If you need to declare it, declare it in
>> *one* place, and make sure that place is in scope at the definition, so
>> the compiler can check the two match.
>> 
>> Likewise, you're not supposed to define the same struct tag more than
>> once, and you should declare it in just one place.
>
> AFAIK it's perfect valid C to do a forward declaration of a struct
> multiple times by just writing e.g. "struct CPUS390XState;" somewhere in
> your code. This is also what is done in various Linux kernel headers all
> over the place.

"Define it in one place" is dictated by the language, i.e. violating the
rule is wrong.

"Declare it in one place" is merely style.  I insist on it for
declarations the compiler can meaningfully check against definitions,
such as function declarations.  It can't for struct tags, and I consider
"one place" a matter of taste there.

>> Likewise, you're not supposed to define (with typedef) the same type
>> more than once.  There is no such thing as a typedef declaration.
>> 
>> qemu/typedefs.h is not a work-around for a typedef-happy style.  Its
>> purpose is breaking inclusion cycles.  Secondary purpose is reducing the
>> need for non-cyclic includes.  If we didn't typedef, we'd still put our
>> struct declarations there.
>
> No, since it's not required for struct forward declarations, only to
> avoid multiple typedef definitions.

I definitely would, because I prefer sticking to "declare in one place"
style.

^ permalink raw reply	[flat|nested] 37+ messages in thread

end of thread, other threads:[~2017-10-02  7:01 UTC | newest]

Thread overview: 37+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-07 20:13 [Qemu-devel] [PATCH v3 00/21] s390x cleanups and CPU hotplug via device_add David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 01/21] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 02/21] cpu: drop old comments describing members David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 03/21] s390x: get rid of s390-virtio.c David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 04/21] s390x: rename s390-virtio.h to s390-virtio-hcall.h David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 05/21] target/s390x: move typedef of S390CPU to its definition David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 06/21] s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 07/21] s390x: move subsystem_reset() to s390-virtio-ccw.h David Hildenbrand
2017-09-08  3:58   ` Thomas Huth
2017-09-08  7:50   ` Christian Borntraeger
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 08/21] s390x: move sclp_service_call() to sclp.h David Hildenbrand
2017-09-08  4:21   ` Thomas Huth
2017-09-08 12:29     ` Markus Armbruster
2017-09-11  2:19       ` Thomas Huth
2017-10-02  7:01         ` Markus Armbruster
2017-09-08 12:46     ` David Hildenbrand
2017-09-09 22:07       ` Eduardo Habkost
2017-09-11  2:23         ` Thomas Huth
2017-09-11 18:22           ` Eduardo Habkost
2017-09-11 10:23         ` Paolo Bonzini
2017-09-11 13:45           ` David Hildenbrand
2017-09-11 17:52           ` Eduardo Habkost
2017-09-11 17:56             ` David Hildenbrand
2017-09-11 18:06               ` Eduardo Habkost
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 09/21] target/s390x: use trigger_pgm_exception() in s390_cpu_handle_mmu_fault() David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 10/21] target/s390x: use program_interrupt() in per_check_exception() David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 11/21] s390x: allow only 1 CPU with TCG David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 12/21] target/s390x: set cpu->id for linux user when realizing David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 13/21] target/s390x: use "core-id" for cpu number/address/id handling David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 14/21] target/s390x: rename next_cpu_id to next_core_id David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 15/21] s390x: print CPU definitions in sorted order David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 16/21] s390x: allow cpu hotplug via device_add David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 17/21] s390x: CPU hot unplug via device_del cannot work for now David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 18/21] s390x: implement query-hotpluggable-cpus David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 19/21] s390x: get rid of cpu_s390x_create() David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 20/21] s390x: generate sclp cpu information from possible_cpus David Hildenbrand
2017-09-07 20:13 ` [Qemu-devel] [PATCH v3 21/21] s390x: allow CPU hotplug in random core-id order David Hildenbrand

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.