Greg Kurz's on July 18, 2019 3:00 am: > On Wed, 17 Jul 2019 15:39:51 +1000 > Nicholas Piggin <npig...@gmail.com> wrote: > >> This does not do directed yielding and is not quite as strict as PAPR >> specifies in terms of precise dispatch behaviour. This generally will >> mean suboptimal performance, rather than guest misbehaviour. Linux >> does not rely on exact dispatch behaviour. >> >> Signed-off-by: Nicholas Piggin <npig...@gmail.com> >> --- > > LGTM. > > Reviewed-by: Greg Kurz <gr...@kaod.org> > > Just two minor comments, see below. > >> Changes since v4: >> - Style, added justification comments, spelling. >> - Fixed trying to dereference spapr_cpu for a -1 target. >> >> hw/ppc/spapr_hcall.c | 68 ++++++++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 68 insertions(+) >> >> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c >> index 8b208ab259..5e655172b2 100644 >> --- a/hw/ppc/spapr_hcall.c >> +++ b/hw/ppc/spapr_hcall.c >> @@ -1069,6 +1069,73 @@ static target_ulong h_cede(PowerPCCPU *cpu, >> SpaprMachineState *spapr, >> return H_SUCCESS; >> } >> >> +static target_ulong h_confer(PowerPCCPU *cpu, SpaprMachineState *spapr, >> + target_ulong opcode, target_ulong *args) >> +{ >> + target_long target = args[0]; >> + uint32_t dispatch = args[1]; >> + CPUState *cs = CPU(cpu); >> + SpaprCpuState *spapr_cpu; >> + >> + /* >> + * -1 means confer to all other CPUs without dispatch counter check, >> + * otherwise it's a targeted confer. >> + */ >> + if (target != -1) { >> + PowerPCCPU *target_cpu = spapr_find_cpu(target); >> + CPUState *target_cs = CPU(target_cpu); >> + unsigned int target_dispatch; > > Maybe make it uint32_t to be consistent with dispatch above, and this > is the actual return type of ldl_be_phys() ?
Sure okay. >> + >> + if (!target_cs) { > > This is the only user of target_cs, maybe drop it and use target_cpu > instead ? That probably works, I'll try. Thanks, Nick