On Fri, Nov 04, 2016 at 02:37:18PM +1100, Alexey Kardashevskiy wrote:
> On 30/10/16 22:11, David Gibson wrote:
> > To continue consolidation of compatibility mode information, this rewrites
> > the ppc_get_compat_smt_threads() function using the table of compatiblity
> > modes in target-ppc/compat.c.
> > 
> > It's not a direct replacement, the new ppc_compat_max_threads() function
> > has simpler semantics - it just returns the number of threads the cpu
> > model has, taking into account any compatiblity mode it is in.
> > 
> > This no longer takes into account kvmppc_smt_threads() as the previous
> > version did.  That check wasn't useful because we check elsewhere that
> 
> Nit: s/elsewhere/in ppc_cpu_realizefn()/

Changed.

> 
> 
> Reviewed-by: Alexey Kardashevskiy <a...@ozlabs.ru>
> 
> 
> 
> 
> > CPUs aren't instantiated with more threads than kvm allows (or if we didn't
> > things will already be broken and this won't make it any worse).
> > 
> > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
> > ---
> >  hw/ppc/spapr.c              |  8 ++++----
> >  target-ppc/compat.c         | 18 ++++++++++++++++++
> >  target-ppc/cpu.h            |  2 +-
> >  target-ppc/translate_init.c | 20 --------------------
> >  4 files changed, 23 insertions(+), 25 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index 276cefa..6c78889 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -207,6 +207,7 @@ static int spapr_fixup_cpu_dt(void *fdt, 
> > sPAPRMachineState *spapr)
> >          PowerPCCPU *cpu = POWERPC_CPU(cs);
> >          DeviceClass *dc = DEVICE_GET_CLASS(cs);
> >          int index = ppc_get_vcpu_dt_id(cpu);
> > +        int compat_smt = MIN(smp_threads, ppc_compat_max_threads(cpu));
> >  
> >          if ((index % smt) != 0) {
> >              continue;
> > @@ -241,8 +242,7 @@ static int spapr_fixup_cpu_dt(void *fdt, 
> > sPAPRMachineState *spapr)
> >              return ret;
> >          }
> >  
> > -        ret = spapr_fixup_cpu_smt_dt(fdt, offset, cpu,
> > -                                     ppc_get_compat_smt_threads(cpu));
> > +        ret = spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt);
> >          if (ret < 0) {
> >              return ret;
> >          }
> > @@ -408,6 +408,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void 
> > *fdt, int offset,
> >      size_t page_sizes_prop_size;
> >      uint32_t vcpus_per_socket = smp_threads * smp_cores;
> >      uint32_t pft_size_prop[] = {0, cpu_to_be32(spapr->htab_shift)};
> > +    int compat_smt = MIN(smp_threads, ppc_compat_max_threads(cpu));
> >      sPAPRDRConnector *drc;
> >      sPAPRDRConnectorClass *drck;
> >      int drc_index;
> > @@ -495,8 +496,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void 
> > *fdt, int offset,
> >  
> >      _FDT(spapr_fixup_cpu_numa_dt(fdt, offset, cs));
> >  
> > -    _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu,
> > -                                ppc_get_compat_smt_threads(cpu)));
> > +    _FDT(spapr_fixup_cpu_smt_dt(fdt, offset, cpu, compat_smt));
> >  }
> >  
> >  static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState 
> > *spapr)
> > diff --git a/target-ppc/compat.c b/target-ppc/compat.c
> > index f3fd9c6..66529a6 100644
> > --- a/target-ppc/compat.c
> > +++ b/target-ppc/compat.c
> > @@ -28,6 +28,7 @@
> >  typedef struct {
> >      uint32_t pvr;
> >      uint64_t pcr;
> > +    int max_threads;
> >  } CompatInfo;
> >  
> >  static const CompatInfo compat_table[] = {
> > @@ -35,18 +36,22 @@ static const CompatInfo compat_table[] = {
> >          .pvr = CPU_POWERPC_LOGICAL_2_05,
> >          .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_COMPAT_2_05
> >                 | PCR_TM_DIS | PCR_VSX_DIS,
> > +        .max_threads = 2,
> >      },
> >      { /* POWER7, ISA2.06 */
> >          .pvr = CPU_POWERPC_LOGICAL_2_06,
> >          .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_TM_DIS,
> > +        .max_threads = 4,
> >      },
> >      {
> >          .pvr = CPU_POWERPC_LOGICAL_2_06_PLUS,
> >          .pcr = PCR_COMPAT_2_07 | PCR_COMPAT_2_06 | PCR_TM_DIS,
> > +        .max_threads = 4,
> >      },
> >      { /* POWER8, ISA2.07 */
> >          .pvr = CPU_POWERPC_LOGICAL_2_07,
> >          .pcr = PCR_COMPAT_2_07,
> > +        .max_threads = 8,
> >      },
> >  };
> >  
> > @@ -89,3 +94,16 @@ void ppc_set_compat(PowerPCCPU *cpu, uint32_t 
> > compat_pvr, Error **errp)
> >          }
> >      }
> >  }
> > +
> > +int ppc_compat_max_threads(PowerPCCPU *cpu)
> > +{
> > +    const CompatInfo *compat = compat_by_pvr(cpu->compat_pvr);
> > +    int n_threads = CPU(cpu)->nr_threads;
> > +
> > +    if (cpu->compat_pvr) {
> > +        g_assert(compat);
> > +        n_threads = MIN(n_threads, compat->max_threads);
> > +    }
> > +
> > +    return n_threads;
> > +}
> > diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
> > index 15d5e4b..cfda7b2 100644
> > --- a/target-ppc/cpu.h
> > +++ b/target-ppc/cpu.h
> > @@ -1241,7 +1241,6 @@ void ppc_store_sdr1 (CPUPPCState *env, target_ulong 
> > value);
> >  void ppc_store_msr (CPUPPCState *env, target_ulong value);
> >  
> >  void ppc_cpu_list (FILE *f, fprintf_function cpu_fprintf);
> > -int ppc_get_compat_smt_threads(PowerPCCPU *cpu);
> >  #if defined(TARGET_PPC64)
> >  #endif
> >  
> > @@ -1316,6 +1315,7 @@ static inline int cpu_mmu_index (CPUPPCState *env, 
> > bool ifetch)
> >  /* Compatibility modes */
> >  #if defined(TARGET_PPC64)
> >  void ppc_set_compat(PowerPCCPU *cpu, uint32_t compat_pvr, Error **errp);
> > +int ppc_compat_max_threads(PowerPCCPU *cpu);
> >  #endif /* defined(TARGET_PPC64) */
> >  
> >  #include "exec/cpu-all.h"
> > diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
> > index a70eafb..ba48242 100644
> > --- a/target-ppc/translate_init.c
> > +++ b/target-ppc/translate_init.c
> > @@ -9952,26 +9952,6 @@ static void ppc_cpu_unrealizefn(DeviceState *dev, 
> > Error **errp)
> >      }
> >  }
> >  
> > -int ppc_get_compat_smt_threads(PowerPCCPU *cpu)
> > -{
> > -    CPUState *cs = CPU(cpu);
> > -    int ret = MIN(cs->nr_threads, kvmppc_smt_threads());
> > -
> > -    switch (cpu->compat_pvr) {
> > -    case CPU_POWERPC_LOGICAL_2_05:
> > -        ret = MIN(ret, 2);
> > -        break;
> > -    case CPU_POWERPC_LOGICAL_2_06:
> > -        ret = MIN(ret, 4);
> > -        break;
> > -    case CPU_POWERPC_LOGICAL_2_07:
> > -        ret = MIN(ret, 8);
> > -        break;
> > -    }
> > -
> > -    return ret;
> > -}
> > -
> >  static gint ppc_cpu_compare_class_pvr(gconstpointer a, gconstpointer b)
> >  {
> >      ObjectClass *oc = (ObjectClass *)a;
> > 
> 
> 

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature

Reply via email to