On Fri, 8 Nov 2019 16:40:35 +0100 Laurent Vivier <lviv...@redhat.com> wrote:
> Commit 29cb4187497d sets by default the VSMT to smp_threads, > but older kernels (< 4.13) don't support that. > > We can reasonably restore previous behavior with this kernel > to allow to run QEMU as before. > > If VSMT is not supported, VSMT will be set to MAX(8, smp_threads) > as it is done for previous machine types (< pseries-4.2) > It is usually _bad_ to base the machine behavior on host capabilities. What happens if we migrate between an older kernel and a recent one ? I understand this is to fix tests/migration-test on older kernels. Couldn't this be achieved with migration-test doing some introspection and maybe pass vsmt=8 on the QEMU command line ? > Fixes: 29cb4187497d ("spapr: Set VSMT to smp_threads by default") > Cc: gr...@kaod.org > Reported-by: Lukáš Doktor <ldok...@redhat.com> > Signed-off-by: Laurent Vivier <lviv...@redhat.com> > --- > hw/ppc/spapr.c | 2 +- > target/ppc/kvm.c | 5 +++++ > target/ppc/kvm_ppc.h | 6 ++++++ > 3 files changed, 12 insertions(+), 1 deletion(-) > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 94f9d27096af..f6c8ad1eda32 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -2522,7 +2522,7 @@ static void spapr_set_vsmt_mode(SpaprMachineState > *spapr, Error **errp) > goto out; > } > /* In this case, spapr->vsmt has been set by the command line */ > - } else if (!smc->smp_threads_vsmt) { > + } else if (!smc->smp_threads_vsmt || !kvmppc_check_smt_possible()) { > /* > * Default VSMT value is tricky, because we need it to be as > * consistent as possible (for migration), but this requires > diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c > index 7d2e8969ac5f..40ed59881167 100644 > --- a/target/ppc/kvm.c > +++ b/target/ppc/kvm.c > @@ -2060,6 +2060,11 @@ void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int > mpic_proxy) > } > } > > +bool kvmppc_check_smt_possible(void) > +{ > + return kvm_enabled() && cap_ppc_smt_possible; > +} > + > int kvmppc_smt_threads(void) > { > return cap_ppc_smt ? cap_ppc_smt : 1; > diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h > index 98bd7d5da6d6..c9629a416b0b 100644 > --- a/target/ppc/kvm_ppc.h > +++ b/target/ppc/kvm_ppc.h > @@ -27,6 +27,7 @@ void kvmppc_enable_h_page_init(void); > void kvmppc_set_papr(PowerPCCPU *cpu); > int kvmppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr); > void kvmppc_set_mpic_proxy(PowerPCCPU *cpu, int mpic_proxy); > +bool kvmppc_check_smt_possible(void); > int kvmppc_smt_threads(void); > void kvmppc_hint_smt_possible(Error **errp); > int kvmppc_set_smt_threads(int smt); > @@ -159,6 +160,11 @@ static inline void kvmppc_set_mpic_proxy(PowerPCCPU > *cpu, int mpic_proxy) > { > } > > +static inline bool kvmppc_check_smt_possible(void) > +{ > + return false; > +} > + > static inline int kvmppc_smt_threads(void) > { > return 1;