On Tue, 5 Jul 2016 14:59:20 +1000 David Gibson <da...@gibson.dropbear.id.au> wrote:
> On Tue, Jul 05, 2016 at 10:12:51AM +0530, Bharata B Rao wrote: > > xics maintains an array of ICPState structures which is indexed > > by cpu_index. Change this to index the ICPState array by arch_id > > for pseries-2.7 onwards. This allows migration of guest to suceed > > when there are holes in cpu_index range due to CPU hot removal. > > > > Signed-off-by: Bharata B Rao <bhar...@linux.vnet.ibm.com> > > --- > > hw/intc/xics.c | 14 ++++++++++---- > > hw/intc/xics_kvm.c | 12 ++++++------ > > hw/intc/xics_spapr.c | 33 ++++++++++++++++++++++++++------- > > 3 files changed, 42 insertions(+), 17 deletions(-) > > > > diff --git a/hw/intc/xics.c b/hw/intc/xics.c > > index cd48f42..6b79a8e 100644 > > --- a/hw/intc/xics.c > > +++ b/hw/intc/xics.c > > @@ -50,9 +50,12 @@ int xics_get_cpu_index_by_dt_id(int cpu_dt_id) > > void xics_cpu_destroy(XICSState *xics, PowerPCCPU *cpu) > > { > > CPUState *cs = CPU(cpu); > > - ICPState *ss = &xics->ss[cs->cpu_index]; > > + CPUClass *cc = CPU_GET_CLASS(cs); > > + int server = cs->prefer_arch_id_over_cpu_index ? > > cc->get_arch_id(cs) : > > + cs->cpu_index; > > Requiring this conditional in all the callsites is pretty ugly. I'd > prefer to see a get_arch_id() helper that implements this fallback > internally. A cpu can look at prefer_arch_id_over_cpu_index and switch behavior of get_arch_id() internally. > > > + ICPState *ss = &xics->ss[server]; > > > > - assert(cs->cpu_index < xics->nr_servers); > > + assert(server < xics->nr_servers); > > assert(cs == ss->cs); > > > > ss->output = NULL; > > @@ -63,10 +66,13 @@ void xics_cpu_setup(XICSState *xics, PowerPCCPU > > *cpu) { > > CPUState *cs = CPU(cpu); > > CPUPPCState *env = &cpu->env; > > - ICPState *ss = &xics->ss[cs->cpu_index]; > > + CPUClass *cc = CPU_GET_CLASS(cs); > > + int server = cs->prefer_arch_id_over_cpu_index ? > > cc->get_arch_id(cs) : > > + cs->cpu_index; > > + ICPState *ss = &xics->ss[server]; > > XICSStateClass *info = XICS_COMMON_GET_CLASS(xics); > > > > - assert(cs->cpu_index < xics->nr_servers); > > + assert(server < xics->nr_servers); > > > > ss->cs = cs; > > > > diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c > > index edbd62f..2610458 100644 > > --- a/hw/intc/xics_kvm.c > > +++ b/hw/intc/xics_kvm.c > > @@ -326,14 +326,14 @@ static const TypeInfo ics_kvm_info = { > > */ > > static void xics_kvm_cpu_setup(XICSState *xics, PowerPCCPU *cpu) > > { > > - CPUState *cs; > > - ICPState *ss; > > + CPUState *cs = CPU(cpu); > > KVMXICSState *xicskvm = XICS_SPAPR_KVM(xics); > > + CPUClass *cc = CPU_GET_CLASS(cs); > > + int server = cs->prefer_arch_id_over_cpu_index ? > > cc->get_arch_id(cs) : > > + cs->cpu_index; > > + ICPState *ss = ss = &xics->ss[server]; > > > > - cs = CPU(cpu); > > - ss = &xics->ss[cs->cpu_index]; > > - > > - assert(cs->cpu_index < xics->nr_servers); > > + assert(server < xics->nr_servers); > > if (xicskvm->kernel_xics_fd == -1) { > > abort(); > > } > > diff --git a/hw/intc/xics_spapr.c b/hw/intc/xics_spapr.c > > index 618826d..fbc8205 100644 > > --- a/hw/intc/xics_spapr.c > > +++ b/hw/intc/xics_spapr.c > > @@ -43,16 +43,21 @@ static target_ulong h_cppr(PowerPCCPU *cpu, > > sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) > > { > > CPUState *cs = CPU(cpu); > > + CPUClass *cc = CPU_GET_CLASS(cs); > > + int server = cs->prefer_arch_id_over_cpu_index ? > > cc->get_arch_id(cs) : > > + cs->cpu_index; > > target_ulong cppr = args[0]; > > > > - icp_set_cppr(spapr->xics, cs->cpu_index, cppr); > > + icp_set_cppr(spapr->xics, server, cppr); > > return H_SUCCESS; > > } > > > > static target_ulong h_ipi(PowerPCCPU *cpu, sPAPRMachineState > > *spapr, target_ulong opcode, target_ulong *args) > > { > > - target_ulong server = xics_get_cpu_index_by_dt_id(args[0]); > > + CPUState *cs = CPU(cpu); > > + target_ulong server = cs->prefer_arch_id_over_cpu_index ? > > args[0] : > > + xics_get_cpu_index_by_dt_id(args[0]); > > target_ulong mfrr = args[1]; > > > > if (server >= spapr->xics->nr_servers) { > > @@ -67,7 +72,10 @@ static target_ulong h_xirr(PowerPCCPU *cpu, > > sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) > > { > > CPUState *cs = CPU(cpu); > > - uint32_t xirr = icp_accept(spapr->xics->ss + cs->cpu_index); > > + CPUClass *cc = CPU_GET_CLASS(cs); > > + int server = cs->prefer_arch_id_over_cpu_index ? > > cc->get_arch_id(cs) : > > + cs->cpu_index; > > + uint32_t xirr = icp_accept(spapr->xics->ss + server); > > > > args[0] = xirr; > > return H_SUCCESS; > > @@ -77,7 +85,10 @@ static target_ulong h_xirr_x(PowerPCCPU *cpu, > > sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) > > { > > CPUState *cs = CPU(cpu); > > - ICPState *ss = &spapr->xics->ss[cs->cpu_index]; > > + CPUClass *cc = CPU_GET_CLASS(cs); > > + int server = cs->prefer_arch_id_over_cpu_index ? > > cc->get_arch_id(cs) : > > + cs->cpu_index; > > + ICPState *ss = &spapr->xics->ss[server]; > > uint32_t xirr = icp_accept(ss); > > > > args[0] = xirr; > > @@ -89,9 +100,12 @@ static target_ulong h_eoi(PowerPCCPU *cpu, > > sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) > > { > > CPUState *cs = CPU(cpu); > > + CPUClass *cc = CPU_GET_CLASS(cs); > > + int server = cs->prefer_arch_id_over_cpu_index ? > > cc->get_arch_id(cs) : > > + cs->cpu_index; > > target_ulong xirr = args[0]; > > > > - icp_eoi(spapr->xics, cs->cpu_index, xirr); > > + icp_eoi(spapr->xics, server, xirr); > > return H_SUCCESS; > > } > > > > @@ -99,8 +113,11 @@ static target_ulong h_ipoll(PowerPCCPU *cpu, > > sPAPRMachineState *spapr, target_ulong opcode, target_ulong *args) > > { > > CPUState *cs = CPU(cpu); > > + CPUClass *cc = CPU_GET_CLASS(cs); > > + int server = cs->prefer_arch_id_over_cpu_index ? > > cc->get_arch_id(cs) : > > + cs->cpu_index; > > uint32_t mfrr; > > - uint32_t xirr = icp_ipoll(spapr->xics->ss + cs->cpu_index, > > &mfrr); > > + uint32_t xirr = icp_ipoll(spapr->xics->ss + server, &mfrr); > > > > args[0] = xirr; > > args[1] = mfrr; > > @@ -113,6 +130,7 @@ static void rtas_set_xive(PowerPCCPU *cpu, > > sPAPRMachineState *spapr, uint32_t nargs, target_ulong args, > > uint32_t nret, target_ulong rets) > > { > > + CPUState *cs = CPU(cpu); > > ICSState *ics = spapr->xics->ics; > > uint32_t nr, server, priority; > > > > @@ -122,7 +140,8 @@ static void rtas_set_xive(PowerPCCPU *cpu, > > sPAPRMachineState *spapr, } > > > > nr = rtas_ld(args, 0); > > - server = xics_get_cpu_index_by_dt_id(rtas_ld(args, 1)); > > + server = cs->prefer_arch_id_over_cpu_index ? rtas_ld(args, 1) : > > + xics_get_cpu_index_by_dt_id(rtas_ld(args, 1)); > > priority = rtas_ld(args, 2); > > > > if (!ics_valid_irq(ics, nr) || (server >= > > ics->xics->nr_servers) >