Message ID | 20200331110123.3774-1-frankja@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] s390x: kvm: Fix number of cpu reports for stsi 3.2.2 | expand |
On Tue, 31 Mar 2020 07:01:23 -0400 Janosch Frank <frankja@linux.ibm.com> wrote: > The cpu number reporting is handled by KVM and QEMU only fills in the > VM name, uuid and other values. > > Unfortunately KVM doesn't report reserved cpus and doesn't even know > they exist until the are created via the ioctl. > > So let's fix up the cpu values after KVM has written its values to the > 3.2.2 sysib. To be consistent We use the same code to retrieve the cpu "...consistent, we..." (fixed up while applying) > numbers as the STSI TCG code in target/s390x/misc_helper.c:HELPER(stsi). > > Signed-off-by: Janosch Frank <frankja@linux.ibm.com> > Reviewed-by: David Hildenbrand <david@redhat.com> > --- > > * Fixed commit message and add rev-by > * Calculating total_cpus from configured + reserved > > --- > target/s390x/kvm.c | 17 ++++++++++++++++- > 1 file changed, 16 insertions(+), 1 deletion(-) > > diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c > index 3630c15f45a48864..69881a0da0b31f72 100644 > --- a/target/s390x/kvm.c > +++ b/target/s390x/kvm.c > @@ -1819,8 +1819,10 @@ static int handle_tsch(S390CPU *cpu) > > static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar) > { > + const MachineState *ms = MACHINE(qdev_get_machine()); > + uint16_t conf_cpus = 0, reserved_cpus = 0; > SysIB_322 sysib; > - int del; > + int del, i; > > if (s390_is_pv()) { > s390_cpu_pv_mem_read(cpu, 0, &sysib, sizeof(sysib)); This is against s390-next; rebased and applied to s390-fixes (please double check). [I'm holding off rebasing s390-next on top of s390-fixes resp. master; I'll rather do that once after all pieces including the headers update are in place.]
diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index 3630c15f45a48864..69881a0da0b31f72 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -1819,8 +1819,10 @@ static int handle_tsch(S390CPU *cpu) static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar) { + const MachineState *ms = MACHINE(qdev_get_machine()); + uint16_t conf_cpus = 0, reserved_cpus = 0; SysIB_322 sysib; - int del; + int del, i; if (s390_is_pv()) { s390_cpu_pv_mem_read(cpu, 0, &sysib, sizeof(sysib)); @@ -1842,6 +1844,19 @@ static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar) memset(sysib.ext_names[del], 0, sizeof(sysib.ext_names[0]) * (sysib.count - del)); } + + /* count the cpus and split them into configured and reserved ones */ + for (i = 0; i < ms->possible_cpus->len; i++) { + if (ms->possible_cpus->cpus[i].cpu) { + conf_cpus++; + } else { + reserved_cpus++; + } + } + sysib.vm[0].total_cpus = conf_cpus + reserved_cpus; + sysib.vm[0].conf_cpus = conf_cpus; + sysib.vm[0].reserved_cpus = reserved_cpus; + /* Insert short machine name in EBCDIC, padded with blanks */ if (qemu_name) { memset(sysib.vm[0].name, 0x40, sizeof(sysib.vm[0].name));