Re: [PATCH v4 11/18] KVM: arm64: selftests: Add basic GICv3 support

From: Raghavendra Rao Ananta
Date: Thu Sep 09 2021 - 12:39:14 EST


On Wed, Sep 8, 2021 at 10:18 PM Oliver Upton <oupton@xxxxxxxxxx> wrote:
>
> On Thu, Sep 09, 2021 at 01:38:11AM +0000, Raghavendra Rao Ananta wrote:
> > Add basic support for ARM Generic Interrupt Controller v3.
> > The support provides guests to setup interrupts.
> >
> > The work is inspired from kvm-unit-tests and the kernel's
> > GIC driver (drivers/irqchip/irq-gic-v3.c).
> >
> > Signed-off-by: Raghavendra Rao Ananta <rananta@xxxxxxxxxx>
> > Reviewed-by: Andrew Jones <drjones@xxxxxxxxxx>
> > ---
> > tools/testing/selftests/kvm/Makefile | 2 +-
> > .../selftests/kvm/include/aarch64/gic.h | 21 ++
> > tools/testing/selftests/kvm/lib/aarch64/gic.c | 93 +++++++
> > .../selftests/kvm/lib/aarch64/gic_private.h | 21 ++
> > .../selftests/kvm/lib/aarch64/gic_v3.c | 240 ++++++++++++++++++
> > .../selftests/kvm/lib/aarch64/gic_v3.h | 70 +++++
> > 6 files changed, 446 insertions(+), 1 deletion(-)
> > create mode 100644 tools/testing/selftests/kvm/include/aarch64/gic.h
> > create mode 100644 tools/testing/selftests/kvm/lib/aarch64/gic.c
> > create mode 100644 tools/testing/selftests/kvm/lib/aarch64/gic_private.h
> > create mode 100644 tools/testing/selftests/kvm/lib/aarch64/gic_v3.c
> > create mode 100644 tools/testing/selftests/kvm/lib/aarch64/gic_v3.h
> >
>
> [...]
>
> > +static void
> > +gic_dist_init(enum gic_type type, unsigned int nr_cpus, void *dist_base)
> > +{
> > + const struct gic_common_ops *gic_ops;
>
> does this need to be initialized? I haven't tried compiling, but it
> seems it should trigger a compiler warning as it is only initialized if
> type == GIC_V3.
>
Huh, I thought I had a default case covering this (must have gone lost
during code reorg).
Nice catch though! Surprisingly, the compiler never warned. I'm not
sure if its smart
enough to figure out that the caller of this function had
GUEST_ASSERT(type < GIC_TYPE_MAX);
Anyway, I'll clean it up.

Regards,
Raghavendra

> > + spin_lock(&gic_lock);
> > +
> > + /* Distributor initialization is needed only once per VM */
> > + if (gic_common_ops) {
> > + spin_unlock(&gic_lock);
> > + return;
> > + }
> > +
> > + if (type == GIC_V3)
> > + gic_ops = &gicv3_ops;
> > +
> > + gic_ops->gic_init(nr_cpus, dist_base);
> > + gic_common_ops = gic_ops;
> > +
> > + /* Make sure that the initialized data is visible to all the vCPUs */
> > + dsb(sy);
> > +
> > + spin_unlock(&gic_lock);
> > +}
>