On Mon, Aug 13, 2018 at 12:38:58PM -0400, Emilio G. Cota wrote: > This paves the way for implementing the CPU list with an RCU QLIST, > which cannot be traversed in reverse order. > > Note that this is the only caller of CPU_FOREACH_REVERSE. > > Signed-off-by: Emilio G. Cota <c...@braap.org>
Acked-by: David Gibson <da...@gibson.dropbear.id.au> > --- > hw/ppc/spapr.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > index 421b2dd09b..2ef5be2790 100644 > --- a/hw/ppc/spapr.c > +++ b/hw/ppc/spapr.c > @@ -622,9 +622,12 @@ static void spapr_populate_cpu_dt(CPUState *cs, void > *fdt, int offset, > > static void spapr_populate_cpus_dt_node(void *fdt, sPAPRMachineState *spapr) > { > + CPUState **rev; > CPUState *cs; > + int n_cpus; > int cpus_offset; > char *nodename; > + int i; > > cpus_offset = fdt_add_subnode(fdt, 0, "cpus"); > _FDT(cpus_offset); > @@ -635,8 +638,19 @@ static void spapr_populate_cpus_dt_node(void *fdt, > sPAPRMachineState *spapr) > * We walk the CPUs in reverse order to ensure that CPU DT nodes > * created by fdt_add_subnode() end up in the right order in FDT > * for the guest kernel the enumerate the CPUs correctly. > + * > + * The CPU list cannot be traversed in reverse order, so we need > + * to do extra work. > */ > - CPU_FOREACH_REVERSE(cs) { > + n_cpus = 0; > + rev = NULL; > + CPU_FOREACH(cs) { > + rev = g_renew(CPUState *, rev, n_cpus + 1); > + rev[n_cpus++] = cs; > + } > + > + for (i = n_cpus - 1; i >= 0; i--) { > + CPUState *cs = rev[i]; > PowerPCCPU *cpu = POWERPC_CPU(cs); > int index = spapr_get_vcpu_id(cpu); > DeviceClass *dc = DEVICE_GET_CLASS(cs); -- 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
signature.asc
Description: PGP signature