On Mon, Nov 25, 2019 at 07:58:04AM +0100, Cédric Le Goater wrote: > CPU_FOREACH() loops on all the CPUs of the machine which is incorrect. > Each XIVE Presenter should scan only the HW threads of the chip it > belongs to. > > Signed-off-by: Cédric Le Goater > Reviewed-by: Greg Kurz > Signed-off-by: Cédric Le Goater Patches 1..4 applied to ppc-for-5.0. > --- > hw/intc/pnv_xive.c | 61 ++++++++++++++++++++++++++-------------------- > 1 file changed, 35 insertions(+), 26 deletions(-) > > diff --git a/hw/intc/pnv_xive.c b/hw/intc/pnv_xive.c > index 8055de89cf63..9798bd9e729f 100644 > --- a/hw/intc/pnv_xive.c > +++ b/hw/intc/pnv_xive.c > @@ -377,34 +377,43 @@ static int pnv_xive_match_nvt(XivePresenter *xptr, uint8_t format, > bool cam_ignore, uint8_t priority, > uint32_t logic_serv, XiveTCTXMatch *match) > { > - CPUState *cs; > + PnvXive *xive = PNV_XIVE(xptr); > + PnvChip *chip = xive->chip; > int count = 0; > - > - CPU_FOREACH(cs) { > - PowerPCCPU *cpu = POWERPC_CPU(cs); > - XiveTCTX *tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc); > - int ring; > - > - /* > - * Check the thread context CAM lines and record matches. > - */ > - ring = xive_presenter_tctx_match(xptr, tctx, format, nvt_blk, nvt_idx, > - cam_ignore, logic_serv); > - /* > - * Save the context and follow on to catch duplicates, that we > - * don't support yet. > - */ > - if (ring != -1) { > - if (match->tctx) { > - qemu_log_mask(LOG_GUEST_ERROR, "XIVE: already found a " > - "thread context NVT %x/%x\n", > - nvt_blk, nvt_idx); > - return -1; > + int i, j; > + > + for (i = 0; i < chip->nr_cores; i++) { > + PnvCore *pc = chip->cores[i]; > + CPUCore *cc = CPU_CORE(pc); > + > + for (j = 0; j < cc->nr_threads; j++) { > + PowerPCCPU *cpu = pc->threads[j]; > + XiveTCTX *tctx; > + int ring; > + > + tctx = XIVE_TCTX(pnv_cpu_state(cpu)->intc); > + > + /* > + * Check the thread context CAM lines and record matches. > + */ > + ring = xive_presenter_tctx_match(xptr, tctx, format, nvt_blk, > + nvt_idx, cam_ignore, logic_serv); > + /* > + * Save the context and follow on to catch duplicates, that we > + * don't support yet. > + */ > + if (ring != -1) { > + if (match->tctx) { > + qemu_log_mask(LOG_GUEST_ERROR, "XIVE: already found a " > + "thread context NVT %x/%x\n", > + nvt_blk, nvt_idx); > + return -1; > + } > + > + match->ring = ring; > + match->tctx = tctx; > + count++; > } > - > - match->ring = ring; > - match->tctx = tctx; > - count++; > } > } > -- 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