[PATCH v2 3/4] KVM: arm64: vgic: Tear down what vgic_init() created when it fails

Fuad Tabba fuad.tabba at linux.dev
Tue Aug 25 02:47:41 PDT 2026


Hi Yuan,

On Tue, 25 Aug 2026 at 10:18, Yao Yuan <yaoyuan at linux.alibaba.com> wrote:
...
> > diff --git a/arch/arm64/kvm/vgic/vgic-init.c b/arch/arm64/kvm/vgic/vgic-init.c
> > index 4012df6002ea6..7493fded53acc 100644
> > --- a/arch/arm64/kvm/vgic/vgic-init.c
> > +++ b/arch/arm64/kvm/vgic/vgic-init.c
> > @@ -462,7 +462,7 @@ int vgic_init(struct kvm *kvm)
> >               if (vgic_supports_direct_irqs(kvm)) {
> >                       ret = vgic_v4_init(kvm);
> >                       if (ret)
>
> Hi Tabba,
>
> > -                             return ret;
> > +                             goto out_teardown;
>
> The vigc_v4_init already called vgic_v4_teardown() in error path,
> thus I think just free dist->spis is enough yet ?

vgic_v4_init() unwinds its own state on every error return, so
vgic_v4_teardown() is a no-op there and freeing the SPI array would be
enough. I'll fold the label split in if I respin.

Thanks for the reviews!
/fuad

>
> >               }
> >       } else {
> >               ret = vgic_v5_init(kvm);
> > @@ -475,12 +475,19 @@ int vgic_init(struct kvm *kvm)
> >
> >       ret = kvm_vgic_setup_default_irq_routing(kvm);
> >       if (ret)
> > -             return ret;
> > +             goto out_teardown;
> >
> >       vgic_debug_init(kvm);
> >       dist->initialized = true;
> >
> >       return 0;
> > +
> > +out_teardown:
> > +     vgic_v4_teardown(kvm);
> > +     kfree(dist->spis);
> > +     dist->spis = NULL;
> > +
> > +     return ret;
> >  }
> >
> >  static void kvm_vgic_dist_destroy(struct kvm *kvm)
> > --
> > 2.39.5
> >



More information about the linux-arm-kernel mailing list