Re: [PATCH v4 01/48] irqchip/gic-v5: Allow KVM setup without a maintenance IRQ

Sascha Bischoff <[email protected]> Fri, 31 Jul 2026 09:20:20 +0000
Newsgroups dev.linux.lists.sashiko-reviews,dev.linux.lists.kvmarm,org.kernel.vger.kvm
Message-ID <[email protected]>
On Fri, 2026-07-24 at 11:21 +0000, [email protected] wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential
> issue(s) to consider:
> - [Medium] Exposing a latent memory leak of `gic_kvm_info` in KVM's
> initialization error path when a required maintenance IRQ is absent
> on GICv5 legacy-capable systems.
> --
> 
> --- Patch [1]: [PATCH v4 01/48] irqchip/gic-v5: Allow KVM setup
> without a maintenance IRQ ---
> commit 4a1c6e5108caaddf8c492f48ac4cb4568ab60c52
> Author: Sascha Bischoff <[email protected]>
> 
> irqchip/gic-v5: Allow KVM setup without a maintenance IRQ
> 
> This commit modifies the GICv5 initialization to no longer reject KVM
> setup
> solely due to a missing maintenance interrupt. Instead, it delegates
> this
> validation to KVM by passing a specific configuration flag based on
> legacy
> support capabilities.
> 
> > diff --git a/drivers/irqchip/irq-gic-v5.c b/drivers/irqchip/irq-
> > gic-v5.c
> > index e9d1795235a66..c04523a438cee 100644
> > --- a/drivers/irqchip/irq-gic-v5.c
> > +++ b/drivers/irqchip/irq-gic-v5.c
> > @@ -1143,10 +1143,18 @@ static void __init
> > gic_of_setup_kvm_info(struct device_node *node)
> >  	/* GIC Virtual CPU interface maintenance interrupt */
> >  	gic_v5_kvm_info.no_maint_irq_mask = false;
> >  	gic_v5_kvm_info.maint_irq = irq_of_parse_and_map(node, 0);
> > -	if (!gic_v5_kvm_info.maint_irq) {
> > -		pr_warn("cannot find GICv5 virtual CPU interface
> > maintenance interrupt\n");
> > -		return;
> > -	}
> > +
> > +	/*
> > +	 * We require an MI if we have legacy support, but don't,
> > otherwise.
> > +	 * Given that there's an existing flag to convey that an
> > MI isn't
> > +	 * needed, we (ab)use it to tell KVM that the MI isn't
> > needed if we
> > +	 * don't support legacy.
> > +	 *
> > +	 * The check for ARM64_HAS_GICV5_LEGACY explicitly doesn't
> > use
> > +	 * cpus_have_final_cap() here as we run too early.
> > +	 */
> > +	if (!cpus_have_cap(ARM64_HAS_GICV5_LEGACY) &&
> > !gic_v5_kvm_info.maint_irq)
> > +		gic_v5_kvm_info.no_maint_irq_mask = true;
> >  
> >  	vgic_set_kvm_info(&gic_v5_kvm_info);
> 
> [Severity: Medium]
> By removing the early return here, does this expose a memory leak in
> KVM's
> initialization error path?
> 
> If a system has ARM64_HAS_GICV5_LEGACY support but the maintenance
> interrupt
> is missing, we now pass no_maint_irq_mask = false and maint_irq = 0
> to
> vgic_set_kvm_info() in drivers/irqchip/irq-gic-
> v5.c:gic_of_setup_kvm_info().
> 
> When this configuration reaches KVM:
> 
> arch/arm64/kvm/vgic/vgic-init.c:kvm_vgic_hyp_init() {
>     ...
>     if (has_mask && !gic_kvm_info->maint_irq) {
>         kvm_err("No vgic maintenance irq\n");
>         return -ENXIO;
>     }
>     ...
> }
> 
> It looks like kvm_vgic_hyp_init() returns -ENXIO without freeing the
> dynamically allocated gic_kvm_info structure, causing a memory leak.

We've previously discussed this exact issue as you raised it last time.
This is the way that the existing code works for a GICv3 system too.
For the time being this is fine. I intend on posting a follow up patch
at some point to clean things up, but that is not included with this
series as it simply does not belong here.

Thanks,
Sascha

> 
> >  }
>