On Tue, Sep 04, 2018 at 03:29:26PM +0200, Christoffer Dall wrote: > On Tue, Sep 04, 2018 at 10:13:36AM +0200, Andrew Jones wrote: > > We need to support at least two redistributor regions in order to > > support more than 123 vcpus (we select 8 because that should be > > plenty). Also bump NR_CPUS to 512, since that's what KVM currently > > supports. > > > > Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx> > > --- > > v2: > > - Peter asked if it would be neater to be more general. At first > > I interpreted that as better, i.e. more general, but immediately > > after starting the approach I saw how much _neater_ the code is. > > So this version is indeed neater code and better (more general). > > Thanks Peter! > > > > > > lib/arm/asm/gic-v3.h | 3 +++ > > lib/arm/asm/setup.h | 2 +- > > lib/arm/gic-v3.c | 23 +++++++++++++---------- > > lib/arm/gic.c | 14 +++++++++----- > > 4 files changed, 26 insertions(+), 16 deletions(-) > > > > diff --git a/lib/arm/asm/gic-v3.h b/lib/arm/asm/gic-v3.h > > index 1dceb9541f62..347be2f9da17 100644 > > --- a/lib/arm/asm/gic-v3.h > > +++ b/lib/arm/asm/gic-v3.h > > @@ -49,8 +49,11 @@ > > #include <asm/smp.h> > > #include <asm/io.h> > > > > +#define GICV3_NR_REDISTS 8 > > + > > struct gicv3_data { > > void *dist_base; > > + void *redist_bases[GICV3_NR_REDISTS]; > > void *redist_base[NR_CPUS]; > > unsigned int irq_nr; > > }; > > diff --git a/lib/arm/asm/setup.h b/lib/arm/asm/setup.h > > index b57ea13b9dd2..3215814603e4 100644 > > --- a/lib/arm/asm/setup.h > > +++ b/lib/arm/asm/setup.h > > @@ -9,7 +9,7 @@ > > #include <asm/page.h> > > #include <asm/pgtable-hwdef.h> > > > > -#define NR_CPUS 255 > > +#define NR_CPUS 512 > > extern u64 cpus[NR_CPUS]; /* per-cpu IDs (MPIDRs) */ > > extern int nr_cpus; > > > > diff --git a/lib/arm/gic-v3.c b/lib/arm/gic-v3.c > > index 9b3fa5730478..7f41e0a1da01 100644 > > --- a/lib/arm/gic-v3.c > > +++ b/lib/arm/gic-v3.c > > @@ -9,17 +9,20 @@ > > void gicv3_set_redist_base(size_t stride) > > { > > u32 aff = mpidr_compress(get_mpidr()); > > - void *ptr = gicv3_data.redist_base[0]; > > u64 typer; > > - > > - do { > > - typer = gicv3_read_typer(ptr + GICR_TYPER); > > - if ((typer >> 32) == aff) { > > - gicv3_redist_base() = ptr; > > - return; > > - } > > - ptr += stride; /* skip RD_base, SGI_base, etc. */ > > - } while (!(typer & GICR_TYPER_LAST)); > > + int i = 0; > > + > > + while (gicv3_data.redist_bases[i]) { > > I don't get this. We never change I? > > (conincidentally, my test of gicv3-ipi never completes, I wonder if > these concepts are related...) Darn it. I dropped the '++i' I had in v1. My regression testing naturally only needs i=0 (I don't have anything with > 123 cpus to test on), so the problem didn't show up for me. Maybe you can add a ++i in and see if it works for you before I send v3? If it's still busted I'll have to stop shotgunning code, and maybe even find a way to test it myself. Thanks, drew _______________________________________________ kvmarm mailing list kvmarm@xxxxxxxxxxxxxxxxxxxxx https://lists.cs.columbia.edu/mailman/listinfo/kvmarm