Message ID | 20180813163859.17964-3-cota@braap.org |
---|---|
State | New |
Headers | show |
Series | convert CPU list to RCU | expand |
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 <cota@braap.org> Acked-by: David Gibson <david@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);
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);
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 <cota@braap.org> --- hw/ppc/spapr.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-)