[Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Collin Walling posted 1 patch 11 weeks ago
Test asan passed
Test checkpatch failed
Test docker-quick@centos7 passed
Test docker-mingw@fedora passed
Test docker-clang@ubuntu passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/1543961939-2419-1-git-send-email-walling@linux.ibm.com
hw/s390x/ipl.c                  |  3 +++
hw/s390x/s390-virtio-ccw.c      |  3 +++
hw/s390x/sclp.c                 |  2 ++
include/hw/s390x/sclp.h         |  2 ++
linux-headers/asm-s390/kvm.h    |  5 ++++
target/s390x/cpu.h              |  2 +-
target/s390x/cpu_features.c     |  3 +++
target/s390x/cpu_features.h     |  1 +
target/s390x/cpu_features_def.h |  3 +++
target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
target/s390x/gen-features.c     |  1 +
target/s390x/internal.h         |  4 +++-
target/s390x/kvm-stub.c         | 10 ++++++++
target/s390x/kvm.c              | 23 ++++++++++++++++++
target/s390x/kvm_s390x.h        |  3 +++
15 files changed, 116 insertions(+), 2 deletions(-)

[Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Collin Walling 11 weeks ago
Add migration and reset support for diagnose 318. This is a new z14 GA2 
hardware feature, but we can provide guest support starting with the 
zEC12-full CPU model.

Because new hardware introduces a new facility-availability byte in 
the Read SCP Info block, we lose one byte in the CPU entries list 
and must limit the maximum VCPUs to 247 (down from 248).

Signed-off-by: Collin Walling <walling@linux.ibm.com>
---

Changelog

    RFC -> v1
        - introduced kvm stubs for set/get cpc
        - s/fac134/byte_134
        - moved diag318 vmstate description to diag.c
        - reduced S390_VCPU_MAX to 247

 hw/s390x/ipl.c                  |  3 +++
 hw/s390x/s390-virtio-ccw.c      |  3 +++
 hw/s390x/sclp.c                 |  2 ++
 include/hw/s390x/sclp.h         |  2 ++
 linux-headers/asm-s390/kvm.h    |  5 ++++
 target/s390x/cpu.h              |  2 +-
 target/s390x/cpu_features.c     |  3 +++
 target/s390x/cpu_features.h     |  1 +
 target/s390x/cpu_features_def.h |  3 +++
 target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
 target/s390x/gen-features.c     |  1 +
 target/s390x/internal.h         |  4 +++-
 target/s390x/kvm-stub.c         | 10 ++++++++
 target/s390x/kvm.c              | 23 ++++++++++++++++++
 target/s390x/kvm_s390x.h        |  3 +++
 15 files changed, 116 insertions(+), 2 deletions(-)

diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index 21f64ad..6e3af65 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -27,6 +27,7 @@
 #include "qemu/cutils.h"
 #include "qemu/option.h"
 #include "exec/exec-all.h"
+#include "internal.h"
 
 #define KERN_IMAGE_START                0x010000UL
 #define LINUX_MAGIC_ADDR                0x010008UL
@@ -230,6 +231,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
     ipl->compat_start_addr = ipl->start_addr;
     ipl->compat_bios_start_addr = ipl->bios_start_addr;
     qemu_register_reset(qdev_reset_all_fn, dev);
+
+    diag318_register();
 error:
     error_propagate(errp, err);
 }
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index a0615a8..2c670fc 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -37,6 +37,7 @@
 #include "cpu_models.h"
 #include "hw/nmi.h"
 #include "hw/s390x/tod.h"
+#include "internal.h"
 
 S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
 {
@@ -357,6 +358,7 @@ static void s390_machine_reset(void)
         }
         subsystem_reset();
         s390_crypto_reset();
+        diag318_reset();
         run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
         break;
     case S390_RESET_LOAD_NORMAL:
@@ -364,6 +366,7 @@ static void s390_machine_reset(void)
             run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
         }
         subsystem_reset();
+        diag318_reset();
         run_on_cpu(cs, s390_do_cpu_initial_reset, RUN_ON_CPU_NULL);
         run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
         break;
diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
index 4510a80..183c627 100644
--- a/hw/s390x/sclp.c
+++ b/hw/s390x/sclp.c
@@ -73,6 +73,8 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
                          read_info->conf_char);
     s390_get_feat_block(S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
                          read_info->conf_char_ext);
+    /* Read Info byte 134 */
+    s390_get_feat_block(S390_FEAT_TYPE_SCLP_BYTE_134, read_info->byte_134);
 
     read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
                                         SCLP_HAS_IOA_RECONFIG);
diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
index f9db243..eb12ba2 100644
--- a/include/hw/s390x/sclp.h
+++ b/include/hw/s390x/sclp.h
@@ -133,6 +133,8 @@ typedef struct ReadInfo {
     uint16_t highest_cpu;
     uint8_t  _reserved5[124 - 122];     /* 122-123 */
     uint32_t hmfai;
+    uint8_t  _reserved7[134 - 128];     /* 128-133 */
+    uint8_t  byte_134[1];
     struct CPUEntry entries[0];
 } QEMU_PACKED ReadInfo;
 
diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
index 0265482..8c206d2 100644
--- a/linux-headers/asm-s390/kvm.h
+++ b/linux-headers/asm-s390/kvm.h
@@ -74,6 +74,7 @@ struct kvm_s390_io_adapter_req {
 #define KVM_S390_VM_CRYPTO		2
 #define KVM_S390_VM_CPU_MODEL		3
 #define KVM_S390_VM_MIGRATION		4
+#define KVM_S390_VM_MISC		5
 
 /* kvm attributes for mem_ctrl */
 #define KVM_S390_VM_MEM_ENABLE_CMMA	0
@@ -130,6 +131,7 @@ struct kvm_s390_vm_cpu_machine {
 #define KVM_S390_VM_CPU_FEAT_PFMFI	11
 #define KVM_S390_VM_CPU_FEAT_SIGPIF	12
 #define KVM_S390_VM_CPU_FEAT_KSS	13
+#define KVM_S390_VM_CPU_FEAT_DIAG318	14
 struct kvm_s390_vm_cpu_feat {
 	__u64 feat[16];
 };
@@ -168,6 +170,9 @@ struct kvm_s390_vm_cpu_subfunc {
 #define KVM_S390_VM_MIGRATION_START	1
 #define KVM_S390_VM_MIGRATION_STATUS	2
 
+/* kvm attributes for KVM_S390_VM_MISC */
+#define KVM_S390_VM_MISC_CPC		0
+
 /* for KVM_GET_REGS and KVM_SET_REGS */
 struct kvm_regs {
 	/* general purpose regs for s390 */
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index 8c2320e..594b4a4 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -52,7 +52,7 @@
 
 #define MMU_USER_IDX 0
 
-#define S390_MAX_CPUS 248
+#define S390_MAX_CPUS 247
 
 typedef struct PSW {
     uint64_t mask;
diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
index 60cfeba..d05afa5 100644
--- a/target/s390x/cpu_features.c
+++ b/target/s390x/cpu_features.c
@@ -121,6 +121,9 @@ static const S390FeatDef s390_features[] = {
     FEAT_INIT("pfmfi", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 9, "SIE: PFMF interpretation facility"),
     FEAT_INIT("ibs", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 10, "SIE: Interlock-and-broadcast-suppression facility"),
 
+    /* SCLP SCCB Byte 134 */
+    FEAT_INIT("diag318", S390_FEAT_TYPE_SCLP_BYTE_134, 0, "SIE: Diagnose 318"),
+
     FEAT_INIT("sief2", S390_FEAT_TYPE_SCLP_CPU, 4, "SIE: interception format 2 (Virtual SIE)"),
     FEAT_INIT("skey", S390_FEAT_TYPE_SCLP_CPU, 5, "SIE: Storage-key facility"),
     FEAT_INIT("gpereh", S390_FEAT_TYPE_SCLP_CPU, 10, "SIE: Guest-PER enhancement facility"),
diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
index effe790..e7248df 100644
--- a/target/s390x/cpu_features.h
+++ b/target/s390x/cpu_features.h
@@ -23,6 +23,7 @@ typedef enum {
     S390_FEAT_TYPE_STFL,
     S390_FEAT_TYPE_SCLP_CONF_CHAR,
     S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
+    S390_FEAT_TYPE_SCLP_BYTE_134,
     S390_FEAT_TYPE_SCLP_CPU,
     S390_FEAT_TYPE_MISC,
     S390_FEAT_TYPE_PLO,
diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h
index 5fc7e7b..d99da1d 100644
--- a/target/s390x/cpu_features_def.h
+++ b/target/s390x/cpu_features_def.h
@@ -109,6 +109,9 @@ typedef enum {
     S390_FEAT_SIE_PFMFI,
     S390_FEAT_SIE_IBS,
 
+    /* Read Info Byte 134 */
+    S390_FEAT_DIAG318,
+
     /* Sclp Cpu */
     S390_FEAT_SIE_F2,
     S390_FEAT_SIE_SKEY,
diff --git a/target/s390x/diag.c b/target/s390x/diag.c
index acb0f3d..2207c08 100644
--- a/target/s390x/diag.c
+++ b/target/s390x/diag.c
@@ -20,6 +20,8 @@
 #include "sysemu/cpus.h"
 #include "hw/s390x/ipl.h"
 #include "hw/s390x/s390-virtio-ccw.h"
+#include "kvm_s390x.h"
+#include "sysemu/kvm.h"
 
 int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
 {
@@ -134,3 +136,54 @@ out:
         break;
     }
 }
+
+typedef struct Diag318Data {
+    uint64_t cpc;
+} Diag318Data;
+static Diag318Data diag318data;
+
+void diag318_reset(void)
+{
+    if (s390_has_feat(S390_FEAT_DIAG318)) {
+        kvm_s390_set_cpc(0);
+    }
+}
+
+static int diag318_post_load(void *opaque, int version_id)
+{
+    Diag318Data *d = opaque;
+
+    kvm_s390_set_cpc(d->cpc);
+    return 0;
+}
+
+static int diag318_pre_save(void *opaque)
+{
+    Diag318Data *d = opaque;
+
+    kvm_s390_get_cpc(&d->cpc);
+    return 0;
+}
+
+static bool diag318_needed(void *opaque)
+{
+    return s390_has_feat(S390_FEAT_DIAG318);
+}
+
+const VMStateDescription vmstate_diag318 = {
+    .name = "diag318",
+    .post_load = diag318_post_load,
+    .pre_save = diag318_pre_save,
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .needed = diag318_needed,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT64(cpc, Diag318Data),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+void diag318_register(void)
+{
+    vmstate_register(NULL, 0, &vmstate_diag318, &diag318data);
+}
\ No newline at end of file
diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
index 70015ea..a3d1457 100644
--- a/target/s390x/gen-features.c
+++ b/target/s390x/gen-features.c
@@ -450,6 +450,7 @@ static uint16_t full_GEN12_GA1[] = {
     S390_FEAT_AP_QUERY_CONFIG_INFO,
     S390_FEAT_AP_FACILITIES_TEST,
     S390_FEAT_AP,
+    S390_FEAT_DIAG318,
 };
 
 static uint16_t full_GEN12_GA2[] = {
diff --git a/target/s390x/internal.h b/target/s390x/internal.h
index f2a771e..d53b1d0 100644
--- a/target/s390x/internal.h
+++ b/target/s390x/internal.h
@@ -383,10 +383,12 @@ int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw,
                        target_ulong *addr, int *flags);
 
 
-/* misc_helper.c */
+/* diag.c */
 int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
 void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
                      uintptr_t ra);
+void diag318_register(void);
+void diag318_reset(void);
 
 
 /* translate.c */
diff --git a/target/s390x/kvm-stub.c b/target/s390x/kvm-stub.c
index bf7795e..1f0bee3 100644
--- a/target/s390x/kvm-stub.c
+++ b/target/s390x/kvm-stub.c
@@ -104,3 +104,13 @@ void kvm_s390_stop_interrupt(S390CPU *cpu)
 void kvm_s390_restart_interrupt(S390CPU *cpu)
 {
 }
+
+int kvm_s390_get_cpc(uint64_t *cpc)
+{
+    return 0;
+}
+
+int kvm_s390_set_cpc(uint64_t cpc)
+{
+    return 0;
+}
\ No newline at end of file
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
index 2ebf26a..9ed4cea 100644
--- a/target/s390x/kvm.c
+++ b/target/s390x/kvm.c
@@ -749,6 +749,28 @@ int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_low)
     return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
 }
 
+int kvm_s390_get_cpc(uint64_t *cpc)
+{
+    struct kvm_device_attr attr = {
+        .group = KVM_S390_VM_MISC,
+        .attr = KVM_S390_VM_MISC_CPC,
+        .addr = (uint64_t)cpc,
+    };
+
+    return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
+}
+
+int kvm_s390_set_cpc(uint64_t cpc)
+{
+    struct kvm_device_attr attr = {
+        .group = KVM_S390_VM_MISC,
+        .attr = KVM_S390_VM_MISC_CPC,
+        .addr = (uint64_t)&cpc,
+    };
+
+    return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
+}
+
 /**
  * kvm_s390_mem_op:
  * @addr:      the logical start address in guest memory
@@ -2142,6 +2164,7 @@ static int kvm_to_feat[][2] = {
     { KVM_S390_VM_CPU_FEAT_PFMFI, S390_FEAT_SIE_PFMFI},
     { KVM_S390_VM_CPU_FEAT_SIGPIF, S390_FEAT_SIE_SIGPIF},
     { KVM_S390_VM_CPU_FEAT_KSS, S390_FEAT_SIE_KSS},
+    { KVM_S390_VM_CPU_FEAT_DIAG318, S390_FEAT_DIAG318},
 };
 
 static int query_cpu_feat(S390FeatBitmap features)
diff --git a/target/s390x/kvm_s390x.h b/target/s390x/kvm_s390x.h
index 6e52287..53f165f 100644
--- a/target/s390x/kvm_s390x.h
+++ b/target/s390x/kvm_s390x.h
@@ -29,6 +29,9 @@ int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
 int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
 int kvm_s390_set_clock(uint8_t tod_high, uint64_t tod_clock);
 int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_clock);
+int kvm_s390_get_cpc(uint64_t *cpc);
+int kvm_s390_set_cpc(uint64_t cpc);
+bool kvm_s390_has_diag318(void);
 void kvm_s390_enable_css_support(S390CPU *cpu);
 int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
                                     int vq, bool assign);
-- 
2.7.4


Re: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Christian Borntraeger 11 weeks ago
You should clearly review your email list.....

Adding the "new" Conny, removing Carsten.


On 04.12.2018 23:18, Collin Walling wrote:
> Add migration and reset support for diagnose 318. This is a new z14 GA2 
> hardware feature, but we can provide guest support starting with the 
> zEC12-full CPU model.
> 
> Because new hardware introduces a new facility-availability byte in 
> the Read SCP Info block, we lose one byte in the CPU entries list 
> and must limit the maximum VCPUs to 247 (down from 248).
> 
> Signed-off-by: Collin Walling <walling@linux.ibm.com>
> ---
> 
> Changelog
> 
>     RFC -> v1
>         - introduced kvm stubs for set/get cpc
>         - s/fac134/byte_134
>         - moved diag318 vmstate description to diag.c
>         - reduced S390_VCPU_MAX to 247
> 
>  hw/s390x/ipl.c                  |  3 +++
>  hw/s390x/s390-virtio-ccw.c      |  3 +++
>  hw/s390x/sclp.c                 |  2 ++
>  include/hw/s390x/sclp.h         |  2 ++
>  linux-headers/asm-s390/kvm.h    |  5 ++++
>  target/s390x/cpu.h              |  2 +-
>  target/s390x/cpu_features.c     |  3 +++
>  target/s390x/cpu_features.h     |  1 +
>  target/s390x/cpu_features_def.h |  3 +++
>  target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
>  target/s390x/gen-features.c     |  1 +
>  target/s390x/internal.h         |  4 +++-
>  target/s390x/kvm-stub.c         | 10 ++++++++
>  target/s390x/kvm.c              | 23 ++++++++++++++++++
>  target/s390x/kvm_s390x.h        |  3 +++
>  15 files changed, 116 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> index 21f64ad..6e3af65 100644
> --- a/hw/s390x/ipl.c
> +++ b/hw/s390x/ipl.c
> @@ -27,6 +27,7 @@
>  #include "qemu/cutils.h"
>  #include "qemu/option.h"
>  #include "exec/exec-all.h"
> +#include "internal.h"
>  
>  #define KERN_IMAGE_START                0x010000UL
>  #define LINUX_MAGIC_ADDR                0x010008UL
> @@ -230,6 +231,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
>      ipl->compat_start_addr = ipl->start_addr;
>      ipl->compat_bios_start_addr = ipl->bios_start_addr;
>      qemu_register_reset(qdev_reset_all_fn, dev);
> +
> +    diag318_register();
>  error:
>      error_propagate(errp, err);
>  }
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index a0615a8..2c670fc 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -37,6 +37,7 @@
>  #include "cpu_models.h"
>  #include "hw/nmi.h"
>  #include "hw/s390x/tod.h"
> +#include "internal.h"
>  
>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
>  {
> @@ -357,6 +358,7 @@ static void s390_machine_reset(void)
>          }
>          subsystem_reset();
>          s390_crypto_reset();
> +        diag318_reset();
>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>          break;
>      case S390_RESET_LOAD_NORMAL:
> @@ -364,6 +366,7 @@ static void s390_machine_reset(void)
>              run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
>          }
>          subsystem_reset();
> +        diag318_reset();
>          run_on_cpu(cs, s390_do_cpu_initial_reset, RUN_ON_CPU_NULL);
>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>          break;
> diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
> index 4510a80..183c627 100644
> --- a/hw/s390x/sclp.c
> +++ b/hw/s390x/sclp.c
> @@ -73,6 +73,8 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
>                           read_info->conf_char);
>      s390_get_feat_block(S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
>                           read_info->conf_char_ext);
> +    /* Read Info byte 134 */
> +    s390_get_feat_block(S390_FEAT_TYPE_SCLP_BYTE_134, read_info->byte_134);
>  
>      read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
>                                          SCLP_HAS_IOA_RECONFIG);
> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> index f9db243..eb12ba2 100644
> --- a/include/hw/s390x/sclp.h
> +++ b/include/hw/s390x/sclp.h
> @@ -133,6 +133,8 @@ typedef struct ReadInfo {
>      uint16_t highest_cpu;
>      uint8_t  _reserved5[124 - 122];     /* 122-123 */
>      uint32_t hmfai;
> +    uint8_t  _reserved7[134 - 128];     /* 128-133 */
> +    uint8_t  byte_134[1];
>      struct CPUEntry entries[0];
>  } QEMU_PACKED ReadInfo;
>  
> diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
> index 0265482..8c206d2 100644
> --- a/linux-headers/asm-s390/kvm.h
> +++ b/linux-headers/asm-s390/kvm.h
> @@ -74,6 +74,7 @@ struct kvm_s390_io_adapter_req {
>  #define KVM_S390_VM_CRYPTO		2
>  #define KVM_S390_VM_CPU_MODEL		3
>  #define KVM_S390_VM_MIGRATION		4
> +#define KVM_S390_VM_MISC		5
>  
>  /* kvm attributes for mem_ctrl */
>  #define KVM_S390_VM_MEM_ENABLE_CMMA	0
> @@ -130,6 +131,7 @@ struct kvm_s390_vm_cpu_machine {
>  #define KVM_S390_VM_CPU_FEAT_PFMFI	11
>  #define KVM_S390_VM_CPU_FEAT_SIGPIF	12
>  #define KVM_S390_VM_CPU_FEAT_KSS	13
> +#define KVM_S390_VM_CPU_FEAT_DIAG318	14
>  struct kvm_s390_vm_cpu_feat {
>  	__u64 feat[16];
>  };
> @@ -168,6 +170,9 @@ struct kvm_s390_vm_cpu_subfunc {
>  #define KVM_S390_VM_MIGRATION_START	1
>  #define KVM_S390_VM_MIGRATION_STATUS	2
>  
> +/* kvm attributes for KVM_S390_VM_MISC */
> +#define KVM_S390_VM_MISC_CPC		0
> +
>  /* for KVM_GET_REGS and KVM_SET_REGS */
>  struct kvm_regs {
>  	/* general purpose regs for s390 */
> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> index 8c2320e..594b4a4 100644
> --- a/target/s390x/cpu.h
> +++ b/target/s390x/cpu.h
> @@ -52,7 +52,7 @@
>  
>  #define MMU_USER_IDX 0
>  
> -#define S390_MAX_CPUS 248
> +#define S390_MAX_CPUS 247
>  
>  typedef struct PSW {
>      uint64_t mask;
> diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
> index 60cfeba..d05afa5 100644
> --- a/target/s390x/cpu_features.c
> +++ b/target/s390x/cpu_features.c
> @@ -121,6 +121,9 @@ static const S390FeatDef s390_features[] = {
>      FEAT_INIT("pfmfi", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 9, "SIE: PFMF interpretation facility"),
>      FEAT_INIT("ibs", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 10, "SIE: Interlock-and-broadcast-suppression facility"),
>  
> +    /* SCLP SCCB Byte 134 */
> +    FEAT_INIT("diag318", S390_FEAT_TYPE_SCLP_BYTE_134, 0, "SIE: Diagnose 318"),
> +
>      FEAT_INIT("sief2", S390_FEAT_TYPE_SCLP_CPU, 4, "SIE: interception format 2 (Virtual SIE)"),
>      FEAT_INIT("skey", S390_FEAT_TYPE_SCLP_CPU, 5, "SIE: Storage-key facility"),
>      FEAT_INIT("gpereh", S390_FEAT_TYPE_SCLP_CPU, 10, "SIE: Guest-PER enhancement facility"),
> diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
> index effe790..e7248df 100644
> --- a/target/s390x/cpu_features.h
> +++ b/target/s390x/cpu_features.h
> @@ -23,6 +23,7 @@ typedef enum {
>      S390_FEAT_TYPE_STFL,
>      S390_FEAT_TYPE_SCLP_CONF_CHAR,
>      S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
> +    S390_FEAT_TYPE_SCLP_BYTE_134,
>      S390_FEAT_TYPE_SCLP_CPU,
>      S390_FEAT_TYPE_MISC,
>      S390_FEAT_TYPE_PLO,
> diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h
> index 5fc7e7b..d99da1d 100644
> --- a/target/s390x/cpu_features_def.h
> +++ b/target/s390x/cpu_features_def.h
> @@ -109,6 +109,9 @@ typedef enum {
>      S390_FEAT_SIE_PFMFI,
>      S390_FEAT_SIE_IBS,
>  
> +    /* Read Info Byte 134 */
> +    S390_FEAT_DIAG318,
> +
>      /* Sclp Cpu */
>      S390_FEAT_SIE_F2,
>      S390_FEAT_SIE_SKEY,
> diff --git a/target/s390x/diag.c b/target/s390x/diag.c
> index acb0f3d..2207c08 100644
> --- a/target/s390x/diag.c
> +++ b/target/s390x/diag.c
> @@ -20,6 +20,8 @@
>  #include "sysemu/cpus.h"
>  #include "hw/s390x/ipl.h"
>  #include "hw/s390x/s390-virtio-ccw.h"
> +#include "kvm_s390x.h"
> +#include "sysemu/kvm.h"
>  
>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
>  {
> @@ -134,3 +136,54 @@ out:
>          break;
>      }
>  }
> +
> +typedef struct Diag318Data {
> +    uint64_t cpc;
> +} Diag318Data;
> +static Diag318Data diag318data;
> +
> +void diag318_reset(void)
> +{
> +    if (s390_has_feat(S390_FEAT_DIAG318)) {
> +        kvm_s390_set_cpc(0);
> +    }
> +}
> +
> +static int diag318_post_load(void *opaque, int version_id)
> +{
> +    Diag318Data *d = opaque;
> +
> +    kvm_s390_set_cpc(d->cpc);
> +    return 0;
> +}
> +
> +static int diag318_pre_save(void *opaque)
> +{
> +    Diag318Data *d = opaque;
> +
> +    kvm_s390_get_cpc(&d->cpc);
> +    return 0;
> +}
> +
> +static bool diag318_needed(void *opaque)
> +{
> +    return s390_has_feat(S390_FEAT_DIAG318);
> +}
> +
> +const VMStateDescription vmstate_diag318 = {
> +    .name = "diag318",
> +    .post_load = diag318_post_load,
> +    .pre_save = diag318_pre_save,
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .needed = diag318_needed,
> +    .fields = (VMStateField[]) {
> +        VMSTATE_UINT64(cpc, Diag318Data),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> +void diag318_register(void)
> +{
> +    vmstate_register(NULL, 0, &vmstate_diag318, &diag318data);
> +}
> \ No newline at end of file
> diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
> index 70015ea..a3d1457 100644
> --- a/target/s390x/gen-features.c
> +++ b/target/s390x/gen-features.c
> @@ -450,6 +450,7 @@ static uint16_t full_GEN12_GA1[] = {
>      S390_FEAT_AP_QUERY_CONFIG_INFO,
>      S390_FEAT_AP_FACILITIES_TEST,
>      S390_FEAT_AP,
> +    S390_FEAT_DIAG318,
>  };
>  
>  static uint16_t full_GEN12_GA2[] = {
> diff --git a/target/s390x/internal.h b/target/s390x/internal.h
> index f2a771e..d53b1d0 100644
> --- a/target/s390x/internal.h
> +++ b/target/s390x/internal.h
> @@ -383,10 +383,12 @@ int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw,
>                         target_ulong *addr, int *flags);
>  
>  
> -/* misc_helper.c */
> +/* diag.c */
>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
>  void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
>                       uintptr_t ra);
> +void diag318_register(void);
> +void diag318_reset(void);
>  
>  
>  /* translate.c */
> diff --git a/target/s390x/kvm-stub.c b/target/s390x/kvm-stub.c
> index bf7795e..1f0bee3 100644
> --- a/target/s390x/kvm-stub.c
> +++ b/target/s390x/kvm-stub.c
> @@ -104,3 +104,13 @@ void kvm_s390_stop_interrupt(S390CPU *cpu)
>  void kvm_s390_restart_interrupt(S390CPU *cpu)
>  {
>  }
> +
> +int kvm_s390_get_cpc(uint64_t *cpc)
> +{
> +    return 0;
> +}
> +
> +int kvm_s390_set_cpc(uint64_t cpc)
> +{
> +    return 0;
> +}
> \ No newline at end of file
> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> index 2ebf26a..9ed4cea 100644
> --- a/target/s390x/kvm.c
> +++ b/target/s390x/kvm.c
> @@ -749,6 +749,28 @@ int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_low)
>      return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
>  }
>  
> +int kvm_s390_get_cpc(uint64_t *cpc)
> +{
> +    struct kvm_device_attr attr = {
> +        .group = KVM_S390_VM_MISC,
> +        .attr = KVM_S390_VM_MISC_CPC,
> +        .addr = (uint64_t)cpc,
> +    };
> +
> +    return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
> +}
> +
> +int kvm_s390_set_cpc(uint64_t cpc)
> +{
> +    struct kvm_device_attr attr = {
> +        .group = KVM_S390_VM_MISC,
> +        .attr = KVM_S390_VM_MISC_CPC,
> +        .addr = (uint64_t)&cpc,
> +    };
> +
> +    return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
> +}
> +
>  /**
>   * kvm_s390_mem_op:
>   * @addr:      the logical start address in guest memory
> @@ -2142,6 +2164,7 @@ static int kvm_to_feat[][2] = {
>      { KVM_S390_VM_CPU_FEAT_PFMFI, S390_FEAT_SIE_PFMFI},
>      { KVM_S390_VM_CPU_FEAT_SIGPIF, S390_FEAT_SIE_SIGPIF},
>      { KVM_S390_VM_CPU_FEAT_KSS, S390_FEAT_SIE_KSS},
> +    { KVM_S390_VM_CPU_FEAT_DIAG318, S390_FEAT_DIAG318},
>  };
>  
>  static int query_cpu_feat(S390FeatBitmap features)
> diff --git a/target/s390x/kvm_s390x.h b/target/s390x/kvm_s390x.h
> index 6e52287..53f165f 100644
> --- a/target/s390x/kvm_s390x.h
> +++ b/target/s390x/kvm_s390x.h
> @@ -29,6 +29,9 @@ int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
>  int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
>  int kvm_s390_set_clock(uint8_t tod_high, uint64_t tod_clock);
>  int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_clock);
> +int kvm_s390_get_cpc(uint64_t *cpc);
> +int kvm_s390_set_cpc(uint64_t cpc);
> +bool kvm_s390_has_diag318(void);
>  void kvm_s390_enable_css_support(S390CPU *cpu);
>  int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
>                                      int vq, bool assign);
> 


Re: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Collin Walling 11 weeks ago
On 12/5/18 3:29 AM, Christian Borntraeger wrote:
> You should clearly review your email list.....
> 
> Adding the "new" Conny, removing Carsten.
> 

Thanks for taking care of that. I'll be more careful when using the
addresses at the top of the files. 

> 
> On 04.12.2018 23:18, Collin Walling wrote:
>> Add migration and reset support for diagnose 318. This is a new z14 GA2 
>> hardware feature, but we can provide guest support starting with the 
>> zEC12-full CPU model.
>>
>> Because new hardware introduces a new facility-availability byte in 
>> the Read SCP Info block, we lose one byte in the CPU entries list 
>> and must limit the maximum VCPUs to 247 (down from 248).
>>
>> Signed-off-by: Collin Walling <walling@linux.ibm.com>
>> ---
>>
>> Changelog
>>
>>     RFC -> v1
>>         - introduced kvm stubs for set/get cpc
>>         - s/fac134/byte_134
>>         - moved diag318 vmstate description to diag.c
>>         - reduced S390_VCPU_MAX to 247
>>
>>  hw/s390x/ipl.c                  |  3 +++
>>  hw/s390x/s390-virtio-ccw.c      |  3 +++
>>  hw/s390x/sclp.c                 |  2 ++
>>  include/hw/s390x/sclp.h         |  2 ++
>>  linux-headers/asm-s390/kvm.h    |  5 ++++
>>  target/s390x/cpu.h              |  2 +-
>>  target/s390x/cpu_features.c     |  3 +++
>>  target/s390x/cpu_features.h     |  1 +
>>  target/s390x/cpu_features_def.h |  3 +++
>>  target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
>>  target/s390x/gen-features.c     |  1 +
>>  target/s390x/internal.h         |  4 +++-
>>  target/s390x/kvm-stub.c         | 10 ++++++++
>>  target/s390x/kvm.c              | 23 ++++++++++++++++++
>>  target/s390x/kvm_s390x.h        |  3 +++
>>  15 files changed, 116 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
>> index 21f64ad..6e3af65 100644
>> --- a/hw/s390x/ipl.c
>> +++ b/hw/s390x/ipl.c
>> @@ -27,6 +27,7 @@
>>  #include "qemu/cutils.h"
>>  #include "qemu/option.h"
>>  #include "exec/exec-all.h"
>> +#include "internal.h"
>>  
>>  #define KERN_IMAGE_START                0x010000UL
>>  #define LINUX_MAGIC_ADDR                0x010008UL
>> @@ -230,6 +231,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
>>      ipl->compat_start_addr = ipl->start_addr;
>>      ipl->compat_bios_start_addr = ipl->bios_start_addr;
>>      qemu_register_reset(qdev_reset_all_fn, dev);
>> +
>> +    diag318_register();
>>  error:
>>      error_propagate(errp, err);
>>  }
>> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
>> index a0615a8..2c670fc 100644
>> --- a/hw/s390x/s390-virtio-ccw.c
>> +++ b/hw/s390x/s390-virtio-ccw.c
>> @@ -37,6 +37,7 @@
>>  #include "cpu_models.h"
>>  #include "hw/nmi.h"
>>  #include "hw/s390x/tod.h"
>> +#include "internal.h"
>>  
>>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
>>  {
>> @@ -357,6 +358,7 @@ static void s390_machine_reset(void)
>>          }
>>          subsystem_reset();
>>          s390_crypto_reset();
>> +        diag318_reset();
>>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>>          break;
>>      case S390_RESET_LOAD_NORMAL:
>> @@ -364,6 +366,7 @@ static void s390_machine_reset(void)
>>              run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
>>          }
>>          subsystem_reset();
>> +        diag318_reset();
>>          run_on_cpu(cs, s390_do_cpu_initial_reset, RUN_ON_CPU_NULL);
>>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>>          break;
>> diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
>> index 4510a80..183c627 100644
>> --- a/hw/s390x/sclp.c
>> +++ b/hw/s390x/sclp.c
>> @@ -73,6 +73,8 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
>>                           read_info->conf_char);
>>      s390_get_feat_block(S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
>>                           read_info->conf_char_ext);
>> +    /* Read Info byte 134 */
>> +    s390_get_feat_block(S390_FEAT_TYPE_SCLP_BYTE_134, read_info->byte_134);
>>  
>>      read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
>>                                          SCLP_HAS_IOA_RECONFIG);
>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>> index f9db243..eb12ba2 100644
>> --- a/include/hw/s390x/sclp.h
>> +++ b/include/hw/s390x/sclp.h
>> @@ -133,6 +133,8 @@ typedef struct ReadInfo {
>>      uint16_t highest_cpu;
>>      uint8_t  _reserved5[124 - 122];     /* 122-123 */
>>      uint32_t hmfai;
>> +    uint8_t  _reserved7[134 - 128];     /* 128-133 */
>> +    uint8_t  byte_134[1];
>>      struct CPUEntry entries[0];
>>  } QEMU_PACKED ReadInfo;
>>  
>> diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
>> index 0265482..8c206d2 100644
>> --- a/linux-headers/asm-s390/kvm.h
>> +++ b/linux-headers/asm-s390/kvm.h
>> @@ -74,6 +74,7 @@ struct kvm_s390_io_adapter_req {
>>  #define KVM_S390_VM_CRYPTO		2
>>  #define KVM_S390_VM_CPU_MODEL		3
>>  #define KVM_S390_VM_MIGRATION		4
>> +#define KVM_S390_VM_MISC		5
>>  
>>  /* kvm attributes for mem_ctrl */
>>  #define KVM_S390_VM_MEM_ENABLE_CMMA	0
>> @@ -130,6 +131,7 @@ struct kvm_s390_vm_cpu_machine {
>>  #define KVM_S390_VM_CPU_FEAT_PFMFI	11
>>  #define KVM_S390_VM_CPU_FEAT_SIGPIF	12
>>  #define KVM_S390_VM_CPU_FEAT_KSS	13
>> +#define KVM_S390_VM_CPU_FEAT_DIAG318	14
>>  struct kvm_s390_vm_cpu_feat {
>>  	__u64 feat[16];
>>  };
>> @@ -168,6 +170,9 @@ struct kvm_s390_vm_cpu_subfunc {
>>  #define KVM_S390_VM_MIGRATION_START	1
>>  #define KVM_S390_VM_MIGRATION_STATUS	2
>>  
>> +/* kvm attributes for KVM_S390_VM_MISC */
>> +#define KVM_S390_VM_MISC_CPC		0
>> +
>>  /* for KVM_GET_REGS and KVM_SET_REGS */
>>  struct kvm_regs {
>>  	/* general purpose regs for s390 */
>> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
>> index 8c2320e..594b4a4 100644
>> --- a/target/s390x/cpu.h
>> +++ b/target/s390x/cpu.h
>> @@ -52,7 +52,7 @@
>>  
>>  #define MMU_USER_IDX 0
>>  
>> -#define S390_MAX_CPUS 248
>> +#define S390_MAX_CPUS 247
>>  
>>  typedef struct PSW {
>>      uint64_t mask;
>> diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
>> index 60cfeba..d05afa5 100644
>> --- a/target/s390x/cpu_features.c
>> +++ b/target/s390x/cpu_features.c
>> @@ -121,6 +121,9 @@ static const S390FeatDef s390_features[] = {
>>      FEAT_INIT("pfmfi", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 9, "SIE: PFMF interpretation facility"),
>>      FEAT_INIT("ibs", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 10, "SIE: Interlock-and-broadcast-suppression facility"),
>>  
>> +    /* SCLP SCCB Byte 134 */
>> +    FEAT_INIT("diag318", S390_FEAT_TYPE_SCLP_BYTE_134, 0, "SIE: Diagnose 318"),
>> +
>>      FEAT_INIT("sief2", S390_FEAT_TYPE_SCLP_CPU, 4, "SIE: interception format 2 (Virtual SIE)"),
>>      FEAT_INIT("skey", S390_FEAT_TYPE_SCLP_CPU, 5, "SIE: Storage-key facility"),
>>      FEAT_INIT("gpereh", S390_FEAT_TYPE_SCLP_CPU, 10, "SIE: Guest-PER enhancement facility"),
>> diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
>> index effe790..e7248df 100644
>> --- a/target/s390x/cpu_features.h
>> +++ b/target/s390x/cpu_features.h
>> @@ -23,6 +23,7 @@ typedef enum {
>>      S390_FEAT_TYPE_STFL,
>>      S390_FEAT_TYPE_SCLP_CONF_CHAR,
>>      S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
>> +    S390_FEAT_TYPE_SCLP_BYTE_134,
>>      S390_FEAT_TYPE_SCLP_CPU,
>>      S390_FEAT_TYPE_MISC,
>>      S390_FEAT_TYPE_PLO,
>> diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h
>> index 5fc7e7b..d99da1d 100644
>> --- a/target/s390x/cpu_features_def.h
>> +++ b/target/s390x/cpu_features_def.h
>> @@ -109,6 +109,9 @@ typedef enum {
>>      S390_FEAT_SIE_PFMFI,
>>      S390_FEAT_SIE_IBS,
>>  
>> +    /* Read Info Byte 134 */
>> +    S390_FEAT_DIAG318,
>> +
>>      /* Sclp Cpu */
>>      S390_FEAT_SIE_F2,
>>      S390_FEAT_SIE_SKEY,
>> diff --git a/target/s390x/diag.c b/target/s390x/diag.c
>> index acb0f3d..2207c08 100644
>> --- a/target/s390x/diag.c
>> +++ b/target/s390x/diag.c
>> @@ -20,6 +20,8 @@
>>  #include "sysemu/cpus.h"
>>  #include "hw/s390x/ipl.h"
>>  #include "hw/s390x/s390-virtio-ccw.h"
>> +#include "kvm_s390x.h"
>> +#include "sysemu/kvm.h"
>>  
>>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
>>  {
>> @@ -134,3 +136,54 @@ out:
>>          break;
>>      }
>>  }
>> +
>> +typedef struct Diag318Data {
>> +    uint64_t cpc;
>> +} Diag318Data;
>> +static Diag318Data diag318data;
>> +
>> +void diag318_reset(void)
>> +{
>> +    if (s390_has_feat(S390_FEAT_DIAG318)) {
>> +        kvm_s390_set_cpc(0);
>> +    }
>> +}
>> +
>> +static int diag318_post_load(void *opaque, int version_id)
>> +{
>> +    Diag318Data *d = opaque;
>> +
>> +    kvm_s390_set_cpc(d->cpc);
>> +    return 0;
>> +}
>> +
>> +static int diag318_pre_save(void *opaque)
>> +{
>> +    Diag318Data *d = opaque;
>> +
>> +    kvm_s390_get_cpc(&d->cpc);
>> +    return 0;
>> +}
>> +
>> +static bool diag318_needed(void *opaque)
>> +{
>> +    return s390_has_feat(S390_FEAT_DIAG318);
>> +}
>> +
>> +const VMStateDescription vmstate_diag318 = {
>> +    .name = "diag318",
>> +    .post_load = diag318_post_load,
>> +    .pre_save = diag318_pre_save,
>> +    .version_id = 1,
>> +    .minimum_version_id = 1,
>> +    .needed = diag318_needed,
>> +    .fields = (VMStateField[]) {
>> +        VMSTATE_UINT64(cpc, Diag318Data),
>> +        VMSTATE_END_OF_LIST()
>> +    }
>> +};
>> +
>> +void diag318_register(void)
>> +{
>> +    vmstate_register(NULL, 0, &vmstate_diag318, &diag318data);
>> +}
>> \ No newline at end of file
>> diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
>> index 70015ea..a3d1457 100644
>> --- a/target/s390x/gen-features.c
>> +++ b/target/s390x/gen-features.c
>> @@ -450,6 +450,7 @@ static uint16_t full_GEN12_GA1[] = {
>>      S390_FEAT_AP_QUERY_CONFIG_INFO,
>>      S390_FEAT_AP_FACILITIES_TEST,
>>      S390_FEAT_AP,
>> +    S390_FEAT_DIAG318,
>>  };
>>  
>>  static uint16_t full_GEN12_GA2[] = {
>> diff --git a/target/s390x/internal.h b/target/s390x/internal.h
>> index f2a771e..d53b1d0 100644
>> --- a/target/s390x/internal.h
>> +++ b/target/s390x/internal.h
>> @@ -383,10 +383,12 @@ int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw,
>>                         target_ulong *addr, int *flags);
>>  
>>  
>> -/* misc_helper.c */
>> +/* diag.c */
>>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
>>  void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
>>                       uintptr_t ra);
>> +void diag318_register(void);
>> +void diag318_reset(void);
>>  
>>  
>>  /* translate.c */
>> diff --git a/target/s390x/kvm-stub.c b/target/s390x/kvm-stub.c
>> index bf7795e..1f0bee3 100644
>> --- a/target/s390x/kvm-stub.c
>> +++ b/target/s390x/kvm-stub.c
>> @@ -104,3 +104,13 @@ void kvm_s390_stop_interrupt(S390CPU *cpu)
>>  void kvm_s390_restart_interrupt(S390CPU *cpu)
>>  {
>>  }
>> +
>> +int kvm_s390_get_cpc(uint64_t *cpc)
>> +{
>> +    return 0;
>> +}
>> +
>> +int kvm_s390_set_cpc(uint64_t cpc)
>> +{
>> +    return 0;
>> +}
>> \ No newline at end of file
>> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
>> index 2ebf26a..9ed4cea 100644
>> --- a/target/s390x/kvm.c
>> +++ b/target/s390x/kvm.c
>> @@ -749,6 +749,28 @@ int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_low)
>>      return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
>>  }
>>  
>> +int kvm_s390_get_cpc(uint64_t *cpc)
>> +{
>> +    struct kvm_device_attr attr = {
>> +        .group = KVM_S390_VM_MISC,
>> +        .attr = KVM_S390_VM_MISC_CPC,
>> +        .addr = (uint64_t)cpc,
>> +    };
>> +
>> +    return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
>> +}
>> +
>> +int kvm_s390_set_cpc(uint64_t cpc)
>> +{
>> +    struct kvm_device_attr attr = {
>> +        .group = KVM_S390_VM_MISC,
>> +        .attr = KVM_S390_VM_MISC_CPC,
>> +        .addr = (uint64_t)&cpc,
>> +    };
>> +
>> +    return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
>> +}
>> +
>>  /**
>>   * kvm_s390_mem_op:
>>   * @addr:      the logical start address in guest memory
>> @@ -2142,6 +2164,7 @@ static int kvm_to_feat[][2] = {
>>      { KVM_S390_VM_CPU_FEAT_PFMFI, S390_FEAT_SIE_PFMFI},
>>      { KVM_S390_VM_CPU_FEAT_SIGPIF, S390_FEAT_SIE_SIGPIF},
>>      { KVM_S390_VM_CPU_FEAT_KSS, S390_FEAT_SIE_KSS},
>> +    { KVM_S390_VM_CPU_FEAT_DIAG318, S390_FEAT_DIAG318},
>>  };
>>  
>>  static int query_cpu_feat(S390FeatBitmap features)
>> diff --git a/target/s390x/kvm_s390x.h b/target/s390x/kvm_s390x.h
>> index 6e52287..53f165f 100644
>> --- a/target/s390x/kvm_s390x.h
>> +++ b/target/s390x/kvm_s390x.h
>> @@ -29,6 +29,9 @@ int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
>>  int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
>>  int kvm_s390_set_clock(uint8_t tod_high, uint64_t tod_clock);
>>  int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_clock);
>> +int kvm_s390_get_cpc(uint64_t *cpc);
>> +int kvm_s390_set_cpc(uint64_t cpc);
>> +bool kvm_s390_has_diag318(void);
>>  void kvm_s390_enable_css_support(S390CPU *cpu);
>>  int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
>>                                      int vq, bool assign);
>>
> 
> 


-- 
Respectfully,
- Collin Walling


Re: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Cornelia Huck 11 weeks ago
On Wed, 5 Dec 2018 09:59:54 -0500
Collin Walling <walling@linux.ibm.com> wrote:

> On 12/5/18 3:29 AM, Christian Borntraeger wrote:
> > You should clearly review your email list.....
> > 
> > Adding the "new" Conny, removing Carsten.
> >   
> 
> Thanks for taking care of that. I'll be more careful when using the
> addresses at the top of the files. 

scripts/get_maintainer.pl -f <file> is probably more useful to get
current addresses :)

Re: [Qemu-devel] [qemu-s390x] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Collin Walling 11 weeks ago
On 12/5/18 10:22 AM, Cornelia Huck wrote:
> On Wed, 5 Dec 2018 09:59:54 -0500
> Collin Walling <walling@linux.ibm.com> wrote:
> 
>> On 12/5/18 3:29 AM, Christian Borntraeger wrote:
>>> You should clearly review your email list.....
>>>
>>> Adding the "new" Conny, removing Carsten.
>>>   
>>
>> Thanks for taking care of that. I'll be more careful when using the
>> addresses at the top of the files. 
> 
> scripts/get_maintainer.pl -f <file> is probably more useful to get
> current addresses :)
> 

I'll give it a whirl next time. I appreciate the advice! :)

-- 
Respectfully,
- Collin Walling


Re: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by David Hildenbrand 11 weeks ago
On 04.12.18 23:18, Collin Walling wrote:
> Add migration and reset support for diagnose 318. This is a new z14 GA2 
> hardware feature, but we can provide guest support starting with the 
> zEC12-full CPU model.
> 
> Because new hardware introduces a new facility-availability byte in 
> the Read SCP Info block, we lose one byte in the CPU entries list 
> and must limit the maximum VCPUs to 247 (down from 248).

This could break setups that upgrade/migrate. At least forward migration
can be broken. Do we care about that?

Can you split off

1. linux-header changes
2. CPU model changes? (introduction and definition of new feature, but
not when it is used?)

> 
> Signed-off-by: Collin Walling <walling@linux.ibm.com>
> ---
> 
> Changelog
> 
>     RFC -> v1
>         - introduced kvm stubs for set/get cpc
>         - s/fac134/byte_134
>         - moved diag318 vmstate description to diag.c
>         - reduced S390_VCPU_MAX to 247
> 
>  hw/s390x/ipl.c                  |  3 +++
>  hw/s390x/s390-virtio-ccw.c      |  3 +++
>  hw/s390x/sclp.c                 |  2 ++
>  include/hw/s390x/sclp.h         |  2 ++
>  linux-headers/asm-s390/kvm.h    |  5 ++++
>  target/s390x/cpu.h              |  2 +-
>  target/s390x/cpu_features.c     |  3 +++
>  target/s390x/cpu_features.h     |  1 +
>  target/s390x/cpu_features_def.h |  3 +++
>  target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
>  target/s390x/gen-features.c     |  1 +
>  target/s390x/internal.h         |  4 +++-
>  target/s390x/kvm-stub.c         | 10 ++++++++
>  target/s390x/kvm.c              | 23 ++++++++++++++++++
>  target/s390x/kvm_s390x.h        |  3 +++
>  15 files changed, 116 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> index 21f64ad..6e3af65 100644
> --- a/hw/s390x/ipl.c
> +++ b/hw/s390x/ipl.c
> @@ -27,6 +27,7 @@
>  #include "qemu/cutils.h"
>  #include "qemu/option.h"
>  #include "exec/exec-all.h"
> +#include "internal.h"
>  
>  #define KERN_IMAGE_START                0x010000UL
>  #define LINUX_MAGIC_ADDR                0x010008UL
> @@ -230,6 +231,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
>      ipl->compat_start_addr = ipl->start_addr;
>      ipl->compat_bios_start_addr = ipl->bios_start_addr;
>      qemu_register_reset(qdev_reset_all_fn, dev);
> +
> +    diag318_register();
>  error:
>      error_propagate(errp, err);
>  }
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index a0615a8..2c670fc 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -37,6 +37,7 @@
>  #include "cpu_models.h"
>  #include "hw/nmi.h"
>  #include "hw/s390x/tod.h"
> +#include "internal.h"
>  
>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
>  {
> @@ -357,6 +358,7 @@ static void s390_machine_reset(void)
>          }
>          subsystem_reset();
>          s390_crypto_reset();
> +        diag318_reset();
>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>          break;
>      case S390_RESET_LOAD_NORMAL:
> @@ -364,6 +366,7 @@ static void s390_machine_reset(void)
>              run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
>          }
>          subsystem_reset();
> +        diag318_reset();
>          run_on_cpu(cs, s390_do_cpu_initial_reset, RUN_ON_CPU_NULL);
>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>          break;

Why don't we have to reset this during reipl or external reset
("system_reset")?


> diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
> index 4510a80..183c627 100644
> --- a/hw/s390x/sclp.c
> +++ b/hw/s390x/sclp.c
> @@ -73,6 +73,8 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
>                           read_info->conf_char);
>      s390_get_feat_block(S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
>                           read_info->conf_char_ext);
> +    /* Read Info byte 134 */
> +    s390_get_feat_block(S390_FEAT_TYPE_SCLP_BYTE_134, read_info->byte_134);
>  
>      read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
>                                          SCLP_HAS_IOA_RECONFIG);
> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> index f9db243..eb12ba2 100644
> --- a/include/hw/s390x/sclp.h
> +++ b/include/hw/s390x/sclp.h
> @@ -133,6 +133,8 @@ typedef struct ReadInfo {
>      uint16_t highest_cpu;
>      uint8_t  _reserved5[124 - 122];     /* 122-123 */
>      uint32_t hmfai;
> +    uint8_t  _reserved7[134 - 128];     /* 128-133 */
> +    uint8_t  byte_134[1];
>      struct CPUEntry entries[0];
>  } QEMU_PACKED ReadInfo;
>  
> diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
> index 0265482..8c206d2 100644
> --- a/linux-headers/asm-s390/kvm.h
> +++ b/linux-headers/asm-s390/kvm.h
> @@ -74,6 +74,7 @@ struct kvm_s390_io_adapter_req {
>  #define KVM_S390_VM_CRYPTO		2
>  #define KVM_S390_VM_CPU_MODEL		3
>  #define KVM_S390_VM_MIGRATION		4
> +#define KVM_S390_VM_MISC		5
>  
>  /* kvm attributes for mem_ctrl */
>  #define KVM_S390_VM_MEM_ENABLE_CMMA	0
> @@ -130,6 +131,7 @@ struct kvm_s390_vm_cpu_machine {
>  #define KVM_S390_VM_CPU_FEAT_PFMFI	11
>  #define KVM_S390_VM_CPU_FEAT_SIGPIF	12
>  #define KVM_S390_VM_CPU_FEAT_KSS	13
> +#define KVM_S390_VM_CPU_FEAT_DIAG318	14
>  struct kvm_s390_vm_cpu_feat {
>  	__u64 feat[16];
>  };
> @@ -168,6 +170,9 @@ struct kvm_s390_vm_cpu_subfunc {
>  #define KVM_S390_VM_MIGRATION_START	1
>  #define KVM_S390_VM_MIGRATION_STATUS	2
>  
> +/* kvm attributes for KVM_S390_VM_MISC */
> +#define KVM_S390_VM_MISC_CPC		0
> +
>  /* for KVM_GET_REGS and KVM_SET_REGS */
>  struct kvm_regs {
>  	/* general purpose regs for s390 */
> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> index 8c2320e..594b4a4 100644
> --- a/target/s390x/cpu.h
> +++ b/target/s390x/cpu.h
> @@ -52,7 +52,7 @@
>  
>  #define MMU_USER_IDX 0
>  
> -#define S390_MAX_CPUS 248
> +#define S390_MAX_CPUS 247
>  
>  typedef struct PSW {
>      uint64_t mask;
> diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
> index 60cfeba..d05afa5 100644
> --- a/target/s390x/cpu_features.c
> +++ b/target/s390x/cpu_features.c
> @@ -121,6 +121,9 @@ static const S390FeatDef s390_features[] = {
>      FEAT_INIT("pfmfi", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 9, "SIE: PFMF interpretation facility"),
>      FEAT_INIT("ibs", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 10, "SIE: Interlock-and-broadcast-suppression facility"),
>  
> +    /* SCLP SCCB Byte 134 */
> +    FEAT_INIT("diag318", S390_FEAT_TYPE_SCLP_BYTE_134, 0, "SIE: Diagnose 318"),

Is this bit "SIE: Diagnose 318" or "SIE: SCLP Byte 14" ?

Or both?

> +
>      FEAT_INIT("sief2", S390_FEAT_TYPE_SCLP_CPU, 4, "SIE: interception format 2 (Virtual SIE)"),
>      FEAT_INIT("skey", S390_FEAT_TYPE_SCLP_CPU, 5, "SIE: Storage-key facility"),
>      FEAT_INIT("gpereh", S390_FEAT_TYPE_SCLP_CPU, 10, "SIE: Guest-PER enhancement facility"),
> diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
> index effe790..e7248df 100644
> --- a/target/s390x/cpu_features.h
> +++ b/target/s390x/cpu_features.h
> @@ -23,6 +23,7 @@ typedef enum {
>      S390_FEAT_TYPE_STFL,
>      S390_FEAT_TYPE_SCLP_CONF_CHAR,
>      S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
> +    S390_FEAT_TYPE_SCLP_BYTE_134,
>      S390_FEAT_TYPE_SCLP_CPU,
>      S390_FEAT_TYPE_MISC,
>      S390_FEAT_TYPE_PLO,
> diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h
> index 5fc7e7b..d99da1d 100644
> --- a/target/s390x/cpu_features_def.h
> +++ b/target/s390x/cpu_features_def.h
> @@ -109,6 +109,9 @@ typedef enum {
>      S390_FEAT_SIE_PFMFI,
>      S390_FEAT_SIE_IBS,
>  
> +    /* Read Info Byte 134 */
> +    S390_FEAT_DIAG318,
> +
>      /* Sclp Cpu */
>      S390_FEAT_SIE_F2,
>      S390_FEAT_SIE_SKEY,
> diff --git a/target/s390x/diag.c b/target/s390x/diag.c
> index acb0f3d..2207c08 100644
> --- a/target/s390x/diag.c
> +++ b/target/s390x/diag.c
> @@ -20,6 +20,8 @@
>  #include "sysemu/cpus.h"
>  #include "hw/s390x/ipl.h"
>  #include "hw/s390x/s390-virtio-ccw.h"
> +#include "kvm_s390x.h"
> +#include "sysemu/kvm.h"
>  
>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
>  {
> @@ -134,3 +136,54 @@ out:
>          break;
>      }
>  }
> +
> +typedef struct Diag318Data {
> +    uint64_t cpc;
> +} Diag318Data;
> +static Diag318Data diag318data;
> +
> +void diag318_reset(void)

please name this function

s390_diag318_reset()

or even (my preference, as we actually reset the CPC value)

s390_cpc_reset()

> +{
> +    if (s390_has_feat(S390_FEAT_DIAG318)) {
> +        kvm_s390_set_cpc(0);
> +    }
> +}
> +
> +static int diag318_post_load(void *opaque, int version_id)
> +{
> +    Diag318Data *d = opaque;
> +
> +    kvm_s390_set_cpc(d->cpc);
> +    return 0;
> +}
> +
> +static int diag318_pre_save(void *opaque)
> +{
> +    Diag318Data *d = opaque;
> +
> +    kvm_s390_get_cpc(&d->cpc);
> +    return 0;
> +}
> +
> +static bool diag318_needed(void *opaque)
> +{
> +    return s390_has_feat(S390_FEAT_DIAG318);
> +}
> +
> +const VMStateDescription vmstate_diag318 = {
> +    .name = "diag318",
> +    .post_load = diag318_post_load,
> +    .pre_save = diag318_pre_save,
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .needed = diag318_needed,
> +    .fields = (VMStateField[]) {
> +        VMSTATE_UINT64(cpc, Diag318Data),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> +void diag318_register(void)

That somehow does not feel right nor look nice.

This code smells like it should go into hw/s390x/ ... as it is a machine
specific property. Registering the vmstate can than be done in a nicer
way than via this function.

> +{
> +    vmstate_register(NULL, 0, &vmstate_diag318, &diag318data);
> +}
> \ No newline at end of file
> diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
> index 70015ea..a3d1457 100644
> --- a/target/s390x/gen-features.c
> +++ b/target/s390x/gen-features.c
> @@ -450,6 +450,7 @@ static uint16_t full_GEN12_GA1[] = {
>      S390_FEAT_AP_QUERY_CONFIG_INFO,
>      S390_FEAT_AP_FACILITIES_TEST,
>      S390_FEAT_AP,
> +    S390_FEAT_DIAG318,
>  };
>  
>  static uint16_t full_GEN12_GA2[] = {
> diff --git a/target/s390x/internal.h b/target/s390x/internal.h
> index f2a771e..d53b1d0 100644
> --- a/target/s390x/internal.h
> +++ b/target/s390x/internal.h
> @@ -383,10 +383,12 @@ int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw,
>                         target_ulong *addr, int *flags);
>  
>  
> -/* misc_helper.c */
> +/* diag.c */
>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
>  void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
>                       uintptr_t ra);
> +void diag318_register(void);
> +void diag318_reset(void);
>  
>  
>  /* translate.c */
> diff --git a/target/s390x/kvm-stub.c b/target/s390x/kvm-stub.c
> index bf7795e..1f0bee3 100644
> --- a/target/s390x/kvm-stub.c
> +++ b/target/s390x/kvm-stub.c
> @@ -104,3 +104,13 @@ void kvm_s390_stop_interrupt(S390CPU *cpu)
>  void kvm_s390_restart_interrupt(S390CPU *cpu)
>  {
>  }
> +
> +int kvm_s390_get_cpc(uint64_t *cpc)
> +{
> +    return 0;
> +}
> +
> +int kvm_s390_set_cpc(uint64_t cpc)
> +{
> +    return 0;
> +}
> \ No newline at end of file
> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> index 2ebf26a..9ed4cea 100644
> --- a/target/s390x/kvm.c
> +++ b/target/s390x/kvm.c
> @@ -749,6 +749,28 @@ int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_low)
>      return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
>  }
>  
> +int kvm_s390_get_cpc(uint64_t *cpc)
> +{
> +    struct kvm_device_attr attr = {
> +        .group = KVM_S390_VM_MISC,
> +        .attr = KVM_S390_VM_MISC_CPC,
> +        .addr = (uint64_t)cpc,
> +    };
> +
> +    return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
> +}
> +
> +int kvm_s390_set_cpc(uint64_t cpc)
> +{
> +    struct kvm_device_attr attr = {
> +        .group = KVM_S390_VM_MISC,
> +        .attr = KVM_S390_VM_MISC_CPC,
> +        .addr = (uint64_t)&cpc,
> +    };
> +
> +    return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
> +}
> +
>  /**
>   * kvm_s390_mem_op:
>   * @addr:      the logical start address in guest memory
> @@ -2142,6 +2164,7 @@ static int kvm_to_feat[][2] = {
>      { KVM_S390_VM_CPU_FEAT_PFMFI, S390_FEAT_SIE_PFMFI},
>      { KVM_S390_VM_CPU_FEAT_SIGPIF, S390_FEAT_SIE_SIGPIF},
>      { KVM_S390_VM_CPU_FEAT_KSS, S390_FEAT_SIE_KSS},
> +    { KVM_S390_VM_CPU_FEAT_DIAG318, S390_FEAT_DIAG318},
>  };
>  
>  static int query_cpu_feat(S390FeatBitmap features)
> diff --git a/target/s390x/kvm_s390x.h b/target/s390x/kvm_s390x.h
> index 6e52287..53f165f 100644
> --- a/target/s390x/kvm_s390x.h
> +++ b/target/s390x/kvm_s390x.h
> @@ -29,6 +29,9 @@ int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
>  int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
>  int kvm_s390_set_clock(uint8_t tod_high, uint64_t tod_clock);
>  int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_clock);
> +int kvm_s390_get_cpc(uint64_t *cpc);
> +int kvm_s390_set_cpc(uint64_t cpc);
> +bool kvm_s390_has_diag318(void);
>  void kvm_s390_enable_css_support(S390CPU *cpu);
>  int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
>                                      int vq, bool assign);
> 


-- 

Thanks,

David / dhildenb

Re: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Christian Borntraeger 11 weeks ago
On 05.12.2018 09:26, David Hildenbrand wrote:
> On 04.12.18 23:18, Collin Walling wrote:
>> Add migration and reset support for diagnose 318. This is a new z14 GA2 
>> hardware feature, but we can provide guest support starting with the 
>> zEC12-full CPU model.
>>
>> Because new hardware introduces a new facility-availability byte in 
>> the Read SCP Info block, we lose one byte in the CPU entries list 
>> and must limit the maximum VCPUs to 247 (down from 248).
> 
> This could break setups that upgrade/migrate. At least forward migration
> can be broken. Do we care about that?

Can we maybe bind this feature and the cpu limit to the 4.0 machine?
> 
> Can you split off
> 
> 1. linux-header changes
> 2. CPU model changes? (introduction and definition of new feature, but
> not when it is used?)
> 
>>
>> Signed-off-by: Collin Walling <walling@linux.ibm.com>
>> ---
>>
>> Changelog
>>
>>     RFC -> v1
>>         - introduced kvm stubs for set/get cpc
>>         - s/fac134/byte_134
>>         - moved diag318 vmstate description to diag.c
>>         - reduced S390_VCPU_MAX to 247
>>
>>  hw/s390x/ipl.c                  |  3 +++
>>  hw/s390x/s390-virtio-ccw.c      |  3 +++
>>  hw/s390x/sclp.c                 |  2 ++
>>  include/hw/s390x/sclp.h         |  2 ++
>>  linux-headers/asm-s390/kvm.h    |  5 ++++
>>  target/s390x/cpu.h              |  2 +-
>>  target/s390x/cpu_features.c     |  3 +++
>>  target/s390x/cpu_features.h     |  1 +
>>  target/s390x/cpu_features_def.h |  3 +++
>>  target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
>>  target/s390x/gen-features.c     |  1 +
>>  target/s390x/internal.h         |  4 +++-
>>  target/s390x/kvm-stub.c         | 10 ++++++++
>>  target/s390x/kvm.c              | 23 ++++++++++++++++++
>>  target/s390x/kvm_s390x.h        |  3 +++
>>  15 files changed, 116 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
>> index 21f64ad..6e3af65 100644
>> --- a/hw/s390x/ipl.c
>> +++ b/hw/s390x/ipl.c
>> @@ -27,6 +27,7 @@
>>  #include "qemu/cutils.h"
>>  #include "qemu/option.h"
>>  #include "exec/exec-all.h"
>> +#include "internal.h"
>>  
>>  #define KERN_IMAGE_START                0x010000UL
>>  #define LINUX_MAGIC_ADDR                0x010008UL
>> @@ -230,6 +231,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
>>      ipl->compat_start_addr = ipl->start_addr;
>>      ipl->compat_bios_start_addr = ipl->bios_start_addr;
>>      qemu_register_reset(qdev_reset_all_fn, dev);
>> +
>> +    diag318_register();
>>  error:
>>      error_propagate(errp, err);
>>  }
>> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
>> index a0615a8..2c670fc 100644
>> --- a/hw/s390x/s390-virtio-ccw.c
>> +++ b/hw/s390x/s390-virtio-ccw.c
>> @@ -37,6 +37,7 @@
>>  #include "cpu_models.h"
>>  #include "hw/nmi.h"
>>  #include "hw/s390x/tod.h"
>> +#include "internal.h"
>>  
>>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
>>  {
>> @@ -357,6 +358,7 @@ static void s390_machine_reset(void)
>>          }
>>          subsystem_reset();
>>          s390_crypto_reset();
>> +        diag318_reset();
>>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>>          break;
>>      case S390_RESET_LOAD_NORMAL:
>> @@ -364,6 +366,7 @@ static void s390_machine_reset(void)
>>              run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
>>          }
>>          subsystem_reset();
>> +        diag318_reset();
>>          run_on_cpu(cs, s390_do_cpu_initial_reset, RUN_ON_CPU_NULL);
>>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>>          break;
> 
> Why don't we have to reset this during reipl or external reset
> ("system_reset")?
> 
> 
>> diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
>> index 4510a80..183c627 100644
>> --- a/hw/s390x/sclp.c
>> +++ b/hw/s390x/sclp.c
>> @@ -73,6 +73,8 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
>>                           read_info->conf_char);
>>      s390_get_feat_block(S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
>>                           read_info->conf_char_ext);
>> +    /* Read Info byte 134 */
>> +    s390_get_feat_block(S390_FEAT_TYPE_SCLP_BYTE_134, read_info->byte_134);
>>  
>>      read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
>>                                          SCLP_HAS_IOA_RECONFIG);
>> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
>> index f9db243..eb12ba2 100644
>> --- a/include/hw/s390x/sclp.h
>> +++ b/include/hw/s390x/sclp.h
>> @@ -133,6 +133,8 @@ typedef struct ReadInfo {
>>      uint16_t highest_cpu;
>>      uint8_t  _reserved5[124 - 122];     /* 122-123 */
>>      uint32_t hmfai;
>> +    uint8_t  _reserved7[134 - 128];     /* 128-133 */
>> +    uint8_t  byte_134[1];
>>      struct CPUEntry entries[0];
>>  } QEMU_PACKED ReadInfo;
>>  
>> diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
>> index 0265482..8c206d2 100644
>> --- a/linux-headers/asm-s390/kvm.h
>> +++ b/linux-headers/asm-s390/kvm.h
>> @@ -74,6 +74,7 @@ struct kvm_s390_io_adapter_req {
>>  #define KVM_S390_VM_CRYPTO		2
>>  #define KVM_S390_VM_CPU_MODEL		3
>>  #define KVM_S390_VM_MIGRATION		4
>> +#define KVM_S390_VM_MISC		5
>>  
>>  /* kvm attributes for mem_ctrl */
>>  #define KVM_S390_VM_MEM_ENABLE_CMMA	0
>> @@ -130,6 +131,7 @@ struct kvm_s390_vm_cpu_machine {
>>  #define KVM_S390_VM_CPU_FEAT_PFMFI	11
>>  #define KVM_S390_VM_CPU_FEAT_SIGPIF	12
>>  #define KVM_S390_VM_CPU_FEAT_KSS	13
>> +#define KVM_S390_VM_CPU_FEAT_DIAG318	14
>>  struct kvm_s390_vm_cpu_feat {
>>  	__u64 feat[16];
>>  };
>> @@ -168,6 +170,9 @@ struct kvm_s390_vm_cpu_subfunc {
>>  #define KVM_S390_VM_MIGRATION_START	1
>>  #define KVM_S390_VM_MIGRATION_STATUS	2
>>  
>> +/* kvm attributes for KVM_S390_VM_MISC */
>> +#define KVM_S390_VM_MISC_CPC		0
>> +
>>  /* for KVM_GET_REGS and KVM_SET_REGS */
>>  struct kvm_regs {
>>  	/* general purpose regs for s390 */
>> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
>> index 8c2320e..594b4a4 100644
>> --- a/target/s390x/cpu.h
>> +++ b/target/s390x/cpu.h
>> @@ -52,7 +52,7 @@
>>  
>>  #define MMU_USER_IDX 0
>>  
>> -#define S390_MAX_CPUS 248
>> +#define S390_MAX_CPUS 247
>>  
>>  typedef struct PSW {
>>      uint64_t mask;
>> diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
>> index 60cfeba..d05afa5 100644
>> --- a/target/s390x/cpu_features.c
>> +++ b/target/s390x/cpu_features.c
>> @@ -121,6 +121,9 @@ static const S390FeatDef s390_features[] = {
>>      FEAT_INIT("pfmfi", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 9, "SIE: PFMF interpretation facility"),
>>      FEAT_INIT("ibs", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 10, "SIE: Interlock-and-broadcast-suppression facility"),
>>  
>> +    /* SCLP SCCB Byte 134 */
>> +    FEAT_INIT("diag318", S390_FEAT_TYPE_SCLP_BYTE_134, 0, "SIE: Diagnose 318"),
> 
> Is this bit "SIE: Diagnose 318" or "SIE: SCLP Byte 14" ?
> 
> Or both?
> 
>> +
>>      FEAT_INIT("sief2", S390_FEAT_TYPE_SCLP_CPU, 4, "SIE: interception format 2 (Virtual SIE)"),
>>      FEAT_INIT("skey", S390_FEAT_TYPE_SCLP_CPU, 5, "SIE: Storage-key facility"),
>>      FEAT_INIT("gpereh", S390_FEAT_TYPE_SCLP_CPU, 10, "SIE: Guest-PER enhancement facility"),
>> diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
>> index effe790..e7248df 100644
>> --- a/target/s390x/cpu_features.h
>> +++ b/target/s390x/cpu_features.h
>> @@ -23,6 +23,7 @@ typedef enum {
>>      S390_FEAT_TYPE_STFL,
>>      S390_FEAT_TYPE_SCLP_CONF_CHAR,
>>      S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
>> +    S390_FEAT_TYPE_SCLP_BYTE_134,
>>      S390_FEAT_TYPE_SCLP_CPU,
>>      S390_FEAT_TYPE_MISC,
>>      S390_FEAT_TYPE_PLO,
>> diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h
>> index 5fc7e7b..d99da1d 100644
>> --- a/target/s390x/cpu_features_def.h
>> +++ b/target/s390x/cpu_features_def.h
>> @@ -109,6 +109,9 @@ typedef enum {
>>      S390_FEAT_SIE_PFMFI,
>>      S390_FEAT_SIE_IBS,
>>  
>> +    /* Read Info Byte 134 */
>> +    S390_FEAT_DIAG318,
>> +
>>      /* Sclp Cpu */
>>      S390_FEAT_SIE_F2,
>>      S390_FEAT_SIE_SKEY,
>> diff --git a/target/s390x/diag.c b/target/s390x/diag.c
>> index acb0f3d..2207c08 100644
>> --- a/target/s390x/diag.c
>> +++ b/target/s390x/diag.c
>> @@ -20,6 +20,8 @@
>>  #include "sysemu/cpus.h"
>>  #include "hw/s390x/ipl.h"
>>  #include "hw/s390x/s390-virtio-ccw.h"
>> +#include "kvm_s390x.h"
>> +#include "sysemu/kvm.h"
>>  
>>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
>>  {
>> @@ -134,3 +136,54 @@ out:
>>          break;
>>      }
>>  }
>> +
>> +typedef struct Diag318Data {
>> +    uint64_t cpc;
>> +} Diag318Data;
>> +static Diag318Data diag318data;
>> +
>> +void diag318_reset(void)
> 
> please name this function
> 
> s390_diag318_reset()
> 
> or even (my preference, as we actually reset the CPC value)
> 
> s390_cpc_reset()
> 
>> +{
>> +    if (s390_has_feat(S390_FEAT_DIAG318)) {
>> +        kvm_s390_set_cpc(0);
>> +    }
>> +}
>> +
>> +static int diag318_post_load(void *opaque, int version_id)
>> +{
>> +    Diag318Data *d = opaque;
>> +
>> +    kvm_s390_set_cpc(d->cpc);
>> +    return 0;
>> +}
>> +
>> +static int diag318_pre_save(void *opaque)
>> +{
>> +    Diag318Data *d = opaque;
>> +
>> +    kvm_s390_get_cpc(&d->cpc);
>> +    return 0;
>> +}
>> +
>> +static bool diag318_needed(void *opaque)
>> +{
>> +    return s390_has_feat(S390_FEAT_DIAG318);
>> +}
>> +
>> +const VMStateDescription vmstate_diag318 = {
>> +    .name = "diag318",
>> +    .post_load = diag318_post_load,
>> +    .pre_save = diag318_pre_save,
>> +    .version_id = 1,
>> +    .minimum_version_id = 1,
>> +    .needed = diag318_needed,
>> +    .fields = (VMStateField[]) {
>> +        VMSTATE_UINT64(cpc, Diag318Data),
>> +        VMSTATE_END_OF_LIST()
>> +    }
>> +};
>> +
>> +void diag318_register(void)
> 
> That somehow does not feel right nor look nice.
> 
> This code smells like it should go into hw/s390x/ ... as it is a machine
> specific property. Registering the vmstate can than be done in a nicer
> way than via this function.
> 
>> +{
>> +    vmstate_register(NULL, 0, &vmstate_diag318, &diag318data);
>> +}
>> \ No newline at end of file
>> diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
>> index 70015ea..a3d1457 100644
>> --- a/target/s390x/gen-features.c
>> +++ b/target/s390x/gen-features.c
>> @@ -450,6 +450,7 @@ static uint16_t full_GEN12_GA1[] = {
>>      S390_FEAT_AP_QUERY_CONFIG_INFO,
>>      S390_FEAT_AP_FACILITIES_TEST,
>>      S390_FEAT_AP,
>> +    S390_FEAT_DIAG318,
>>  };
>>  
>>  static uint16_t full_GEN12_GA2[] = {
>> diff --git a/target/s390x/internal.h b/target/s390x/internal.h
>> index f2a771e..d53b1d0 100644
>> --- a/target/s390x/internal.h
>> +++ b/target/s390x/internal.h
>> @@ -383,10 +383,12 @@ int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw,
>>                         target_ulong *addr, int *flags);
>>  
>>  
>> -/* misc_helper.c */
>> +/* diag.c */
>>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
>>  void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
>>                       uintptr_t ra);
>> +void diag318_register(void);
>> +void diag318_reset(void);
>>  
>>  
>>  /* translate.c */
>> diff --git a/target/s390x/kvm-stub.c b/target/s390x/kvm-stub.c
>> index bf7795e..1f0bee3 100644
>> --- a/target/s390x/kvm-stub.c
>> +++ b/target/s390x/kvm-stub.c
>> @@ -104,3 +104,13 @@ void kvm_s390_stop_interrupt(S390CPU *cpu)
>>  void kvm_s390_restart_interrupt(S390CPU *cpu)
>>  {
>>  }
>> +
>> +int kvm_s390_get_cpc(uint64_t *cpc)
>> +{
>> +    return 0;
>> +}
>> +
>> +int kvm_s390_set_cpc(uint64_t cpc)
>> +{
>> +    return 0;
>> +}
>> \ No newline at end of file
>> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
>> index 2ebf26a..9ed4cea 100644
>> --- a/target/s390x/kvm.c
>> +++ b/target/s390x/kvm.c
>> @@ -749,6 +749,28 @@ int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_low)
>>      return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
>>  }
>>  
>> +int kvm_s390_get_cpc(uint64_t *cpc)
>> +{
>> +    struct kvm_device_attr attr = {
>> +        .group = KVM_S390_VM_MISC,
>> +        .attr = KVM_S390_VM_MISC_CPC,
>> +        .addr = (uint64_t)cpc,
>> +    };
>> +
>> +    return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
>> +}
>> +
>> +int kvm_s390_set_cpc(uint64_t cpc)
>> +{
>> +    struct kvm_device_attr attr = {
>> +        .group = KVM_S390_VM_MISC,
>> +        .attr = KVM_S390_VM_MISC_CPC,
>> +        .addr = (uint64_t)&cpc,
>> +    };
>> +
>> +    return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
>> +}
>> +
>>  /**
>>   * kvm_s390_mem_op:
>>   * @addr:      the logical start address in guest memory
>> @@ -2142,6 +2164,7 @@ static int kvm_to_feat[][2] = {
>>      { KVM_S390_VM_CPU_FEAT_PFMFI, S390_FEAT_SIE_PFMFI},
>>      { KVM_S390_VM_CPU_FEAT_SIGPIF, S390_FEAT_SIE_SIGPIF},
>>      { KVM_S390_VM_CPU_FEAT_KSS, S390_FEAT_SIE_KSS},
>> +    { KVM_S390_VM_CPU_FEAT_DIAG318, S390_FEAT_DIAG318},
>>  };
>>  
>>  static int query_cpu_feat(S390FeatBitmap features)
>> diff --git a/target/s390x/kvm_s390x.h b/target/s390x/kvm_s390x.h
>> index 6e52287..53f165f 100644
>> --- a/target/s390x/kvm_s390x.h
>> +++ b/target/s390x/kvm_s390x.h
>> @@ -29,6 +29,9 @@ int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
>>  int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
>>  int kvm_s390_set_clock(uint8_t tod_high, uint64_t tod_clock);
>>  int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_clock);
>> +int kvm_s390_get_cpc(uint64_t *cpc);
>> +int kvm_s390_set_cpc(uint64_t cpc);
>> +bool kvm_s390_has_diag318(void);
>>  void kvm_s390_enable_css_support(S390CPU *cpu);
>>  int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
>>                                      int vq, bool assign);
>>
> 
> 


Re: [Qemu-devel] [qemu-s390x] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Cornelia Huck 11 weeks ago
On Wed, 5 Dec 2018 09:27:44 +0100
Christian Borntraeger <borntraeger@de.ibm.com> wrote:

> On 05.12.2018 09:26, David Hildenbrand wrote:
> > On 04.12.18 23:18, Collin Walling wrote:  
> >> Add migration and reset support for diagnose 318. This is a new z14 GA2 
> >> hardware feature, but we can provide guest support starting with the 
> >> zEC12-full CPU model.
> >>
> >> Because new hardware introduces a new facility-availability byte in 
> >> the Read SCP Info block, we lose one byte in the CPU entries list 
> >> and must limit the maximum VCPUs to 247 (down from 248).  
> > 
> > This could break setups that upgrade/migrate. At least forward migration
> > can be broken. Do we care about that?  
> 
> Can we maybe bind this feature and the cpu limit to the 4.0 machine?

I think that would make sense.

> > 
> > Can you split off
> > 
> > 1. linux-header changes
> > 2. CPU model changes? (introduction and definition of new feature, but
> > not when it is used?)
> >   
> >>
> >> Signed-off-by: Collin Walling <walling@linux.ibm.com>
> >> ---

Re: [Qemu-devel] [qemu-s390x] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by David Hildenbrand 11 weeks ago
On 05.12.18 12:54, Cornelia Huck wrote:
> On Wed, 5 Dec 2018 09:27:44 +0100
> Christian Borntraeger <borntraeger@de.ibm.com> wrote:
> 
>> On 05.12.2018 09:26, David Hildenbrand wrote:
>>> On 04.12.18 23:18, Collin Walling wrote:  
>>>> Add migration and reset support for diagnose 318. This is a new z14 GA2 
>>>> hardware feature, but we can provide guest support starting with the 
>>>> zEC12-full CPU model.
>>>>
>>>> Because new hardware introduces a new facility-availability byte in 
>>>> the Read SCP Info block, we lose one byte in the CPU entries list 
>>>> and must limit the maximum VCPUs to 247 (down from 248).  
>>>
>>> This could break setups that upgrade/migrate. At least forward migration
>>> can be broken. Do we care about that?  
>>
>> Can we maybe bind this feature and the cpu limit to the 4.0 machine?
> 
> I think that would make sense.

Won't be that easy, as we'll have different sizes of the struct size.
Something that might uglify the code quite a bit.

Also we'll get a dependence between the cpu model features (e.g. probed
via the NULL machine) and the compat machine. Have to think about this.

> 
>>>
>>> Can you split off
>>>
>>> 1. linux-header changes
>>> 2. CPU model changes? (introduction and definition of new feature, but
>>> not when it is used?)
>>>   
>>>>
>>>> Signed-off-by: Collin Walling <walling@linux.ibm.com>
>>>> ---


-- 

Thanks,

David / dhildenb

Re: [Qemu-devel] [qemu-s390x] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Collin Walling 11 weeks ago
On 12/5/18 6:57 AM, David Hildenbrand wrote:
> On 05.12.18 12:54, Cornelia Huck wrote:
>> On Wed, 5 Dec 2018 09:27:44 +0100
>> Christian Borntraeger <borntraeger@de.ibm.com> wrote:
>>
>>> On 05.12.2018 09:26, David Hildenbrand wrote:
>>>> On 04.12.18 23:18, Collin Walling wrote:  
>>>>> Add migration and reset support for diagnose 318. This is a new z14 GA2 
>>>>> hardware feature, but we can provide guest support starting with the 
>>>>> zEC12-full CPU model.
>>>>>
>>>>> Because new hardware introduces a new facility-availability byte in 
>>>>> the Read SCP Info block, we lose one byte in the CPU entries list 
>>>>> and must limit the maximum VCPUs to 247 (down from 248).  
>>>>
>>>> This could break setups that upgrade/migrate. At least forward migration
>>>> can be broken. Do we care about that?  
>>>
>>> Can we maybe bind this feature and the cpu limit to the 4.0 machine?
>>
>> I think that would make sense.
> 
> Won't be that easy, as we'll have different sizes of the struct size.
> Something that might uglify the code quite a bit.
> 
> Also we'll get a dependence between the cpu model features (e.g. probed
> via the NULL machine) and the compat machine. Have to think about this.
> 

Are you referring to the struct CPUS390XState? Could we get away by adding
a one-byte "unused" field after the bitmap?

>>
>>>>
>>>> Can you split off
>>>>
>>>> 1. linux-header changes
>>>> 2. CPU model changes? (introduction and definition of new feature, but
>>>> not when it is used?)
>>>>   
>>>>>
>>>>> Signed-off-by: Collin Walling <walling@linux.ibm.com>
>>>>> ---
> 
> 

I'll split the patches into:

1) linux-header changes
2) CPU model changes
3) diag318 usages / migration

-- 
Respectfully,
- Collin Walling


Re: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by no-reply@patchew.org 11 weeks ago
Patchew URL: https://patchew.org/QEMU/1543961939-2419-1-git-send-email-walling@linux.ibm.com/



Hi,

This series seems to have some coding style problems. See output below for
more information:

Type: series
Subject: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247
Message-id: 1543961939-2419-1-git-send-email-walling@linux.ibm.com

=== TEST SCRIPT BEGIN ===
#!/bin/bash

BASE=base
n=1
total=$(git log --oneline $BASE.. | wc -l)
failed=0

git config --local diff.renamelimit 0
git config --local diff.renames True
git config --local diff.algorithm histogram

commits="$(git log --format=%H --reverse $BASE..)"
for c in $commits; do
    echo "Checking PATCH $n/$total: $(git log -n 1 --format=%s $c)..."
    if ! git show $c --format=email | ./scripts/checkpatch.pl --mailback -; then
        failed=1
        echo
    fi
    n=$((n+1))
done

exit $failed
=== TEST SCRIPT END ===

Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
Switched to a new branch 'test'
b5218a7 s390: guest support for diagnose 318 and limit max VCPUs to 247

=== OUTPUT BEGIN ===
Checking PATCH 1/1: s390: guest support for diagnose 318 and limit max VCPUs to 247...
ERROR: adding a line without newline at end of file
#243: FILE: target/s390x/diag.c:189:
+}

ERROR: adding a line without newline at end of file
#292: FILE: target/s390x/kvm-stub.c:116:
+}

total: 2 errors, 0 warnings, 247 lines checked

Your patch has style problems, please review.  If any of these errors
are false positives report them to the maintainer, see
CHECKPATCH in MAINTAINERS.

=== OUTPUT END ===

Test command exited with code: 1


The full log is available at
http://patchew.org/logs/1543961939-2419-1-git-send-email-walling@linux.ibm.com/testing.checkpatch/?type=message.
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@redhat.com

Re: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Collin Walling 11 weeks ago
I screen-scraped the @ibm address again (Conny was the victim this time)

Reply to this thread to avoid any delivery failures.

On 12/4/18 5:18 PM, Collin Walling wrote:
> Add migration and reset support for diagnose 318. This is a new z14 GA2 
> hardware feature, but we can provide guest support starting with the 
> zEC12-full CPU model.
> 
> Because new hardware introduces a new facility-availability byte in 
> the Read SCP Info block, we lose one byte in the CPU entries list 
> and must limit the maximum VCPUs to 247 (down from 248).
> 
> Signed-off-by: Collin Walling <walling@linux.ibm.com>
> ---
> 
> Changelog
> 
>     RFC -> v1
>         - introduced kvm stubs for set/get cpc
>         - s/fac134/byte_134
>         - moved diag318 vmstate description to diag.c
>         - reduced S390_VCPU_MAX to 247
> 
>  hw/s390x/ipl.c                  |  3 +++
>  hw/s390x/s390-virtio-ccw.c      |  3 +++
>  hw/s390x/sclp.c                 |  2 ++
>  include/hw/s390x/sclp.h         |  2 ++
>  linux-headers/asm-s390/kvm.h    |  5 ++++
>  target/s390x/cpu.h              |  2 +-
>  target/s390x/cpu_features.c     |  3 +++
>  target/s390x/cpu_features.h     |  1 +
>  target/s390x/cpu_features_def.h |  3 +++
>  target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
>  target/s390x/gen-features.c     |  1 +
>  target/s390x/internal.h         |  4 +++-
>  target/s390x/kvm-stub.c         | 10 ++++++++
>  target/s390x/kvm.c              | 23 ++++++++++++++++++
>  target/s390x/kvm_s390x.h        |  3 +++
>  15 files changed, 116 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
> index 21f64ad..6e3af65 100644
> --- a/hw/s390x/ipl.c
> +++ b/hw/s390x/ipl.c
> @@ -27,6 +27,7 @@
>  #include "qemu/cutils.h"
>  #include "qemu/option.h"
>  #include "exec/exec-all.h"
> +#include "internal.h"
>  
>  #define KERN_IMAGE_START                0x010000UL
>  #define LINUX_MAGIC_ADDR                0x010008UL
> @@ -230,6 +231,8 @@ static void s390_ipl_realize(DeviceState *dev, Error **errp)
>      ipl->compat_start_addr = ipl->start_addr;
>      ipl->compat_bios_start_addr = ipl->bios_start_addr;
>      qemu_register_reset(qdev_reset_all_fn, dev);
> +
> +    diag318_register();
>  error:
>      error_propagate(errp, err);
>  }
> diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> index a0615a8..2c670fc 100644
> --- a/hw/s390x/s390-virtio-ccw.c
> +++ b/hw/s390x/s390-virtio-ccw.c
> @@ -37,6 +37,7 @@
>  #include "cpu_models.h"
>  #include "hw/nmi.h"
>  #include "hw/s390x/tod.h"
> +#include "internal.h"
>  
>  S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
>  {
> @@ -357,6 +358,7 @@ static void s390_machine_reset(void)
>          }
>          subsystem_reset();
>          s390_crypto_reset();
> +        diag318_reset();
>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>          break;
>      case S390_RESET_LOAD_NORMAL:
> @@ -364,6 +366,7 @@ static void s390_machine_reset(void)
>              run_on_cpu(t, s390_do_cpu_reset, RUN_ON_CPU_NULL);
>          }
>          subsystem_reset();
> +        diag318_reset();
>          run_on_cpu(cs, s390_do_cpu_initial_reset, RUN_ON_CPU_NULL);
>          run_on_cpu(cs, s390_do_cpu_load_normal, RUN_ON_CPU_NULL);
>          break;
> diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c
> index 4510a80..183c627 100644
> --- a/hw/s390x/sclp.c
> +++ b/hw/s390x/sclp.c
> @@ -73,6 +73,8 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb)
>                           read_info->conf_char);
>      s390_get_feat_block(S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
>                           read_info->conf_char_ext);
> +    /* Read Info byte 134 */
> +    s390_get_feat_block(S390_FEAT_TYPE_SCLP_BYTE_134, read_info->byte_134);
>  
>      read_info->facilities = cpu_to_be64(SCLP_HAS_CPU_INFO |
>                                          SCLP_HAS_IOA_RECONFIG);
> diff --git a/include/hw/s390x/sclp.h b/include/hw/s390x/sclp.h
> index f9db243..eb12ba2 100644
> --- a/include/hw/s390x/sclp.h
> +++ b/include/hw/s390x/sclp.h
> @@ -133,6 +133,8 @@ typedef struct ReadInfo {
>      uint16_t highest_cpu;
>      uint8_t  _reserved5[124 - 122];     /* 122-123 */
>      uint32_t hmfai;
> +    uint8_t  _reserved7[134 - 128];     /* 128-133 */
> +    uint8_t  byte_134[1];
>      struct CPUEntry entries[0];
>  } QEMU_PACKED ReadInfo;
>  
> diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
> index 0265482..8c206d2 100644
> --- a/linux-headers/asm-s390/kvm.h
> +++ b/linux-headers/asm-s390/kvm.h
> @@ -74,6 +74,7 @@ struct kvm_s390_io_adapter_req {
>  #define KVM_S390_VM_CRYPTO		2
>  #define KVM_S390_VM_CPU_MODEL		3
>  #define KVM_S390_VM_MIGRATION		4
> +#define KVM_S390_VM_MISC		5
>  
>  /* kvm attributes for mem_ctrl */
>  #define KVM_S390_VM_MEM_ENABLE_CMMA	0
> @@ -130,6 +131,7 @@ struct kvm_s390_vm_cpu_machine {
>  #define KVM_S390_VM_CPU_FEAT_PFMFI	11
>  #define KVM_S390_VM_CPU_FEAT_SIGPIF	12
>  #define KVM_S390_VM_CPU_FEAT_KSS	13
> +#define KVM_S390_VM_CPU_FEAT_DIAG318	14
>  struct kvm_s390_vm_cpu_feat {
>  	__u64 feat[16];
>  };
> @@ -168,6 +170,9 @@ struct kvm_s390_vm_cpu_subfunc {
>  #define KVM_S390_VM_MIGRATION_START	1
>  #define KVM_S390_VM_MIGRATION_STATUS	2
>  
> +/* kvm attributes for KVM_S390_VM_MISC */
> +#define KVM_S390_VM_MISC_CPC		0
> +
>  /* for KVM_GET_REGS and KVM_SET_REGS */
>  struct kvm_regs {
>  	/* general purpose regs for s390 */
> diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
> index 8c2320e..594b4a4 100644
> --- a/target/s390x/cpu.h
> +++ b/target/s390x/cpu.h
> @@ -52,7 +52,7 @@
>  
>  #define MMU_USER_IDX 0
>  
> -#define S390_MAX_CPUS 248
> +#define S390_MAX_CPUS 247
>  
>  typedef struct PSW {
>      uint64_t mask;
> diff --git a/target/s390x/cpu_features.c b/target/s390x/cpu_features.c
> index 60cfeba..d05afa5 100644
> --- a/target/s390x/cpu_features.c
> +++ b/target/s390x/cpu_features.c
> @@ -121,6 +121,9 @@ static const S390FeatDef s390_features[] = {
>      FEAT_INIT("pfmfi", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 9, "SIE: PFMF interpretation facility"),
>      FEAT_INIT("ibs", S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT, 10, "SIE: Interlock-and-broadcast-suppression facility"),
>  
> +    /* SCLP SCCB Byte 134 */
> +    FEAT_INIT("diag318", S390_FEAT_TYPE_SCLP_BYTE_134, 0, "SIE: Diagnose 318"),
> +
>      FEAT_INIT("sief2", S390_FEAT_TYPE_SCLP_CPU, 4, "SIE: interception format 2 (Virtual SIE)"),
>      FEAT_INIT("skey", S390_FEAT_TYPE_SCLP_CPU, 5, "SIE: Storage-key facility"),
>      FEAT_INIT("gpereh", S390_FEAT_TYPE_SCLP_CPU, 10, "SIE: Guest-PER enhancement facility"),
> diff --git a/target/s390x/cpu_features.h b/target/s390x/cpu_features.h
> index effe790..e7248df 100644
> --- a/target/s390x/cpu_features.h
> +++ b/target/s390x/cpu_features.h
> @@ -23,6 +23,7 @@ typedef enum {
>      S390_FEAT_TYPE_STFL,
>      S390_FEAT_TYPE_SCLP_CONF_CHAR,
>      S390_FEAT_TYPE_SCLP_CONF_CHAR_EXT,
> +    S390_FEAT_TYPE_SCLP_BYTE_134,
>      S390_FEAT_TYPE_SCLP_CPU,
>      S390_FEAT_TYPE_MISC,
>      S390_FEAT_TYPE_PLO,
> diff --git a/target/s390x/cpu_features_def.h b/target/s390x/cpu_features_def.h
> index 5fc7e7b..d99da1d 100644
> --- a/target/s390x/cpu_features_def.h
> +++ b/target/s390x/cpu_features_def.h
> @@ -109,6 +109,9 @@ typedef enum {
>      S390_FEAT_SIE_PFMFI,
>      S390_FEAT_SIE_IBS,
>  
> +    /* Read Info Byte 134 */
> +    S390_FEAT_DIAG318,
> +
>      /* Sclp Cpu */
>      S390_FEAT_SIE_F2,
>      S390_FEAT_SIE_SKEY,
> diff --git a/target/s390x/diag.c b/target/s390x/diag.c
> index acb0f3d..2207c08 100644
> --- a/target/s390x/diag.c
> +++ b/target/s390x/diag.c
> @@ -20,6 +20,8 @@
>  #include "sysemu/cpus.h"
>  #include "hw/s390x/ipl.h"
>  #include "hw/s390x/s390-virtio-ccw.h"
> +#include "kvm_s390x.h"
> +#include "sysemu/kvm.h"
>  
>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3)
>  {
> @@ -134,3 +136,54 @@ out:
>          break;
>      }
>  }
> +
> +typedef struct Diag318Data {
> +    uint64_t cpc;
> +} Diag318Data;
> +static Diag318Data diag318data;
> +
> +void diag318_reset(void)
> +{
> +    if (s390_has_feat(S390_FEAT_DIAG318)) {
> +        kvm_s390_set_cpc(0);
> +    }
> +}
> +
> +static int diag318_post_load(void *opaque, int version_id)
> +{
> +    Diag318Data *d = opaque;
> +
> +    kvm_s390_set_cpc(d->cpc);
> +    return 0;
> +}
> +
> +static int diag318_pre_save(void *opaque)
> +{
> +    Diag318Data *d = opaque;
> +
> +    kvm_s390_get_cpc(&d->cpc);
> +    return 0;
> +}
> +
> +static bool diag318_needed(void *opaque)
> +{
> +    return s390_has_feat(S390_FEAT_DIAG318);
> +}
> +
> +const VMStateDescription vmstate_diag318 = {
> +    .name = "diag318",
> +    .post_load = diag318_post_load,
> +    .pre_save = diag318_pre_save,
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .needed = diag318_needed,
> +    .fields = (VMStateField[]) {
> +        VMSTATE_UINT64(cpc, Diag318Data),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> +void diag318_register(void)
> +{
> +    vmstate_register(NULL, 0, &vmstate_diag318, &diag318data);
> +}
> \ No newline at end of file
> diff --git a/target/s390x/gen-features.c b/target/s390x/gen-features.c
> index 70015ea..a3d1457 100644
> --- a/target/s390x/gen-features.c
> +++ b/target/s390x/gen-features.c
> @@ -450,6 +450,7 @@ static uint16_t full_GEN12_GA1[] = {
>      S390_FEAT_AP_QUERY_CONFIG_INFO,
>      S390_FEAT_AP_FACILITIES_TEST,
>      S390_FEAT_AP,
> +    S390_FEAT_DIAG318,
>  };
>  
>  static uint16_t full_GEN12_GA2[] = {
> diff --git a/target/s390x/internal.h b/target/s390x/internal.h
> index f2a771e..d53b1d0 100644
> --- a/target/s390x/internal.h
> +++ b/target/s390x/internal.h
> @@ -383,10 +383,12 @@ int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw,
>                         target_ulong *addr, int *flags);
>  
>  
> -/* misc_helper.c */
> +/* diag.c */
>  int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
>  void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
>                       uintptr_t ra);
> +void diag318_register(void);
> +void diag318_reset(void);
>  
>  
>  /* translate.c */
> diff --git a/target/s390x/kvm-stub.c b/target/s390x/kvm-stub.c
> index bf7795e..1f0bee3 100644
> --- a/target/s390x/kvm-stub.c
> +++ b/target/s390x/kvm-stub.c
> @@ -104,3 +104,13 @@ void kvm_s390_stop_interrupt(S390CPU *cpu)
>  void kvm_s390_restart_interrupt(S390CPU *cpu)
>  {
>  }
> +
> +int kvm_s390_get_cpc(uint64_t *cpc)
> +{
> +    return 0;
> +}
> +
> +int kvm_s390_set_cpc(uint64_t cpc)
> +{
> +    return 0;
> +}
> \ No newline at end of file
> diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c
> index 2ebf26a..9ed4cea 100644
> --- a/target/s390x/kvm.c
> +++ b/target/s390x/kvm.c
> @@ -749,6 +749,28 @@ int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_low)
>      return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
>  }
>  
> +int kvm_s390_get_cpc(uint64_t *cpc)
> +{
> +    struct kvm_device_attr attr = {
> +        .group = KVM_S390_VM_MISC,
> +        .attr = KVM_S390_VM_MISC_CPC,
> +        .addr = (uint64_t)cpc,
> +    };
> +
> +    return kvm_vm_ioctl(kvm_state, KVM_GET_DEVICE_ATTR, &attr);
> +}
> +
> +int kvm_s390_set_cpc(uint64_t cpc)
> +{
> +    struct kvm_device_attr attr = {
> +        .group = KVM_S390_VM_MISC,
> +        .attr = KVM_S390_VM_MISC_CPC,
> +        .addr = (uint64_t)&cpc,
> +    };
> +
> +    return kvm_vm_ioctl(kvm_state, KVM_SET_DEVICE_ATTR, &attr);
> +}
> +
>  /**
>   * kvm_s390_mem_op:
>   * @addr:      the logical start address in guest memory
> @@ -2142,6 +2164,7 @@ static int kvm_to_feat[][2] = {
>      { KVM_S390_VM_CPU_FEAT_PFMFI, S390_FEAT_SIE_PFMFI},
>      { KVM_S390_VM_CPU_FEAT_SIGPIF, S390_FEAT_SIE_SIGPIF},
>      { KVM_S390_VM_CPU_FEAT_KSS, S390_FEAT_SIE_KSS},
> +    { KVM_S390_VM_CPU_FEAT_DIAG318, S390_FEAT_DIAG318},
>  };
>  
>  static int query_cpu_feat(S390FeatBitmap features)
> diff --git a/target/s390x/kvm_s390x.h b/target/s390x/kvm_s390x.h
> index 6e52287..53f165f 100644
> --- a/target/s390x/kvm_s390x.h
> +++ b/target/s390x/kvm_s390x.h
> @@ -29,6 +29,9 @@ int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
>  int kvm_s390_get_clock_ext(uint8_t *tod_high, uint64_t *tod_clock);
>  int kvm_s390_set_clock(uint8_t tod_high, uint64_t tod_clock);
>  int kvm_s390_set_clock_ext(uint8_t tod_high, uint64_t tod_clock);
> +int kvm_s390_get_cpc(uint64_t *cpc);
> +int kvm_s390_set_cpc(uint64_t cpc);
> +bool kvm_s390_has_diag318(void);
>  void kvm_s390_enable_css_support(S390CPU *cpu);
>  int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
>                                      int vq, bool assign);
> 


-- 
Respectfully,
- Collin Walling


Re: [Qemu-devel] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Cornelia Huck 11 weeks ago
On Tue, 4 Dec 2018 17:26:36 -0500
Collin Walling <walling@linux.ibm.com> wrote:

> I screen-scraped the @ibm address again (Conny was the victim this time)
> 
> Reply to this thread to avoid any delivery failures.
> 
> On 12/4/18 5:18 PM, Collin Walling wrote:
> > Add migration and reset support for diagnose 318. This is a new z14 GA2 
> > hardware feature, but we can provide guest support starting with the 
> > zEC12-full CPU model.
> > 
> > Because new hardware introduces a new facility-availability byte in 
> > the Read SCP Info block, we lose one byte in the CPU entries list 
> > and must limit the maximum VCPUs to 247 (down from 248).
> > 
> > Signed-off-by: Collin Walling <walling@linux.ibm.com>
> > ---
> > 
> > Changelog
> > 
> >     RFC -> v1
> >         - introduced kvm stubs for set/get cpc
> >         - s/fac134/byte_134
> >         - moved diag318 vmstate description to diag.c
> >         - reduced S390_VCPU_MAX to 247
> > 
> >  hw/s390x/ipl.c                  |  3 +++
> >  hw/s390x/s390-virtio-ccw.c      |  3 +++
> >  hw/s390x/sclp.c                 |  2 ++
> >  include/hw/s390x/sclp.h         |  2 ++
> >  linux-headers/asm-s390/kvm.h    |  5 ++++
> >  target/s390x/cpu.h              |  2 +-
> >  target/s390x/cpu_features.c     |  3 +++
> >  target/s390x/cpu_features.h     |  1 +
> >  target/s390x/cpu_features_def.h |  3 +++
> >  target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
> >  target/s390x/gen-features.c     |  1 +
> >  target/s390x/internal.h         |  4 +++-
> >  target/s390x/kvm-stub.c         | 10 ++++++++
> >  target/s390x/kvm.c              | 23 ++++++++++++++++++
> >  target/s390x/kvm_s390x.h        |  3 +++
> >  15 files changed, 116 insertions(+), 2 deletions(-)

> > diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
> > index 0265482..8c206d2 100644
> > --- a/linux-headers/asm-s390/kvm.h
> > +++ b/linux-headers/asm-s390/kvm.h

Please split this out into a dummy headers update patch, which will be
replaced with a real headers update when applied.


Re: [Qemu-devel] [qemu-s390x] [PATCH v1] s390: guest support for diagnose 318 and limit max VCPUs to 247

Posted by Collin Walling 11 weeks ago
On 12/5/18 6:07 AM, Cornelia Huck wrote:
> On Tue, 4 Dec 2018 17:26:36 -0500
> Collin Walling <walling@linux.ibm.com> wrote:
> 
>> I screen-scraped the @ibm address again (Conny was the victim this time)
>>
>> Reply to this thread to avoid any delivery failures.
>>
>> On 12/4/18 5:18 PM, Collin Walling wrote:
>>> Add migration and reset support for diagnose 318. This is a new z14 GA2 
>>> hardware feature, but we can provide guest support starting with the 
>>> zEC12-full CPU model.
>>>
>>> Because new hardware introduces a new facility-availability byte in 
>>> the Read SCP Info block, we lose one byte in the CPU entries list 
>>> and must limit the maximum VCPUs to 247 (down from 248).
>>>
>>> Signed-off-by: Collin Walling <walling@linux.ibm.com>
>>> ---
>>>
>>> Changelog
>>>
>>>     RFC -> v1
>>>         - introduced kvm stubs for set/get cpc
>>>         - s/fac134/byte_134
>>>         - moved diag318 vmstate description to diag.c
>>>         - reduced S390_VCPU_MAX to 247
>>>
>>>  hw/s390x/ipl.c                  |  3 +++
>>>  hw/s390x/s390-virtio-ccw.c      |  3 +++
>>>  hw/s390x/sclp.c                 |  2 ++
>>>  include/hw/s390x/sclp.h         |  2 ++
>>>  linux-headers/asm-s390/kvm.h    |  5 ++++
>>>  target/s390x/cpu.h              |  2 +-
>>>  target/s390x/cpu_features.c     |  3 +++
>>>  target/s390x/cpu_features.h     |  1 +
>>>  target/s390x/cpu_features_def.h |  3 +++
>>>  target/s390x/diag.c             | 53 +++++++++++++++++++++++++++++++++++++++++
>>>  target/s390x/gen-features.c     |  1 +
>>>  target/s390x/internal.h         |  4 +++-
>>>  target/s390x/kvm-stub.c         | 10 ++++++++
>>>  target/s390x/kvm.c              | 23 ++++++++++++++++++
>>>  target/s390x/kvm_s390x.h        |  3 +++
>>>  15 files changed, 116 insertions(+), 2 deletions(-)
> 
>>> diff --git a/linux-headers/asm-s390/kvm.h b/linux-headers/asm-s390/kvm.h
>>> index 0265482..8c206d2 100644
>>> --- a/linux-headers/asm-s390/kvm.h
>>> +++ b/linux-headers/asm-s390/kvm.h
> 
> Please split this out into a dummy headers update patch, which will be
> replaced with a real headers update when applied.
> 
> 

Will do.

-- 
Respectfully,
- Collin Walling