s390x cleanups and CPU hotplug via device_add
v2 cover s390x cleanups and CPU hotplug via device_add
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". So the last patches in this series differ to v1. I tried to stick as much as possible to x86.
On s390x, only complete cores can be plugged. Cores have to be plugged in the right order (core-id 0, 1, 2 ...). CPU hot unplug is not supported by the architecture.
In addition, we now also print the CPU model list in sorted order and allow only 1 CPU for TCG.
v1 -> v2:
- "exec,dump,i386,ppc,s390x: don't include exec/cpu-all.h explicitly" -- added a few instances I missed
- "s390x: get rid of s390-virtio.c"
-- move everything in the first shot and clean the "cpu_states" stuff up
in later patches, when we have ms->possible_cpus.
- Added "target/s390x: move typedef of S390CPU to its definition"
- Added "s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h"
- Added "s390x: move two function declarations to s390-virtio-ccw.h"
- Added "s390x: move sclp_service_call() to interrupt.c"
- "target/s390x: use program_interrupt() in per_check_exception()" -- Add a comment describing my concern
- "s390x: allow only 1 CPU with TCG"
-- Add a #define to easily be able to change it (e.g. for development)
- Added "target/s390x: set cpu->id for linux user when realizing"
- "target/s390x: use "core-id" for cpu number/address/id handling" -- I now use "core-id" as property name, because that will be used by device_add
- "target/s390x: rename next_cpu_id to next_core_id"
-- Also change to the term "core_id"
- Added "s390x: print CPU definitions in sorted order"
- Added "s390x: allow cpu hotplug via device_add"
- Added "s390x: CPU hot unplug via device_del cannot work"
- Added "s390x: implement query-hotpluggable-cpu"
- Added "s390x: get rid of cpu_s390x_create()"
David Hildenbrand (19):
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 two function declarations to s390-virtio-ccw.h
s390x: move sclp_service_call() to interrupt.c 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
s390x: implement query-hotpluggable-cpus
s390x: get rid of cpu_s390x_create()
dump.c | 1 - exec.c | 2 - hw/s390x/Makefile.objs | 1 - hw/s390x/s390-virtio-ccw.c | 259 +++++++++++++++++++++++++++++++++++-- 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 | 51 +------- include/hw/s390x/s390-virtio-ccw.h | 3 + include/hw/s390x/sclp.h | 1 + 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 | 86 ++++-------- target/s390x/cpu.h | 19 +-- target/s390x/cpu_models.c | 65 ++++++---- target/s390x/diag.c | 1 + target/s390x/excp_helper.c | 5 +- target/s390x/helper.c | 47 +------ target/s390x/internal.h | 1 - target/s390x/interrupt.c | 52 ++++++++ target/s390x/kvm.c | 3 +- target/s390x/misc_helper.c | 22 ++-- target/s390x/translate.c | 5 +- 30 files changed, 443 insertions(+), 307 deletions(-) create mode 100644 hw/s390x/s390-virtio-hcall.h delete mode 100644 hw/s390x/s390-virtio.h
Signature · 1 line
2.13.5
PATCH v2 1/19 exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly
All but a handfull of filles include exec/cpu-all.h via cpu.h only. As these files already include cpu.h, let's just drop the additional include.
--- dump.c | 1 - exec.c | 2 -- 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, 8 deletions(-)
dump.c +0 -1
@@ -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"
exec.c +0 -2
@@ -23,7 +23,6 @@#include "qemu/cutils.h" #include "cpu.h" -#include "exec/exec-all.h" #include "exec/target_page.h" #include "tcg.h" #include "hw/qdev-core.h"
@@ -56,7 +55,6 @@#endif #endif -#include "exec/cpu-all.h" #include "qemu/rcu_queue.h" #include "qemu/main-loop.h" #include "translate-all.h"
target/i386/arch_dump.c +0 -1
@@ -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"
target/i386/arch_memory_mapping.c +0 -1
@@ -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 */
target/i386/svm_helper.c +0 -1
@@ -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"
target/ppc/arch_dump.c +0 -1
@@ -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"
target/s390x/arch_dump.c +0 -1
@@ -15,7 +15,6 @@#include "cpu.h" #include "internal.h" #include "elf.h" -#include "exec/cpu-all.h" #include "sysemu/dump.h"
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 01/19] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly
Quoted 1 line · On Mon, 4 Sep 2017 17:42:58 +0200 David Hildenbrand <[email protected]> wrote:
All but a handfull of filles include
exec/cpu-all.hviacpu.honly.
You had some extra 'l's around? :)
s/handfull/handful/ and s/filles/files/
(I can fix while applying)
Quoted 4 lines
As these files already include
cpu.h, let's just drop the additional include.Signed-off-by David Hildenbrand <[email protected]>
Quoted 9 lines
--- dump.c | 1 - exec.c | 2 -- 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, 8 deletions(-)
This looks obviously correct; would not mind acks, though.
Quoted 93 lines
dump.c +0
-1@@ -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" exec.c +0
-2@@ -23,7 +23,6 @@#include "qemu/cutils.h" #include "cpu.h" -#include "exec/exec-all.h" #include "exec/target_page.h" #include "tcg.h" #include "hw/qdev-core.h" @@ -56,7 +55,6 @@#endif #endif -#include "exec/cpu-all.h" #include "qemu/rcu_queue.h" #include "qemu/main-loop.h" #include "translate-all.h" target/i386/arch_dump.c +0
-1@@ -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" target/i386/arch_memory_mapping.c +0
-1@@ -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 */ target/i386/svm_helper.c +0
-1@@ -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" target/ppc/arch_dump.c +0
-1@@ -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" target/s390x/arch_dump.c +0
-1@@ -15,7 +15,6 @@#include "cpu.h" #include "internal.h" #include "elf.h" -#include "exec/cpu-all.h" #include "sysemu/dump.h"
Re: [Qemu-devel] [PATCH v2 01/19] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly
In reply to David HildenbrandQuoted 32 lines · David Hildenbrand
All but a handfull of filles include
exec/cpu-all.hviacpu.honly. As these files already includecpu.h, let's just drop the additional include.Signed-off-by David Hildenbrand <[email protected]>--- dump.c | 1 - exec.c | 2 -- 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, 8 deletions(-)dump.c +0
-1@@ -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" exec.c +0
-0
exec.c line 26
Quoted 4 lines
exec.c +0
-1@@ -23,7 +23,6 @@#include "qemu/cutils.h" #include "cpu.h" -#include "exec/exec-all.h"
You should maybe mention exec-all.h in the patch description, too. (I think it can be dropped here because it is included by translate-all.h already).
If you tweak the patch description:
Re: [Qemu-devel] [PATCH v2 01/19] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly
Quoted 9 lines · Thomas Huth
Quoted 3 lines
#include "
qemu/cutils.h"
#include "cpu.h"
-#include "exec/exec-all.h"You should maybe mention
exec-all.hin the patch description, too. (I think it can be dropped here because it is included bytranslate-all.halready).If you tweak the patch description:
Reviewed-by Thomas Huth <[email protected]>
I'll just drop that hunk although it can also be removed.
Yes, this was not included on purpose - these similar names still confuse me :)
Signature · 3 lines
Thanks, David
Re: [Qemu-devel] [PATCH v2 01/19] exec, dump, i386, ppc, s390x: don't include exec/cpu-all.h explicitly
Quoted 8 lines · On Thu, 7 Sep 2017 14:41:21 +0200 David Hildenbrand <[email protected]> wrote:
Quoted 7 lines · Thomas Huth
Quoted 3 lines
#include "
qemu/cutils.h"
#include "cpu.h"
-#include "exec/exec-all.h"You should maybe mention
exec-all.hin the patch description, too. (I think it can be dropped here because it is included bytranslate-all.halready).
Quoted 8 lines
Quoted 2 lines
If you tweak the patch description:
Reviewed-by Thomas Huth <[email protected]>I'll just drop that hunk although it can also be removed.
Yes, this was not included on purpose - these similar names still confuse me :)
Not only you :)
If we can do a sweep of exec-all.h as well, it should be a separate patch.
PATCH v2 2/19 cpu: drop old comments describing members
In reply to David HildenbrandThese comments are obviously stale.
--- include/qom/cpu.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
include/qom/cpu.h +3 -3
@@ -378,10 +378,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;
Signature · 1 line
2.13.5
PATCH v2 3/19 s390x: get rid of s390-virtio.c
In reply to David HildenbrandIt 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.
--- 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(-)
hw/s390x/Makefile.objs +0 -1
@@ -1,4 +1,3 @@ -obj-y += s390-virtio.o obj-y += s390-virtio-hcall.o obj-y += sclp.o obj-y += event-facility.o
hw/s390x/s390-virtio-ccw.c +156 -1
198 lines not on this page · raw message
hw/s390x/s390-virtio.c +0 -37
@@ -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) {
hw/s390x/s390-virtio.h +0 -15
@@ -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
Signature · 1 line
2.13.5
PATCH v2 4/19 s390x: rename s390-virtio.h to s390-virtio-hcall.h
In reply to David HildenbrandThe only interface left, so let's properly rename it.
---
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%)hw/s390x/s390-virtio-ccw.c +1 -1
@@ -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"
hw/s390x/s390-virtio-hcall.c +1 -1
@@ -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
hw/s390x/s390-virtio-hcall.h renamed from hw/s390x/s390-virtio.h +4 -4
@@ -1,5 +1,5 @@/* -* Virtio interfaces for s390 +* Support for virtio hypercalls on s390x * * Copyright 2012 IBM Corp. * Author(s): Cornelia Huck <[email protected]>
@@ -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 */
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 04/19] s390x: rename s390-virtio.h to s390-virtio-hcall.h
Quoted 4 lines · David Hildenbrand
The only interface left, so let's properly rename it.
Reviewed-by Thomas Huth <[email protected]>Signed-off-by David Hildenbrand <[email protected]>
Quoted 64 lines
--- 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%)hw/s390x/s390-virtio-ccw.c +1
-1@@ -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" hw/s390x/s390-virtio-hcall.c +1
-1@@ -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 255hw/s390x/s390-virtio-hcall.h renamed from hw/s390x/s390-virtio.h +4
-4@@ -1,5 +1,5 @@/* -* Virtio interfaces for s390 +* Support for virtio hypercalls on s390x * * Copyright 2012 IBM Corp. * Author(s): Cornelia Huck <[email protected]> @@ -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 */
PATCH v2 5/19 target/s390x: move typedef of S390CPU to its definition
In reply to David HildenbrandLet's move it to the palce where struct S390CPU is defined.
--- target/s390x/cpu-qom.h | 2 -- target/s390x/cpu.h | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-)
target/s390x/cpu-qom.h +0 -2
@@ -61,6 +61,4 @@ typedef struct S390CPUClass { void (*initial_cpu_reset)(CPUState *cpu); } S390CPUClass; -typedef struct S390CPU S390CPU ; -#endif
target/s390x/cpu.h +2 -2
@@ -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) {
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 05/19] target/s390x: move typedef of S390CPU to its definition
Quoted 1 line · On Mon, 4 Sep 2017 17:43:02 +0200 David Hildenbrand <[email protected]> wrote:
Let's move it to the palce where struct S390CPU is defined.
s/palce/place/
Can also fix on applying.
Quoted 7 lines
Suggested-by Thomas Huth <[email protected]>Signed-off-by David Hildenbrand <[email protected]>--- target/s390x/cpu-qom.h | 2 -- target/s390x/cpu.h | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-)
Re: [Qemu-devel] [PATCH v2 05/19] target/s390x: move typedef of S390CPU to its definition
In reply to David HildenbrandQuoted 1 line · David Hildenbrand
Let's move it to the palce where struct S390CPU is defined.
s/palce/place/
Quoted 6 lines
Suggested-by Thomas Huth <[email protected]>Signed-off-by David Hildenbrand <[email protected]>--- target/s390x/cpu-qom.h | 2 -- target/s390x/cpu.h | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-)
Seems to compile fine for me with this patch applied, so:
PATCH v2 6/19 s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h
In reply to David HildenbrandImplemented in hw/s390x/s390-virtio-hcall.c, so let's move it to the right header file.
--- 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(-)
hw/s390x/s390-virtio-hcall.h +1 -0
@@ -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 */
target/s390x/cpu.h +0 -1
@@ -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
target/s390x/kvm.c +1 -0
@@ -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
target/s390x/misc_helper.c +1 -0
@@ -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 */
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 06/19] s390x: move s390_virtio_hypercall() to s390-virtio-hcall.h
Quoted 2 lines · David Hildenbrand
Implemented in
hw/s390x/s390-virtio-hcall.c, so let's move it to the right header file.
That's fair.
PATCH v2 7/19 s390x: move two function declarations to s390-virtio-ccw.h
In reply to David HildenbrandWe can also drop the extern. Fix up includes.
--- include/hw/s390x/s390-virtio-ccw.h | 3 +++ target/s390x/cpu.h | 2 -- target/s390x/diag.c | 1 + target/s390x/interrupt.c | 3 +++ 4 files changed, 7 insertions(+), 2 deletions(-)
include/hw/s390x/s390-virtio-ccw.h +3 -0
@@ -56,4 +56,7 @@ bool gs_allowed(void);*/ bool css_migration_enabled (void ); +S390CPU *s390_cpu_addr2state (uint16_t cpu_addr); +void subsystem_reset (void ); +#endif
target/s390x/cpu.h +0 -2
@@ -720,8 +720,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
target/s390x/diag.c +1 -0
@@ -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) {
target/s390x/interrupt.c +3 -0
@@ -15,6 +15,9 @@#include "exec/exec-all.h" #include "sysemu/kvm.h" #include "hw/s390x/ioinst.h" +#if !defined(CONFIG_USER_ONLY ) +#include "hw/s390x/s390-virtio-ccw.h" +#endif /* Ensure to exit the TB after this call! */ void trigger_pgm_exception (CPUS390XState *env,uint32_t code,uint32_t ilen)
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 07/19] s390x: move two function declarations to s390-virtio-ccw.h
Quoted 53 lines · David Hildenbrand
We can also drop the extern. Fix up includes.
Signed-off-by David Hildenbrand <[email protected]>--- include/hw/s390x/s390-virtio-ccw.h | 3 +++ target/s390x/cpu.h | 2 -- target/s390x/diag.c | 1 + target/s390x/interrupt.c | 3 +++ 4 files changed, 7 insertions(+), 2 deletions(-)include/hw/s390x/s390-virtio-ccw.h +3
-0@@ -56,4 +56,7 @@ bool gs_allowed(void);*/ bool css_migration_enabled (void ); +S390CPU *s390_cpu_addr2state (uint16_t cpu_addr); +void subsystem_reset (void ); +#endif target/s390x/cpu.h +0
-2@@ -720,8 +720,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 target/s390x/diag.c +1
-0@@ -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) {target/s390x/interrupt.c +0
-0
target/s390x/interrupt.c line 23
Quoted 9 lines
target/s390x/interrupt.c +3
-0@@ -15,6 +15,9 @@#include "exec/exec-all.h" #include "sysemu/kvm.h" #include "hw/s390x/ioinst.h" +#if !defined(CONFIG_USER_ONLY ) +#include "hw/s390x/s390-virtio-ccw.h" +#endif /* Ensure to exit the TB after this call! */ void trigger_pgm_exception (CPUS390XState *env,uint32_t code,uint32_t ilen)
If I listen to my gut feeling, I still think we should rather move s390_cpu_addr2state() to cpu.c instead. It does not sound as it's really specific to the virtio-ccw machine... Just my 0.02 €
Thomas
Re: [Qemu-devel] [PATCH v2 07/19] s390x: move two function declarations to s390-virtio-ccw.h
Quoted 10 lines
Quoted 10 lines
+++
b/target/s390x/interrupt.ctarget/s390x/interrupt.c +3
-0@@ -15,6 +15,9 @@#include "exec/exec-all.h" #include "sysemu/kvm.h" #include "hw/s390x/ioinst.h" +#if !defined(CONFIG_USER_ONLY ) +#include "hw/s390x/s390-virtio-ccw.h" +#endif
Quoted 8 lines
target/s390x/interrupt.c line 23
Quoted 3 lines
target/s390x/interrupt.c +0
-0/* Ensure to exit the TB after this call! */ void trigger_pgm_exception (CPUS390XState *env,uint32_t code,uint32_t ilen)If I listen to my gut feeling, I still think we should rather move
s390_cpu_addr2state()tocpu.cinstead. It does not sound as it's really specific to the virtio-ccw machine... Just my 0.02 €
I prefer to leave it as is for now, so just a header cleanup. E.g. with patch 18 we could implement it directly using ms->possible_cpus.
Quoted 1 line
Thomas
Signature · 3 lines
Thanks, David
Re: [Qemu-devel] [PATCH v2 07/19] s390x: move two function declarations to s390-virtio-ccw.h
Quoted 18 lines · On Thu, 7 Sep 2017 14:46:44 +0200 David Hildenbrand <[email protected]> wrote:
Quoted 9 lines
Quoted 9 lines
+++
b/target/s390x/interrupt.ctarget/s390x/interrupt.c +3
-0@@ -15,6 +15,9 @@#include "exec/exec-all.h" #include "sysemu/kvm.h" #include "hw/s390x/ioinst.h" +#if !defined(CONFIG_USER_ONLY ) +#include "hw/s390x/s390-virtio-ccw.h" +#endif Quoted 8 lines
target/s390x/interrupt.c line 23
Quoted 3 lines
target/s390x/interrupt.c +0
-0/* Ensure to exit the TB after this call! */ void trigger_pgm_exception (CPUS390XState *env,uint32_t code,uint32_t ilen)If I listen to my gut feeling, I still think we should rather move
s390_cpu_addr2state()tocpu.cinstead. It does not sound as it's really specific to the virtio-ccw machine... Just my 0.02 €
Quoted 2 lines
I prefer to leave it as is for now, so just a header cleanup. E.g. with patch 18 we could implement it directly using
ms->possible_cpus.
If you do that, would you also get rid of the conditional include above?
PATCH v2 8/19 s390x: move sclp_service_call() to interrupt.c
In reply to David HildenbrandFix up includes and rename it to s390x_*. cpu.h is now free of externally implemented functions.
--- hw/s390x/sclp.c | 51 +--------------------------------------------- include/hw/s390x/sclp.h | 1 + target/s390x/cpu.h | 5 +---- target/s390x/interrupt.c | 49 ++++++++++++++++++++++++++++++++++++++++++++ target/s390x/kvm.c | 2 +- target/s390x/misc_helper.c | 2 +- 6 files changed, 54 insertions(+), 56 deletions(-)
hw/s390x/sclp.c +1 -50
@@ -24,7 +24,7 @@#include "hw/s390x/s390-pci-bus.h" #include "hw/s390x/ipl.h" -static inline SCLPDevice *get_sclp_device (void ) +SCLPDevice *get_sclp_device (void ) {static SCLPDevice *sclp;
@@ -424,55 +424,6 @@ static void sclp_execute(SCLPDevice *sclp, SCCB *sccb, uint32_t code) } } -int sclp_service_call (CPUS390XState *env,uint64_t sccb,uint32_t code) -{ -SCLPDevice *sclp =get_sclp_device (); -SCLPDeviceClass *sclp_c =SCLP_GET_CLASS (sclp); -int r =0 ; -SCCB work_sccb; - -hwaddr sccb_len =sizeof (SCCB ); - -/* first some basic checks on program checks */ -if (env->psw.mask &PSW_MASK_PSTATE ) { - r = -PGM_PRIVILEGED ; - goto out; - } -if (cpu_physical_memory_is_io (sccb)) { - r = -PGM_ADDRESSING ; - goto out; - } -if ((sccb & ~0x1fffUL ) ==0 || (sccb & ~0x1fffUL ) == env->psa - || (sccb & ~0x7ffffff8UL ) !=0 ) { - r = -PGM_SPECIFICATION ; - goto out; - } - -/* -* we want to work on a private copy of the sccb, to prevent guests -* from playing dirty tricks by modifying the memory content after -* the host has checked the values -*/ -cpu_physical_memory_read (sccb, &work_sccb, sccb_len); - -/* Valid sccb sizes */ -if (be16_to_cpu (work_sccb.h.length) <sizeof (SCCBHeader) || -be16_to_cpu (work_sccb.h.length) >SCCB_SIZE ) { - r = -PGM_SPECIFICATION ; - goto out; - } - - sclp_c->execute (sclp, &work_sccb, code); - -cpu_physical_memory_write (sccb, &work_sccb, -be16_to_cpu (work_sccb.h.length)); - - sclp_c->service_interrupt (sclp, sccb); - -out: -return r; -} -static void service_interrupt (SCLPDevice *sclp,uint32_t sccb) {SCLPEventFacility *ef = sclp->event_facility;
include/hw/s390x/sclp.h +1 -0
@@ -237,6 +237,7 @@ static inline int sccb_data_len(SCCB *sccb) } +SCLPDevice *get_sclp_device (void );void s390_sclp_init (void );sclpMemoryHotplugDev *init_sclp_memory_hotplug_dev (void );sclpMemoryHotplugDev *get_sclp_memory_hotplug_dev (void );
target/s390x/cpu.h +1 -4
@@ -698,6 +698,7 @@ int cpu_s390x_signal_handler(int host_signum, void *pinfo, void *puc);/* interrupt.c */ +int s390x_sclp_service_call (CPUS390XState *env,uint64_t sccb,uint32_t code);void s390_crw_mchk (void );void s390_io_interrupt (uint16_t subchannel_id,uint16_t subchannel_nr,uint32_t io_int_parm,uint32_t io_int_word);
@@ -718,8 +719,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/ */ -int sclp_service_call (CPUS390XState *env,uint64_t sccb,uint32_t code); -#endif
target/s390x/interrupt.c +49 -0
59 lines not on this page · raw message
target/s390x/kvm.c +1 -1
@@ -1069,7 +1069,7 @@ static int kvm_sclp_service_call(S390CPU *cpu, struct kvm_run *run, sccb = env->regs[ipbh0 &0xf ]; code = env->regs[(ipbh0 &0xf0 ) >>4 ]; - r =sclp_service_call (env, sccb, code); + r =s390x_sclp_service_call (env, sccb, code);if (r <0 ) {kvm_s390_program_interrupt (cpu, -r); }else {
target/s390x/misc_helper.c +1 -1
@@ -76,7 +76,7 @@ void HELPER(exception)(CPUS390XState *env, uint32_t excp)uint32_t HELPER (servc )(CPUS390XState *env,uint64_t r1,uint64_t r2) {qemu_mutex_lock_iothread (); -int r =sclp_service_call (env, r1, r2); +int r =s390x_sclp_service_call (env, r1, r2);if (r <0 ) {program_interrupt (env, -r,4 ); r =0 ;
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 08/19] s390x: move sclp_service_call() to interrupt.c
Quoted 1 line · On Mon, 4 Sep 2017 17:43:05 +0200 David Hildenbrand <[email protected]> wrote:
Fix up includes and rename it to s390x_*.
I'm not quite sure whether that is the right direction: servc is just an instruction that does something and then happens to also generate an interrupt on conclusion. I'll think a bit more about it.
Quoted 11 lines
cpu.his now free of externally implemented functions.Signed-off-by David Hildenbrand <[email protected]>--- hw/s390x/sclp.c | 51 +--------------------------------------------- include/hw/s390x/sclp.h | 1 + target/s390x/cpu.h | 5 +---- target/s390x/interrupt.c | 49 ++++++++++++++++++++++++++++++++++++++++++++ target/s390x/kvm.c | 2 +- target/s390x/misc_helper.c | 2 +- 6 files changed, 54 insertions(+), 56 deletions(-)
Re: [Qemu-devel] [PATCH v2 08/19] s390x: move sclp_service_call() to interrupt.c
Quoted 9 lines · Cornelia Huck
Quoted 1 line · On Mon, 4 Sep 2017 17:43:05 +0200 David Hildenbrand <[email protected]> wrote:
Fix up includes and rename it to s390x_*.
I'm not quite sure whether that is the right direction: servc is just an instruction that does something and then happens to also generate an interrupt on conclusion. I'll think a bit more about it.
Having CPU related stuff in sclp looks also wrong. Feel free to skip this patch, should be unrelated to the following patches.
Signature · 3 lines
Thanks, David
Re: [Qemu-devel] [PATCH v2 08/19] s390x: move sclp_service_call() to interrupt.c
Quoted 6 lines · David Hildenbrand
Quoted 5 lines · Cornelia Huck
Quoted 1 line · On Mon, 4 Sep 2017 17:43:05 +0200 David Hildenbrand <[email protected]> wrote:
Fix up includes and rename it to s390x_*.
Quoted 7 lines
Quoted 4 lines
I'm not quite sure whether that is the right direction: servc is just an instruction that does something and then happens to also generate an interrupt on conclusion. I'll think a bit more about it.
Having CPU related stuff in sclp looks also wrong. Feel free to skip this patch, should be unrelated to the following patches.
I think having the sclp instruction handler in sclp (as today) is the best compromise.
Re: [Qemu-devel] [PATCH v2 08/19] s390x: move sclp_service_call() to interrupt.c
Quoted 14 lines · Christian Borntraeger
Quoted 11 lines · David Hildenbrand
Quoted 9 lines · Cornelia Huck
Quoted 1 line · On Mon, 4 Sep 2017 17:43:05 +0200 David Hildenbrand <[email protected]> wrote:
Fix up includes and rename it to s390x_*.
I'm not quite sure whether that is the right direction: servc is just an instruction that does something and then happens to also generate an interrupt on conclusion. I'll think a bit more about it.
Quoted 5 lines
Quoted 2 lines
Having CPU related stuff in sclp looks also wrong. Feel free to skip this patch, should be unrelated to the following patches.
I think having the sclp instruction handler in sclp (as today) is the best compromise.
+1
But maybe you could at least move the prototype to sclp.h instead?
Thomas
Re: [Qemu-devel] [PATCH v2 08/19] s390x: move sclp_service_call() to interrupt.c
Quoted 18 lines · On Tue, 5 Sep 2017 14:52:44 +0200 Thomas Huth <[email protected]> wrote:
Quoted 17 lines · Christian Borntraeger
Quoted 13 lines · David Hildenbrand
Quoted 9 lines · Cornelia Huck
Quoted 1 line · On Mon, 4 Sep 2017 17:43:05 +0200 David Hildenbrand <[email protected]> wrote:
Fix up includes and rename it to s390x_*.
I'm not quite sure whether that is the right direction: servc is just an instruction that does something and then happens to also generate an interrupt on conclusion. I'll think a bit more about it.
Having CPU related stuff in sclp looks also wrong. Feel free to skip this patch, should be unrelated to the following patches.
Quoted 6 lines
Quoted 2 lines
I think having the sclp instruction handler in sclp (as today) is the best compromise.
+1
But maybe you could at least move the prototype to
sclp.hinstead?
That would be a good compromise.
PATCH v2 9/19 target/s390x: use trigger_pgm_exception() in s390_cpu_handle_mmu_fault()
In reply to David HildenbrandThis looks cleaner. linux-user will not use the ilen field, so setting it doesn't do any harm.
--- target/s390x/excp_helper.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
target/s390x/excp_helper.c +1 -2
@@ -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;
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 09/19] target/s390x: use trigger_pgm_exception() in s390_cpu_handle_mmu_fault()
Quoted 14 lines · David Hildenbrand
This looks cleaner. linux-user will not use the ilen field, so setting it doesn't do any harm.
Signed-off-by David Hildenbrand <[email protected]>--- target/s390x/excp_helper.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)target/s390x/excp_helper.c +0
-0
target/s390x/excp_helper.c int s390_cpu_handle_mmu_fault(CPUState *cs, vaddr address, · line 65
Quoted 9 lines
target/s390x/excp_helper.c +1
-2@@ -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;
PATCH v2 10/19 target/s390x: use program_interrupt() in per_check_exception()
In reply to David HildenbrandClean it up by reusing program_interrupt(). Add a concern regarding ilen.
--- target/s390x/misc_helper.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
target/s390x/misc_helper.c +9 -6
@@ -446,14 +446,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); } }
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 10/19] target/s390x: use program_interrupt() in per_check_exception()
Quoted 26 lines · On Mon, 4 Sep 2017 17:43:07 +0200 David Hildenbrand <[email protected]> wrote:
Clean it up by reusing
program_interrupt(). Add a concern regarding ilen.Signed-off-by David Hildenbrand <[email protected]>--- target/s390x/misc_helper.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)target/s390x/misc_helper.c +2
-6@@ -446,14 +446,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); +/*
target/s390x/misc_helper.c void HELPER(chsc)(CPUS390XState *env, uint64_t inst) · line 462
Quoted 10 lines
target/s390x/misc_helper.c +7
-0+* 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); } }
Wrapping my head around it: You preserve the current behavior, which should probably be changed to use ILEN_AUTO to handle cases like EXECUTE correctly?
Do you plan to do a follow up? (Should I spend some cycles on it?)
Re: [Qemu-devel] [PATCH v2 10/19] target/s390x: use program_interrupt() in per_check_exception()
Quoted 35 lines · Cornelia Huck
Quoted 32 lines · On Mon, 4 Sep 2017 17:43:07 +0200 David Hildenbrand <[email protected]> wrote:
Clean it up by reusing
program_interrupt(). Add a concern regarding ilen.Signed-off-by David Hildenbrand <[email protected]>--- target/s390x/misc_helper.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)target/s390x/misc_helper.c +8
-6@@ -446,14 +446,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));
Quoted 8 lines
target/s390x/misc_helper.c void HELPER(chsc)(CPUS390XState *env, uint64_t inst) · line 462
Quoted 4 lines
target/s390x/misc_helper.c +1
-0+program_interrupt (env,PGM_PER , ilen); } }Wrapping my head around it: You preserve the current behavior, which should probably be changed to use
ILEN_AUTOto handle cases like EXECUTE correctly?
Exactly, e.g. if EXECUTE executes instruction Y, and Y is to generate an IFETCH event, AFAIK
a) per_address points at Y
b) old PGM PSW points at instruction after EXECUTE (ignoring nullifying for now)
c) PGM ilen has to match EXECUTE (so the PSW can properly be rewound)
The case where per_address == (PGM PSW - ilen) (ignoring nullification) should happen without EXECUTE being involved. That's why PER currently works just fine with Linux (e.g. uprobe smoke tests when kernel boots up).
Execute handling with PER is just nasty. And one first has to find out how that plays together with EXECUTE handling in TCG. Therefore, no easy fix (although ILEN_AUTO might most probably really be the right thing to do).
Quoted 3 lines
Do you plan to do a follow up? (Should I spend some cycles on it?)
Somewhere on my list. The next thing (in this area) I want do is write kvm-unit-tests for PER, because also KVM could benefit from that (EXECUTE handling is just nasty).
So sure, go ahead and have a look at it if you have some spare cycles :)
Signature · 3 lines
Thanks, David
Re: [Qemu-devel] [PATCH v2 10/19] target/s390x: use program_interrupt() in per_check_exception()
Quoted 53 lines · On Thu, 7 Sep 2017 15:52:19 +0200 David Hildenbrand <[email protected]> wrote:
Quoted 35 lines · Cornelia Huck
Quoted 32 lines · On Mon, 4 Sep 2017 17:43:07 +0200 David Hildenbrand <[email protected]> wrote:
Clean it up by reusing
program_interrupt(). Add a concern regarding ilen.Signed-off-by David Hildenbrand <[email protected]>--- target/s390x/misc_helper.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)target/s390x/misc_helper.c +8
-6@@ -446,14 +446,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));Quoted 8 lines
target/s390x/misc_helper.c void HELPER(chsc)(CPUS390XState *env, uint64_t inst) · line 462
Quoted 4 lines
target/s390x/misc_helper.c +1
-0+program_interrupt (env,PGM_PER , ilen); } }Wrapping my head around it: You preserve the current behavior, which should probably be changed to use
ILEN_AUTOto handle cases like EXECUTE correctly?Exactly, e.g. if EXECUTE executes instruction Y, and Y is to generate an IFETCH event, AFAIK
a)
per_addresspoints at Y
b) old PGM PSW points at instruction after EXECUTE (ignoring nullifying for now)
c) PGM ilen has to match EXECUTE (so the PSW can properly be rewound)
Quoted 8 lines
The case where
per_address== (PGM PSW - ilen) (ignoring nullification) should happen without EXECUTE being involved. That's why PER currently works just fine with Linux (e.g. uprobe smoke tests when kernel boots up).Execute handling with PER is just nasty. And one first has to find out how that plays together with EXECUTE handling in TCG. Therefore, no easy fix (although
ILEN_AUTOmight most probably really be the right thing to do).
That really sounds like a lot of fun...
Quoted 10 lines
Quoted 4 lines
Do you plan to do a follow up? (Should I spend some cycles on it?)
Somewhere on my list. The next thing (in this area) I want do is write kvm-unit-tests for PER, because also KVM could benefit from that (EXECUTE handling is just nasty).
So sure, go ahead and have a look at it if you have some spare cycles :)
Spare cycles? Me? :)
I think we can live with the current state a bit longer. Adding the FIXME is actually an improvement...
PATCH v2 11/19 s390x: allow only 1 CPU with TCG
In reply to David HildenbrandSpecifying 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.
--- hw/s390x/s390-virtio-ccw.c | 7 +++++++ target/s390x/cpu.h | 2 ++ 2 files changed, 9 insertions(+)
hw/s390x/s390-virtio-ccw.c +7 -0
@@ -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"
@@ -55,6 +56,12 @@ static void s390_init_cpus(MachineState *machine)if (machine->cpu_model ==NULL ) { machine->cpu_model =s390_default_cpu_model_name (); } +if (tcg_enabled () && max_cpus >S390_TCG_MAX_CPUS ) { +error_report ("Number of SMP CPUs requested (%d) exceeds max CPUs " +"supported by TCG (%d) on s390x" , max_cpus, +S390_TCG_MAX_CPUS ); +exit (1 ); + } cpu_states = g_new0(S390CPU *, max_cpus);
target/s390x/cpu.h +2 -0
@@ -209,6 +209,8 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)#define ENV_OFFSET offsetof(S390CPU, env) +#define S390_TCG_MAX_CPUS 1 +#ifndef CONFIG_USER_ONLY extern const struct VMStateDescription vmstate_s390_cpu;#endif
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 11/19] s390x: allow only 1 CPU with TCG
Quoted 9 lines · David Hildenbrand
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.
Signed-off-by David Hildenbrand <[email protected]>---
Makes sense. Ran the described environment without this patch (errors) and again with this patch (graceful exit w/ message).
Quoted 43 lines
hw/s390x/s390-virtio-ccw.c | 7 +++++++ target/s390x/cpu.h | 2 ++ 2 files changed, 9 insertions(+)hw/s390x/s390-virtio-ccw.c +7
-0@@ -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" @@ -55,6 +56,12 @@ static void s390_init_cpus(MachineState *machine)if (machine->cpu_model ==NULL ) { machine->cpu_model =s390_default_cpu_model_name (); } +if (tcg_enabled () && max_cpus >S390_TCG_MAX_CPUS ) { +error_report ("Number of SMP CPUs requested (%d) exceeds max CPUs " +"supported by TCG (%d) on s390x" , max_cpus, +S390_TCG_MAX_CPUS ); +exit (1 ); + } cpu_states = g_new0(S390CPU *, max_cpus);target/s390x/cpu.h +2
-0@@ -209,6 +209,8 @@ static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)#define ENV_OFFSET offsetof(S390CPU, env) +#define S390_TCG_MAX_CPUS 1 +#ifndef CONFIG_USER_ONLY extern const struct VMStateDescription vmstate_s390_cpu;#endif
Re: [Qemu-devel] [PATCH v2 11/19] s390x: allow only 1 CPU with TCG
Quoted 8 lines · Matthew Rosato
Quoted 7 lines · David Hildenbrand
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.
Quoted 7 lines
Quoted 2 lines
Signed-off-by David Hildenbrand <[email protected]>---
Makes sense. Ran the described environment without this patch (errors) and again with this patch (graceful exit w/ message).
Tested-by Matthew Rosato <[email protected]>
Can someone review
http://patchwork.ozlabs.org/patch/760010/
which does at least start to add the SIGP support.
Once tcg can bring up 2 cpus, I see no reason it couldn't bring up N. I don't see the point of the define.
r~
Re: [Qemu-devel] [PATCH v2 11/19] s390x: allow only 1 CPU with TCG
Quoted 12 lines · Richard Henderson
Quoted 11 lines · Matthew Rosato
Quoted 9 lines · David Hildenbrand
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.
Signed-off-by David Hildenbrand <[email protected]>---
Quoted 9 lines
Quoted 4 lines
Makes sense. Ran the described environment without this patch (errors) and again with this patch (graceful exit w/ message).
Tested-by Matthew Rosato <[email protected]>Can someone review
Yes, we also discovered that patch during review of v1.
Quoted 5 lines
which does at least start to add the SIGP support.
Once tcg can bring up 2 cpus, I see no reason it couldn't bring up N. I don't see the point of the define.
Conny requested a define. So it boils down to
a) no define just as in v1
b) a define like S390_TCG_SMP_SUPPORTED
What do you suggest?
Quoted 3 lines
r~
Signature · 3 lines
Thanks, David
Re: [Qemu-devel] [PATCH v2 11/19] s390x: allow only 1 CPU with TCG
Quoted 31 lines · On Thu, 7 Sep 2017 14:49:49 +0200 David Hildenbrand <[email protected]> wrote:
Quoted 12 lines · Richard Henderson
Quoted 11 lines · Matthew Rosato
Quoted 9 lines · David Hildenbrand
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.
Signed-off-by David Hildenbrand <[email protected]>---
Quoted 9 lines
Quoted 4 lines
Makes sense. Ran the described environment without this patch (errors) and again with this patch (graceful exit w/ message).
Tested-by Matthew Rosato <[email protected]>Can someone review
Yes, we also discovered that patch during review of v1.
Quoted 5 lines
which does at least start to add the SIGP support.
Once tcg can bring up 2 cpus, I see no reason it couldn't bring up N. I don't see the point of the define.
Quoted 6 lines
Conny requested a define. So it boils down to
a) no define just as in v1
b) a define likeS390_TCG_SMP_SUPPORTEDWhat do you suggest?
FWIW, I'd prefer b).
Quoted 6 lines
Quoted 4 lines
r~
Re: [Qemu-devel] [PATCH v2 11/19] s390x: allow only 1 CPU with TCG
In reply to Richard HendersonQuoted 15 lines · Richard Henderson
Quoted 14 lines · Matthew Rosato
Quoted 9 lines · David Hildenbrand
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.
Signed-off-by David Hildenbrand <[email protected]>---
Makes sense. Ran the described environment without this patch (errors) and again with this patch (graceful exit w/ message).
Quoted 7 lines
Quoted 1 line
Tested-by Matthew Rosato <[email protected]>Can someone review
http://patchwork.ozlabs.org/patch/760010/
which does at least start to add the SIGP support.
FWIW, I started factoring out today KVM SIGP code to make it usable by TCG.
I also started adding the missing SIGP instructions the kernel handles for KVM. I dropped the old TCG SIGP handling code and completely reuse the new SIGP code. I already got boot/reboot/shutdown properly running (implementing STOP and RESTART interrupts like KVM has).
But its still quite hacky and there are is a bunch of stuff to clean up, especially:
- external interrupt handling (the queue approach we have right now is no good for external calls and emergency signals)
- floating interrupt support (io interrupts always going to CPU 0 is a hack)
I think I can at least implement SIGP properly and fix the external call stuff. floating interrupts might require more thought.
Aurelien, please tell me if you are currently still working on this, so we can coordinate.
Thanks!
Quoted 7 lines
Once tcg can bring up 2 cpus, I see no reason it couldn't bring up N. I don't see the point of the define.
r~
Signature · 3 lines
Thanks, David
Re: [Qemu-devel] [PATCH v2 11/19] s390x: allow only 1 CPU with TCG
Quoted 6 lines · On Thu, 14 Sep 2017 20:13:49 +0200 David Hildenbrand <[email protected]> wrote:
FWIW, I started factoring out today KVM SIGP code to make it usable by TCG.
I also started adding the missing SIGP instructions the kernel handles for KVM. I dropped the old TCG SIGP handling code and completely reuse the new SIGP code. I already got boot/reboot/shutdown properly running (implementing STOP and RESTART interrupts like KVM has).
Cool!
Quoted 10 lines
But its still quite hacky and there are is a bunch of stuff to clean up, especially:
- external interrupt handling (the queue approach we have right now is no good for external calls and emergency signals)
- floating interrupt support (io interrupts always going to CPU 0 is a hack)I think I can at least implement SIGP properly and fix the external call stuff. floating interrupts might require more thought.
I'm wondering whether something should move into the qemu version of the flic. I'm also wondering whether we should look to the kvm floating interrupt code for inspiration.
(I have 'look at floating interrupts with tcg' on my todo list as well :)
PATCH v2 12/19 target/s390x: set cpu->id for linux user when realizing
In reply to David Hildenbrandscc->next_cpu_id is updated when realizing. Setting it just before that point looks cleaner.
--- target/s390x/cpu.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
target/s390x/cpu.c +4 -7
@@ -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)
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 12/19] target/s390x: set cpu->id for linux user when realizing
Quoted 4 lines · David Hildenbrand
scc->next_cpu_idis updated when realizing. Setting it just before that point looks cleaner.Signed-off-by David Hildenbrand <[email protected]>
Quoted 35 lines
--- target/s390x/cpu.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)target/s390x/cpu.c +4
-7@@ -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)
PATCH v2 13/19 target/s390x: use "core-id" for cpu number/address/id handling
In reply to David HildenbrandSome 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".
--- 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(-)
hw/s390x/s390-virtio-ccw.c +1 -1
@@ -311,7 +311,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);
target/s390x/cpu.c +19 -52
125 lines not on this page · raw message
target/s390x/cpu.h +2 -3
@@ -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;
@@ -691,7 +690,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. */
target/s390x/cpu_models.c +1 -1
@@ -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); } }
target/s390x/excp_helper.c +1 -1
@@ -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);
target/s390x/helper.c +2 -2
@@ -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; }
target/s390x/misc_helper.c +2 -2
@@ -231,7 +231,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 */
@@ -259,7 +259,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 )) {
target/s390x/translate.c +1 -4
@@ -3822,10 +3822,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 ; }
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 13/19] target/s390x: use "core-id" for cpu number/address/id handling
Quoted 4 lines · David Hildenbrand
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.
Quoted 9 lines
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_addlater on (x86 and ppc).We can get rid of
cpu->idnow. Keepcpu_indexandenv->core_idin sync.cpu_indexwas already implicitly used by e.g.cpu_exists(), so keeping both in sync seems to be the right thing to do.
Rename & removal of 'id' is fine w/ me - in retrospect, it's a shame we used 'id' in the first place.
Quoted 3 lines
cpu_indexwill now no longer automatically get set viacpu_exec_realizefn(). For now, we were lucky that both implicitly stayed in sync.>
Good catch.
Quoted 9 lines
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_addwill later need the reserved "id" property. Hotplugging a CPU on s390x will then be: "device_addhost-s390-cpu,id=cpu2,core-id=2".Signed-off-by David Hildenbrand <[email protected]>---
[...]
Quoted 6 lines
target/s390x/translate.c +0
-0@@ -3822,10 +3822,7 @@ static ExitStatus op_ssm(DisasContext *s, DisasOps *o)static ExitStatus op_stap (DisasContext *s,DisasOps *o)
target/s390x/translate.c static ExitStatus op_ssm(DisasContext *s, DisasOps *o) · line 3828
Quoted 10 lines
target/s390x/translate.c +1
-4{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 ; }
Are you sure it's OK to remove this blurb in its entirety? You are certainly collapsing the various CPU identifiers, but you aren't changing the size of the store from when this blurb was put in (411fea3d) So, "the previous version of this stored more than the required half-word" seems to be still relevant -- Unless you've gone ahead and tested it out?
Outside of that nit, I like the changes.
Re: [Qemu-devel] [PATCH v2 13/19] target/s390x: use "core-id" for cpu number/address/id handling
Quoted 16 lines
Quoted 16 lines
target/s390x/translate.c +1
-4@@ -3822,10 +3822,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 ; }
Quoted 8 lines
Quoted 1 line
Are you sure it's OK to remove this blurb in its entirety? You are certainly collapsing the various CPU identifiers, but you aren't changing the size of the store from when this blurb was put in (
411fea3d) So, "the previous version of this stored more than the required half-word" seems to be still relevant -- Unless you've gone ahead and tested it out?
z13 PoP (10-132):
"The CPU address by which this CPU is identified in a multiprocessing configuration is stored at the half- word location designated by the second-operand address."
As far as I understand this comment, 411fea3d fixed the store to only be the required half-word, no?
The previous version stored 32bit:
tcg_gen_qemu_st32(tmp2, tmp, get_mem_index(s));
Now we have:C(0xb212, STAP, S, Z, la2, 0, new, m1_16, stap, 0)
which, due to m1_16, will use wout_m1_16
tcg_gen_qemu_st16(o->out, o->addr1, get_mem_index(s));
So what's left is the confusion about num vs address. But core-id is certainly the CPU number, which is t be stored. There is no such thing as CPU number.
So I think this comment can now safely be dropped.
We have a kvm-unit-test for STAP, but we only check if anything has been stored, not if "too much" has been stored. But I am not sure if we want such checks, as the number of tests will explode. Usually, if it would be broken, other things would then go wrong in our unit tests. I will have a look.
Quoted 5 lines
Outside of that nit, I like the changes.
Reviewed-by Matthew Rosato <[email protected]>
Signature · 3 lines
Thanks, David
PATCH v2 14/19 target/s390x: rename next_cpu_id to next_core_id
In reply to David HildenbrandAdapt to the new term "core_id". While at it, fix the type and drop the initialization to 0 (which is superfluous).
--- target/s390x/cpu-qom.h | 2 +- target/s390x/cpu.c | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-)
target/s390x/cpu-qom.h +1 -1
@@ -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);
target/s390x/cpu.c +5 -6
@@ -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;
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 14/19] target/s390x: rename next_cpu_id to next_core_id
Quoted 4 lines · David Hildenbrand
Adapt to the new term "
core_id". While at it, fix the type and drop the initialization to 0 (which is superfluous).Signed-off-by David Hildenbrand <[email protected]>
Given the prior patch, this rename makes sense.
Quoted 63 lines
--- target/s390x/cpu-qom.h | 2 +- target/s390x/cpu.c | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-)target/s390x/cpu-qom.h +1
-1@@ -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);target/s390x/cpu.c +5
-6@@ -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;
PATCH v2 15/19 s390x: print CPU definitions in sorted order
In reply to David HildenbrandOther 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.
--- target/s390x/cpu_models.c | 63 ++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 22 deletions(-)
target/s390x/cpu_models.c +41 -22
@@ -270,41 +270,60 @@ 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)); -const char *details ="" ; - -if (scc->is_static) { - details ="(static, migration-safe)" ; - }else if (scc->is_migration_safe) { - details ="(migration-safe)" ; - } +CPUListState *s = user_data; +const S390CPUClass *scc =S390_CPU_CLASS ((ObjectClass *)data); +char *name =g_strdup (object_class_get_name ((ObjectClass *)data));/* 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 (%smigration-safe)\n" , name, + scc->desc, scc->is_static ?"static, " :"" );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++) {
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 15/19] s390x: print CPU definitions in sorted order
Quoted 36 lines · On Mon, 4 Sep 2017 17:43:12 +0200 David Hildenbrand <[email protected]> wrote:
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 <[email protected]>--- target/s390x/cpu_models.c | 63 ++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 22 deletions(-)target/s390x/cpu_models.c +1
-16@@ -270,41 +270,60 @@ 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)); -const char *details ="" ; - -if (scc->is_static) { - details ="(static, migration-safe)" ; - }else if (scc->is_migration_safe) { - details ="(migration-safe)" ; - }
target/s390x/cpu_models.c const S390CPUDef *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga, · line 282
Quoted 10 lines
target/s390x/cpu_models.c +5
-2+CPUListState *s = user_data; +const S390CPUClass *scc =S390_CPU_CLASS ((ObjectClass *)data); +char *name =g_strdup (object_class_get_name ((ObjectClass *)data));/* 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 (%smigration-safe)\n" , name, + scc->desc, scc->is_static ?"static, " :"" );
Hm, that now prints 's390 host' as 'migration safe'...
Quoted 10 lines
target/s390x/cpu_models.c +7
-0g_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); +
target/s390x/cpu_models.c const S390CPUDef *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga, · line 302
Quoted 10 lines
target/s390x/cpu_models.c +10
-0+/* 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 ; + }
Are we sure that there will never be models starting with q or h? But we can worry about that later.
Quoted 21 lines
target/s390x/cpu_models.c +13
-3+ +/* 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;
target/s390x/cpu_models.c const S390CPUDef *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga, · line 329
Quoted 10 lines
target/s390x/cpu_models.c +5
-1+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++) {
Sorting looks good.
Re: [Qemu-devel] [PATCH v2 15/19] s390x: print CPU definitions in sorted order
Quoted 5 lines
Quoted 5 lines
target/s390x/cpu_models.c +3
-0+CPUListState *s = user_data; +const S390CPUClass *scc =S390_CPU_CLASS ((ObjectClass *)data); +char *name =g_strdup (object_class_get_name ((ObjectClass *)data));
Quoted 8 lines
target/s390x/cpu_models.c const S390CPUDef *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga, · line 282
Quoted 6 lines
/* strip off the -s390-cpu */ g_strrstr(name, "-" TYPE_S390_CPU)[0] = 0;target/s390x/cpu_models.c +2
-2- (*info->print)(info->f,"s390 %-15s %-35s %s\n" , name, scc->desc, - details); + (*s->cpu_fprintf)(s->file,"s390 %-15s %-35s (%smigration-safe)\n" , name, + scc->desc, scc->is_static ?"static, " :"" );Hm, that now prints 's390 host' as 'migration safe'...
Very good point, will fix, thanks!
Quoted 16 lines
Quoted 16 lines
g_free(name);}
target/s390x/cpu_models.c +12
-0+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 ;
Quoted 8 lines
target/s390x/cpu_models.c const S390CPUDef *s390_find_cpu_def(uint16_t type, uint8_t gen, uint8_t ec_ga, · line 302
Quoted 5 lines
target/s390x/cpu_models.c +5
-0+ }else if (name_a[0 ] =='h' ) { +return -1 ; + }else if (name_b[0 ] =='h' ) { +return 1 ; + }Are we sure that there will never be models starting with q or h? But we can worry about that later.
Could be but unlikely. In the worst case sorting would be wrong, I think we can live with that :)
Signature · 3 lines
Thanks, David
PATCH v2 16/19 s390x: allow cpu hotplug via device_add
In reply to David HildenbrandE.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."
--- target/s390x/cpu.c | 1 + 1 file changed, 1 insertion(+)
target/s390x/cpu.c +1 -0
@@ -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 )
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 16/19] s390x: allow cpu hotplug via device_add
Quoted 8 lines · David Hildenbrand
E.g. the following now works:
device_add host-s390-cpu,id=cpu1,core-id=1The system will perform the same checks as when using
cpu_add:
- If thecore_idis already in use
- If the next sequentialcore_idisn't used
- If core-id >=max_cpuis specified
Quoted 5 lines
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."Signed-off-by David Hildenbrand <[email protected]>
As easy as flipping a switch, right?
Tested the new device_add path, the old cpu-add path and mixed cases where I alternated adding cpus via both methods -- looking good.
Quoted 17 lines
--- target/s390x/cpu.c | 1 + 1 file changed, 1 insertion(+)target/s390x/cpu.c +1
-0@@ -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 )
Re: [Qemu-devel] [PATCH v2 16/19] s390x: allow cpu hotplug via device_add
Quoted 9 lines · Matthew Rosato
Quoted 8 lines · David Hildenbrand
E.g. the following now works:
device_add host-s390-cpu,id=cpu1,core-id=1The system will perform the same checks as when using
cpu_add:
- If thecore_idis already in use
- If the next sequentialcore_idisn't used
- If core-id >=max_cpuis specified
Quoted 7 lines
Quoted 5 lines
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."Signed-off-by David Hildenbrand <[email protected]>As easy as flipping a switch, right?
Yes, luckily all that hotplug handling already was in place, just core-id vs. id had to be fixed.
Quoted 6 lines
Tested the new
device_addpath, the old cpu-add path and mixed cases where I alternated adding cpus via both methods -- looking good.Reviewed-by Matthew Rosato <[email protected]>
Thanks!
Signature · 3 lines
Thanks, David
PATCH v2 17/19 s390x: CPU hot unplug via device_del cannot work
In reply to David Hildenbranddevice_del on a CPU will currently do nothing. Let's emmit an error telling that this is will never work (there is no architecture support on s390x). Error message copied from ppc.
(qemu) device_del cpu1device_del cpu1
CPU hot unplug not supported on this machine
--- hw/s390x/s390-virtio-ccw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
hw/s390x/s390-virtio-ccw.c +10 -0
@@ -338,6 +338,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) {
@@ -387,6 +396,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; }
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 17/19] s390x: CPU hot unplug via device_del cannot work
Quoted 7 lines · David Hildenbrand
device_delon a CPU will currently do nothing. Let's emmit an error telling that this is will never work (there is no architecture support on s390x). Error message copied from ppc.(qemu)
device_delcpu1device_delcpu1
CPU hot unplug not supported on this machine
Given the fact that I get the question about unplug _every_ time when I give a presentation about KVM on z, I will try to get some architecture folks look at this. Maybe we can define something very simple like "if the CPU is in the stopped state we can remove this and just piggy back on the existing sclp EVENT_QUAL_CPU_CHANGE notification".
So maybe add "currently"
Quoted 34 lines
Signed-off-by David Hildenbrand <[email protected]>--- hw/s390x/s390-virtio-ccw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)hw/s390x/s390-virtio-ccw.c +10
-0@@ -338,6 +338,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) {@@ -387,6 +396,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; }
Re: [Qemu-devel] [PATCH v2 17/19] s390x: CPU hot unplug via device_del cannot work
Quoted 9 lines · Christian Borntraeger
Quoted 7 lines · David Hildenbrand
device_delon a CPU will currently do nothing. Let's emmit an error telling that this is will never work (there is no architecture support on s390x). Error message copied from ppc.(qemu)
device_delcpu1device_delcpu1
CPU hot unplug not supported on this machine
Quoted 6 lines
Given the fact that I get the question about unplug _every_ time when I give a presentation about KVM on z, I will try to get some architecture folks look at this. Maybe we can define something very simple like "if the CPU is in the stopped state we can remove this and just piggy back on the existing sclp
EVENT_QUAL_CPU_CHANGEnotification".So maybe add "currently"
Unfortunately it might not be that easy.
We would have to find a way that existing OS's don't break. If a guest OS is not prepared for CPUs to get removed, we might run into inconsistencies when simply deleting CPUs that are in the STOPPED state.
Especially, these CPUs would still show up in the guest as "offline". Wonder what would then happen trying to "online" these.
But yes, I can add "currently".
Signature · 3 lines
Thanks, David
Re: [Qemu-devel] [PATCH v2 17/19] s390x: CPU hot unplug via device_del cannot work
Quoted 15 lines · David Hildenbrand
Quoted 14 lines · Christian Borntraeger
Quoted 7 lines · David Hildenbrand
device_delon a CPU will currently do nothing. Let's emmit an error telling that this is will never work (there is no architecture support on s390x). Error message copied from ppc.(qemu)
device_delcpu1device_delcpu1
CPU hot unplug not supported on this machineGiven the fact that I get the question about unplug _every_ time when I give a presentation about KVM on z, I will try to get some architecture folks look at this. Maybe we can define something very simple like "if the CPU is in the stopped state we can remove this and just piggy back on the existing sclp
EVENT_QUAL_CPU_CHANGEnotification".
Quoted 7 lines
Quoted 1 line
So maybe add "currently"
Unfortunately it might not be that easy.
We would have to find a way that existing OS's don't break. If a guest OS is not prepared for CPUs to get removed, we might run into inconsistencies when simply deleting CPUs that are in the STOPPED state.
Yes, this needs to be validated across all things.
Quoted 3 lines
Especially, these CPUs would still show up in the guest as "offline". Wonder what would then happen trying to "online" these.
The main use case seems to be, that the admin does not want to allow a guest to online back a guest CPU if it was taken away from the configuration. So maybe we could simply fail a SIGP START for those.
Or we might go one level below and only allow an unplug if the CPU is in the deconfigured state and we would then have to forbid the configuration step. Right now SCLP_CMDW_(DE)CONFIGURE_CPU seems to be unimplemented in QEMU.
Anyway, we need some architecture agreement here first (something that is also ok with LPAR and z/VM).
Quoted 2 lines
But yes, I can add "currently".
Re: [Qemu-devel] [PATCH v2 17/19] s390x: CPU hot unplug via device_del cannot work
Quoted 29 lines · On Tue, 5 Sep 2017 14:14:21 +0200 Christian Borntraeger…
Quoted 15 lines · David Hildenbrand
Quoted 14 lines · Christian Borntraeger
Quoted 7 lines · David Hildenbrand
device_delon a CPU will currently do nothing. Let's emmit an error telling that this is will never work (there is no architecture support on s390x). Error message copied from ppc.(qemu)
device_delcpu1device_delcpu1
CPU hot unplug not supported on this machineGiven the fact that I get the question about unplug _every_ time when I give a presentation about KVM on z, I will try to get some architecture folks look at this. Maybe we can define something very simple like "if the CPU is in the stopped state we can remove this and just piggy back on the existing sclp
EVENT_QUAL_CPU_CHANGEnotification".Quoted 7 lines
Quoted 1 line
So maybe add "currently"
Unfortunately it might not be that easy.
We would have to find a way that existing OS's don't break. If a guest OS is not prepared for CPUs to get removed, we might run into inconsistencies when simply deleting CPUs that are in the STOPPED state.
Yes, this needs to be validated across all things.
Quoted 3 lines
Especially, these CPUs would still show up in the guest as "offline". Wonder what would then happen trying to "online" these.
Quoted 7 lines
The main use case seems to be, that the admin does not want to allow a guest to online back a guest CPU if it was taken away from the configuration. So maybe we could simply fail a SIGP START for those.
Or we might go one level below and only allow an unplug if the CPU is in the deconfigured state and we would then have to forbid the configuration step.
Having the cpu in the unconfigured state as a requirement also makes this less likely to break for older OSs, I guess.
Quoted 2 lines
Right now SCLP_CMDW_(DE)CONFIGURE_CPU seems to be unimplemented in QEMU.
Sounds like something we'd like to have in the future?
(Btw, what does cpuplugd trigger? Offline/online or deconfigure/configure?)
Quoted 3 lines
Anyway, we need some architecture agreement here first (something that is also ok with LPAR and z/VM).
Certainly.
Quoted 1 line
Quoted 1 line
But yes, I can add "currently".
Yes, that makes sense.
Re: [Qemu-devel] [PATCH v2 17/19] s390x: CPU hot unplug via device_del cannot work
On 09/05/2017 02:54 PM, Cornelia Huck wrote:
[...]
Quoted 10 lines
Having the cpu in the unconfigured state as a requirement also makes this less likely to break for older OSs, I guess.
Quoted 2 lines
Right now SCLP_CMDW_(DE)CONFIGURE_CPU seems to be unimplemented in QEMU.
Sounds like something we'd like to have in the future?
(Btw, what does cpuplugd trigger? Offline/online or deconfigure/configure?)
offline/online via sigp stop/start. When we hotplug we already provide the new cpu in the configured state (like z/VM).
Re: [Qemu-devel] [PATCH v2 17/19] s390x: CPU hot unplug via device_del cannot work
In reply to David HildenbrandQuoted 9 lines · David Hildenbrand
device_delon a CPU will currently do nothing. Let's emmit an error telling that this is will never work (there is no architecture support on s390x). Error message copied from ppc.(qemu)
device_delcpu1device_delcpu1
CPU hot unplug not supported on this machineSigned-off-by David Hildenbrand <[email protected]>
Architecture discussions aside, this code will work as-is to prevent CPU unplug. Add "currently" as Christian suggests and:
Quoted 32 lines
--- hw/s390x/s390-virtio-ccw.c | 10 ++++++++++ 1 file changed, 10 insertions(+)hw/s390x/s390-virtio-ccw.c +10
-0@@ -338,6 +338,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) {@@ -387,6 +396,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; }
PATCH v2 18/19 s390x: implement query-hotpluggable-cpus
In reply to David HildenbrandCPU 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.
--- hw/s390x/s390-virtio-ccw.c | 90 +++++++++++++++++++++++++++++++++------------- qapi-schema.json | 16 +++++++++ 2 files changed, 81 insertions(+), 25 deletions(-)
hw/s390x/s390-virtio-ccw.c +65 -25
@@ -36,22 +36,40 @@#include "qapi/qmp/qerror.h" #include "hw/nmi.h" -static S390CPU **cpu_states; +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]; +}S390CPU *s390_cpu_addr2state (uint16_t cpu_addr) { -if (cpu_addr >= max_cpus) { -return NULL ; +static MachineState *ms; +CPUArchId *found; + +if (!ms) { + ms =MACHINE (qdev_get_machine ()); } -/* Fast lookup via CPU ID */ -return cpu_states[cpu_addr]; +/* CPU address corresponds to core_id */ + found =s390_find_cpu_slot (ms, cpu_addr,NULL ); +if (!found) { +return NULL ; + } +return S390_CPU (found->cpu); }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 ();
@@ -63,17 +81,8 @@ static void s390_init_cpus(MachineState *machine)exit (1 ); } - 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);
@@ -304,17 +313,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 )
@@ -347,6 +353,37 @@ static void s390_machine_device_unplug_request(HotplugHandler *hotplug_dev, } } +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) {
@@ -394,7 +431,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;
qapi-schema.json +16 -0
@@ -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'] }
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 18/19] s390x: implement query-hotpluggable-cpus
Quoted 10 lines · On Mon, 4 Sep 2017 17:43:15 +0200 David Hildenbrand <[email protected]> wrote:
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 variablecpu_states.Signed-off-by David Hildenbrand <[email protected]>--- hw/s390x/s390-virtio-ccw.c | 90 +++++++++++++++++++++++++++++++++------------- qapi-schema.json | 16 +++++++++ 2 files changed, 81 insertions(+), 25 deletions(-)
LGTM
PATCH v2 19/19 s390x: get rid of cpu_s390x_create()
In reply to David HildenbrandNow that there is only one user of cpu_s390x_create() left, make cpu creation looks 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
--- 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(-)
hw/s390x/s390-virtio-ccw.c +27 -2
@@ -69,6 +69,10 @@ S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)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 ) {
@@ -84,8 +88,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); } }
@@ -396,8 +417,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)
target/s390x/cpu.h +1 -1
@@ -690,7 +690,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. */
target/s390x/helper.c +2 -43
54 lines not on this page · raw message
target/s390x/internal.h +0 -1
@@ -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);
Signature · 1 line
2.13.5
Re: [Qemu-devel] [PATCH v2 19/19] s390x: get rid of cpu_s390x_create()
Quoted 7 lines · On Mon, 4 Sep 2017 17:43:16 +0200 David Hildenbrand <[email protected]> wrote:
Now that there is only one user of
cpu_s390x_create()left, make cpu creation looks like on x86.
- Perform the model/properties split and checks ins390_init_cpus()
- Parse features only once without having to remember if already parsed
- Pass only the typename tos390x_new_cpu()
- Use the typename of an existing CPU for hotplug via cpu-add
Quoted 7 lines
Signed-off-by David Hildenbrand <[email protected]>--- 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(-)
LGTM
I think we certainly want to have device_add as well (as long as the old interface stays for a while).
Adding Matt. Can you have a look at the cpu hotplug bits?
Quoted 94 lines · David Hildenbrand
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". So the last patches in this series differ to v1. I tried to stick as much as possible to x86.On s390x, only complete cores can be plugged. Cores have to be plugged in the right order (core-id 0, 1, 2 ...). CPU hot unplug is not supported by the architecture.
In addition, we now also print the CPU model list in sorted order and allow only 1 CPU for TCG.
v1 -> v2:
- "exec,dump,i386,ppc,s390x: don't includeexec/cpu-all.hexplicitly" -- added a few instances I missed
- "s390x: get rid ofs390-virtio.c"
-- move everything in the first shot and clean the "cpu_states" stuff up
in later patches, when we havems->possible_cpus.
- Added "target/s390x: move typedef of S390CPU to its definition"
- Added "s390x: moves390_virtio_hypercall()tos390-virtio-hcall.h"
- Added "s390x: move two function declarations tos390-virtio-ccw.h"
- Added "s390x: movesclp_service_call()tointerrupt.c"
- "target/s390x: useprogram_interrupt()inper_check_exception()" -- Add a comment describing my concern
- "s390x: allow only 1 CPU with TCG"
-- Add a #define to easily be able to change it (e.g. for development)
- Added "target/s390x: setcpu->idfor linux user when realizing"
- "target/s390x: use "core-id" for cpu number/address/id handling" -- I now use "core-id" as property name, because that will be used bydevice_add
- "target/s390x: renamenext_cpu_idtonext_core_id"
-- Also change to the term "core_id"
- Added "s390x: print CPU definitions in sorted order"
- Added "s390x: allow cpu hotplug viadevice_add"
- Added "s390x: CPU hot unplug viadevice_delcannot work"
- Added "s390x: implement query-hotpluggable-cpu"
- Added "s390x: get rid ofcpu_s390x_create()"David Hildenbrand (19):
exec,dump,i386,ppc,s390x: don't includeexec/cpu-all.hexplicitly
cpu: drop old comments describing members
s390x: get rid ofs390-virtio.c
s390x: renames390-virtio.htos390-virtio-hcall.htarget/s390x: move typedef of S390CPU to its definition
s390x: moves390_virtio_hypercall()tos390-virtio-hcall.h
s390x: move two function declarations tos390-virtio-ccw.h
s390x: movesclp_service_call()tointerrupt.ctarget/s390x: usetrigger_pgm_exception()ins390_cpu_handle_mmu_fault()target/s390x: use
program_interrupt()inper_check_exception()
s390x: allow only 1 CPU with TCG
target/s390x: setcpu->idfor linux user when realizing target/s390x: use "core-id" for cpu number/address/id handling target/s390x: renamenext_cpu_idtonext_core_id
s390x: print CPU definitions in sorted order
s390x: allow cpu hotplug viadevice_add
s390x: CPU hot unplug viadevice_delcannot work
s390x: implement query-hotpluggable-cpus
s390x: get rid ofcpu_s390x_create()dump.c | 1 - exec.c | 2 - hw/s390x/Makefile.objs | 1 - hw/s390x/s390-virtio-ccw.c | 259 +++++++++++++++++++++++++++++++++++-- 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 | 51 +------- include/hw/s390x/s390-virtio-ccw.h | 3 + include/hw/s390x/sclp.h | 1 + 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 | 86 ++++-------- target/s390x/cpu.h | 19 +-- target/s390x/cpu_models.c | 65 ++++++---- target/s390x/diag.c | 1 + target/s390x/excp_helper.c | 5 +- target/s390x/helper.c | 47 +------ target/s390x/internal.h | 1 - target/s390x/interrupt.c | 52 ++++++++ target/s390x/kvm.c | 3 +- target/s390x/misc_helper.c | 22 ++-- target/s390x/translate.c | 5 +- 30 files changed, 443 insertions(+), 307 deletions(-) create mode 100644 hw/s390x/s390-virtio-hcall.h delete mode 100644 hw/s390x/s390-virtio.h
Quoted 4 lines · Christian Borntraeger
I think we certainly want to have
device_addas well (as long as the old interface stays for a while).Adding Matt. Can you have a look at the cpu hotplug bits?
If there is no further feedback, I'll be sending a new version out tomorrow, including the suggested changes. In addition, I'll be including support to hotplug VCPUs in random order (2 additional patches).
Signature · 3 lines
Thanks, David
Quoted 10 lines · David Hildenbrand
Quoted 4 lines · Christian Borntraeger
I think we certainly want to have
device_addas well (as long as the old interface stays for a while).Adding Matt. Can you have a look at the cpu hotplug bits?
If there is no further feedback, I'll be sending a new version out tomorrow, including the suggested changes. In addition, I'll be including support to hotplug VCPUs in random order (2 additional patches).
Hi David, just returning from vacation -- Will look at this set today.
Matt