On 12/3/19 6:44 PM, Cornelia Huck wrote: > On Tue, 3 Dec 2019 08:28:11 -0500 > Janosch Frank wrote: > >> Up to now we only had an ioctl to reset vcpu data QEMU couldn't reach >> for the initial reset, and that was also called for the clear >> reset. To be architecture compliant, we also need to clear local >> interrupts on a normal reset. >> >> Because of this and the upcoming protvirt support we need to add >> ioctls for the missing clear and normal resets. >> >> Signed-off-by: Janosch Frank >> Reviewed-by: Thomas Huth >> Acked-by: David Hildenbrand >> --- >> target/s390x/cpu.c | 16 +++++++++++++-- >> target/s390x/kvm-stub.c | 10 +++++++++- >> target/s390x/kvm.c | 42 ++++++++++++++++++++++++++++++++-------- >> target/s390x/kvm_s390x.h | 4 +++- >> 4 files changed, 60 insertions(+), 12 deletions(-) >> >> diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c >> index 829ce6ad54..4973365d6c 100644 >> --- a/target/s390x/cpu.c >> +++ b/target/s390x/cpu.c >> @@ -139,8 +139,20 @@ static void s390_cpu_reset(CPUState *s, cpu_reset_type type) >> } >> >> /* Reset state inside the kernel that we cannot access yet from QEMU. */ > > For the last iteration, I asked about the 'yet' here... I have not written those comments, I merely refuse to delete them :) We still reset some state in the kernel, I'm not sure how much of that is already exposed via ioctls to QEMU, so I won't remove the comment. > >> - if (kvm_enabled() && type != S390_CPU_RESET_NORMAL) { >> - kvm_s390_reset_vcpu(cpu); >> + if (kvm_enabled()) { >> + switch (type) { >> + case S390_CPU_RESET_CLEAR: >> + kvm_s390_reset_vcpu_clear(cpu); >> + break; >> + case S390_CPU_RESET_INITIAL: >> + kvm_s390_reset_vcpu_initial(cpu); >> + break; >> + case S390_CPU_RESET_NORMAL: >> + kvm_s390_reset_vcpu_normal(cpu); >> + break; >> + default: >> + g_assert_not_reached(); >> + } >> } >> } >> > > (...) > >> @@ -403,17 +405,41 @@ int kvm_arch_destroy_vcpu(CPUState *cs) >> return 0; >> } >> >> -void kvm_s390_reset_vcpu(S390CPU *cpu) >> +static void kvm_s390_reset_vcpu(S390CPU *cpu, unsigned long type) >> { >> CPUState *cs = CPU(cpu); >> >> - /* The initial reset call is needed here to reset in-kernel >> - * vcpu data that we can't access directly from QEMU >> - * (i.e. with older kernels which don't support sync_regs/ONE_REG). >> - * Before this ioctl cpu_synchronize_state() is called in common kvm >> - * code (kvm-all) */ >> - if (kvm_vcpu_ioctl(cs, KVM_S390_INITIAL_RESET, NULL)) { >> - error_report("Initial CPU reset failed on CPU %i", cs->cpu_index); >> + /* >> + * The reset call is needed here to reset in-kernel vcpu data that >> + * we can't access directly from QEMU (i.e. with older kernels >> + * which don't support sync_regs/ONE_REG). Before this ioctl > > ...and this reference to 'older kernels' here. > > Are the comments still correct/relevant? See above > >> + * cpu_synchronize_state() is called in common kvm code >> + * (kvm-all). >> + */ >> + if (kvm_vcpu_ioctl(cs, type)) { >> + error_report("CPU reset failed on CPU %i type %lx", >> + cs->cpu_index, type); >> + } >> +} >