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) 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; -- 2.21.0