On Wed, 4 Dec 2019 10:00:45 +0100 Janosch Frank <fran...@linux.ibm.com> wrote:
> On 12/3/19 6:44 PM, Cornelia Huck wrote: > > On Tue, 3 Dec 2019 08:28:11 -0500 > > Janosch Frank <fran...@linux.ibm.com> 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 <fran...@linux.ibm.com> > >> Reviewed-by: Thomas Huth <th...@redhat.com> > >> Acked-by: David Hildenbrand <da...@redhat.com> > >> --- > >> 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 Fair enough, let's keep them for now and revisit this later. > > > > >> + * 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); > >> + } > >> +} > > > >
pgpHZKd3FGrTB.pgp
Description: OpenPGP digital signature